Move struct buildsym_compunit to buildsym.h
This moves struct buildsym_compunit to buildsym.h. Now that the members are private, and it no longer affects any global state in buildsym.c, an instance can be used directly for symtab creation. gdb/ChangeLog 2018-07-20 Tom Tromey <tom@tromey.com> * buildsym.h (struct buildsym_compunit): Move from buildsym.c. * buildsym.c (struct buildsym_compunit): Move to buildsym.h. (buildsym_compunit::buildsym_compunit) (buildsym_compunit::~buildsym_compunit) (buildsym_compunit::get_macro_table): Define.
This commit is contained in:
parent
74c72eac23
commit
ab209f6fa9
3 changed files with 365 additions and 344 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2018-07-20 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
|
* buildsym.h (struct buildsym_compunit): Move from buildsym.c.
|
||||||
|
* buildsym.c (struct buildsym_compunit): Move to buildsym.h.
|
||||||
|
(buildsym_compunit::buildsym_compunit)
|
||||||
|
(buildsym_compunit::~buildsym_compunit)
|
||||||
|
(buildsym_compunit::get_macro_table): Define.
|
||||||
|
|
||||||
2018-07-20 Tom Tromey <tom@tromey.com>
|
2018-07-20 Tom Tromey <tom@tromey.com>
|
||||||
|
|
||||||
* buildsym.c (reset_symtab_globals): Remove.
|
* buildsym.c (reset_symtab_globals): Remove.
|
||||||
|
|
333
gdb/buildsym.c
333
gdb/buildsym.c
|
@ -85,17 +85,35 @@
|
||||||
|
|
||||||
#include "stabsread.h"
|
#include "stabsread.h"
|
||||||
|
|
||||||
/* Buildsym's counterpart to struct compunit_symtab. */
|
/* The work-in-progress of the compunit we are building.
|
||||||
|
This is created first, before any subfiles by start_symtab. */
|
||||||
|
|
||||||
struct buildsym_compunit
|
static struct buildsym_compunit *buildsym_compunit;
|
||||||
|
|
||||||
|
/* List of blocks already made (lexical contexts already closed).
|
||||||
|
This is used at the end to make the blockvector. */
|
||||||
|
|
||||||
|
struct pending_block
|
||||||
{
|
{
|
||||||
/* Start recording information about a primary source file (IOW, not an
|
struct pending_block *next;
|
||||||
included source file).
|
struct block *block;
|
||||||
COMP_DIR is the directory in which the compilation unit was compiled
|
};
|
||||||
(or NULL if not known). */
|
|
||||||
|
|
||||||
buildsym_compunit (struct objfile *objfile_, const char *name,
|
static void free_buildsym_compunit (void);
|
||||||
const char *comp_dir_, enum language language_,
|
|
||||||
|
static int compare_line_numbers (const void *ln1p, const void *ln2p);
|
||||||
|
|
||||||
|
/* Initial sizes of data structures. These are realloc'd larger if
|
||||||
|
needed, and realloc'd down to the size actually used, when
|
||||||
|
completed. */
|
||||||
|
|
||||||
|
#define INITIAL_LINE_VECTOR_LENGTH 1000
|
||||||
|
|
||||||
|
|
||||||
|
buildsym_compunit::buildsym_compunit (struct objfile *objfile_,
|
||||||
|
const char *name,
|
||||||
|
const char *comp_dir_,
|
||||||
|
enum language language_,
|
||||||
CORE_ADDR last_addr)
|
CORE_ADDR last_addr)
|
||||||
: objfile (objfile_),
|
: objfile (objfile_),
|
||||||
m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
|
m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
|
||||||
|
@ -119,23 +137,7 @@ struct buildsym_compunit
|
||||||
main_subfile = m_current_subfile;
|
main_subfile = m_current_subfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reopen an existing compunit_symtab so that additional symbols can
|
buildsym_compunit::~buildsym_compunit ()
|
||||||
be added to it. Arguments are as for the main constructor. CUST
|
|
||||||
is the expandable compunit_symtab to be reopened. */
|
|
||||||
|
|
||||||
buildsym_compunit (struct objfile *objfile_, const char *name,
|
|
||||||
const char *comp_dir_, enum language language_,
|
|
||||||
CORE_ADDR last_addr, struct compunit_symtab *cust)
|
|
||||||
: objfile (objfile_),
|
|
||||||
m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
|
|
||||||
comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)),
|
|
||||||
compunit_symtab (cust),
|
|
||||||
language (language_),
|
|
||||||
m_last_source_start_addr (last_addr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~buildsym_compunit ()
|
|
||||||
{
|
{
|
||||||
struct subfile *subfile, *nextsub;
|
struct subfile *subfile, *nextsub;
|
||||||
|
|
||||||
|
@ -167,18 +169,8 @@ struct buildsym_compunit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_last_source_file (const char *name)
|
struct macro_table *
|
||||||
{
|
buildsym_compunit::get_macro_table ()
|
||||||
char *new_name = name == NULL ? NULL : xstrdup (name);
|
|
||||||
m_last_source_file.reset (new_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *get_last_source_file ()
|
|
||||||
{
|
|
||||||
return m_last_source_file.get ();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct macro_table *get_macro_table ()
|
|
||||||
{
|
{
|
||||||
if (m_pending_macros == nullptr)
|
if (m_pending_macros == nullptr)
|
||||||
m_pending_macros = new_macro_table (&objfile->per_bfd->storage_obstack,
|
m_pending_macros = new_macro_table (&objfile->per_bfd->storage_obstack,
|
||||||
|
@ -187,273 +179,6 @@ struct buildsym_compunit
|
||||||
return m_pending_macros;
|
return m_pending_macros;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct macro_table *release_macros ()
|
|
||||||
{
|
|
||||||
struct macro_table *result = m_pending_macros;
|
|
||||||
m_pending_macros = nullptr;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This function is called to discard any pending blocks. */
|
|
||||||
|
|
||||||
void free_pending_blocks ()
|
|
||||||
{
|
|
||||||
m_pending_block_obstack.clear ();
|
|
||||||
m_pending_blocks = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct block *finish_block (struct symbol *symbol,
|
|
||||||
struct pending_block *old_blocks,
|
|
||||||
const struct dynamic_prop *static_link,
|
|
||||||
CORE_ADDR start, CORE_ADDR end);
|
|
||||||
|
|
||||||
void record_block_range (struct block *block,
|
|
||||||
CORE_ADDR start, CORE_ADDR end_inclusive);
|
|
||||||
|
|
||||||
void start_subfile (const char *name);
|
|
||||||
|
|
||||||
void patch_subfile_names (struct subfile *subfile, const char *name);
|
|
||||||
|
|
||||||
void push_subfile ();
|
|
||||||
|
|
||||||
const char *pop_subfile ();
|
|
||||||
|
|
||||||
void record_line (struct subfile *subfile, int line, CORE_ADDR pc);
|
|
||||||
|
|
||||||
struct compunit_symtab *get_compunit_symtab ()
|
|
||||||
{
|
|
||||||
return compunit_symtab;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_last_source_start_addr (CORE_ADDR addr)
|
|
||||||
{
|
|
||||||
m_last_source_start_addr = addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
CORE_ADDR get_last_source_start_addr ()
|
|
||||||
{
|
|
||||||
return m_last_source_start_addr;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct using_direct **get_local_using_directives ()
|
|
||||||
{
|
|
||||||
return &m_local_using_directives;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_local_using_directives (struct using_direct *new_local)
|
|
||||||
{
|
|
||||||
m_local_using_directives = new_local;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct using_direct **get_global_using_directives ()
|
|
||||||
{
|
|
||||||
return &m_global_using_directives;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool outermost_context_p () const
|
|
||||||
{
|
|
||||||
return m_context_stack.empty ();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct context_stack *get_current_context_stack ()
|
|
||||||
{
|
|
||||||
if (m_context_stack.empty ())
|
|
||||||
return nullptr;
|
|
||||||
return &m_context_stack.back ();
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_context_stack_depth () const
|
|
||||||
{
|
|
||||||
return m_context_stack.size ();
|
|
||||||
}
|
|
||||||
|
|
||||||
struct subfile *get_current_subfile ()
|
|
||||||
{
|
|
||||||
return m_current_subfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct pending **get_local_symbols ()
|
|
||||||
{
|
|
||||||
return &m_local_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct pending **get_file_symbols ()
|
|
||||||
{
|
|
||||||
return &m_file_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct pending **get_global_symbols ()
|
|
||||||
{
|
|
||||||
return &m_global_symbols;
|
|
||||||
}
|
|
||||||
|
|
||||||
void record_debugformat (const char *format)
|
|
||||||
{
|
|
||||||
debugformat = format;
|
|
||||||
}
|
|
||||||
|
|
||||||
void record_producer (const char *producer)
|
|
||||||
{
|
|
||||||
this->producer = producer;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct context_stack *push_context (int desc, CORE_ADDR valu);
|
|
||||||
|
|
||||||
struct context_stack pop_context ();
|
|
||||||
|
|
||||||
struct block *end_symtab_get_static_block (CORE_ADDR end_addr,
|
|
||||||
int expandable, int required);
|
|
||||||
|
|
||||||
struct compunit_symtab *end_symtab_from_static_block
|
|
||||||
(struct block *static_block, int section, int expandable);
|
|
||||||
|
|
||||||
struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section);
|
|
||||||
|
|
||||||
struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr,
|
|
||||||
int section);
|
|
||||||
|
|
||||||
void augment_type_symtab ();
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
void record_pending_block (struct block *block, struct pending_block *opblock);
|
|
||||||
|
|
||||||
struct block *finish_block_internal (struct symbol *symbol,
|
|
||||||
struct pending **listhead,
|
|
||||||
struct pending_block *old_blocks,
|
|
||||||
const struct dynamic_prop *static_link,
|
|
||||||
CORE_ADDR start, CORE_ADDR end,
|
|
||||||
int is_global, int expandable);
|
|
||||||
|
|
||||||
struct blockvector *make_blockvector ();
|
|
||||||
|
|
||||||
void watch_main_source_file_lossage ();
|
|
||||||
|
|
||||||
struct compunit_symtab *end_symtab_with_blockvector
|
|
||||||
(struct block *static_block, int section, int expandable);
|
|
||||||
|
|
||||||
/* The objfile we're reading debug info from. */
|
|
||||||
struct objfile *objfile;
|
|
||||||
|
|
||||||
/* List of subfiles (source files).
|
|
||||||
Files are added to the front of the list.
|
|
||||||
This is important mostly for the language determination hacks we use,
|
|
||||||
which iterate over previously added files. */
|
|
||||||
struct subfile *subfiles = nullptr;
|
|
||||||
|
|
||||||
/* The subfile of the main source file. */
|
|
||||||
struct subfile *main_subfile = nullptr;
|
|
||||||
|
|
||||||
/* Name of source file whose symbol data we are now processing. This
|
|
||||||
comes from a symbol of type N_SO for stabs. For DWARF it comes
|
|
||||||
from the DW_AT_name attribute of a DW_TAG_compile_unit DIE. */
|
|
||||||
gdb::unique_xmalloc_ptr<char> m_last_source_file;
|
|
||||||
|
|
||||||
/* E.g., DW_AT_comp_dir if DWARF. Space for this is malloc'd. */
|
|
||||||
gdb::unique_xmalloc_ptr<char> comp_dir;
|
|
||||||
|
|
||||||
/* Space for this is not malloc'd, and is assumed to have at least
|
|
||||||
the same lifetime as objfile. */
|
|
||||||
const char *producer = nullptr;
|
|
||||||
|
|
||||||
/* Space for this is not malloc'd, and is assumed to have at least
|
|
||||||
the same lifetime as objfile. */
|
|
||||||
const char *debugformat = nullptr;
|
|
||||||
|
|
||||||
/* The compunit we are building. */
|
|
||||||
struct compunit_symtab *compunit_symtab = nullptr;
|
|
||||||
|
|
||||||
/* Language of this compunit_symtab. */
|
|
||||||
enum language language;
|
|
||||||
|
|
||||||
/* The macro table for the compilation unit whose symbols we're
|
|
||||||
currently reading. */
|
|
||||||
struct macro_table *m_pending_macros = nullptr;
|
|
||||||
|
|
||||||
/* True if symtab has line number info. This prevents an otherwise
|
|
||||||
empty symtab from being tossed. */
|
|
||||||
bool m_have_line_numbers = false;
|
|
||||||
|
|
||||||
/* Core address of start of text of current source file. This too
|
|
||||||
comes from the N_SO symbol. For Dwarf it typically comes from the
|
|
||||||
DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE. */
|
|
||||||
CORE_ADDR m_last_source_start_addr;
|
|
||||||
|
|
||||||
/* Stack of subfile names. */
|
|
||||||
std::vector<const char *> m_subfile_stack;
|
|
||||||
|
|
||||||
/* The "using" directives local to lexical context. */
|
|
||||||
struct using_direct *m_local_using_directives = nullptr;
|
|
||||||
|
|
||||||
/* Global "using" directives. */
|
|
||||||
struct using_direct *m_global_using_directives = nullptr;
|
|
||||||
|
|
||||||
/* The stack of contexts that are pushed by push_context and popped
|
|
||||||
by pop_context. */
|
|
||||||
std::vector<struct context_stack> m_context_stack;
|
|
||||||
|
|
||||||
struct subfile *m_current_subfile = nullptr;
|
|
||||||
|
|
||||||
/* The mutable address map for the compilation unit whose symbols
|
|
||||||
we're currently reading. The symtabs' shared blockvector will
|
|
||||||
point to a fixed copy of this. */
|
|
||||||
struct addrmap *m_pending_addrmap = nullptr;
|
|
||||||
|
|
||||||
/* The obstack on which we allocate pending_addrmap.
|
|
||||||
If pending_addrmap is NULL, this is uninitialized; otherwise, it is
|
|
||||||
initialized (and holds pending_addrmap). */
|
|
||||||
auto_obstack m_pending_addrmap_obstack;
|
|
||||||
|
|
||||||
/* True if we recorded any ranges in the addrmap that are different
|
|
||||||
from those in the blockvector already. We set this to false when
|
|
||||||
we start processing a symfile, and if it's still false at the
|
|
||||||
end, then we just toss the addrmap. */
|
|
||||||
bool m_pending_addrmap_interesting = false;
|
|
||||||
|
|
||||||
/* An obstack used for allocating pending blocks. */
|
|
||||||
auto_obstack m_pending_block_obstack;
|
|
||||||
|
|
||||||
/* Pointer to the head of a linked list of symbol blocks which have
|
|
||||||
already been finalized (lexical contexts already closed) and which
|
|
||||||
are just waiting to be built into a blockvector when finalizing the
|
|
||||||
associated symtab. */
|
|
||||||
struct pending_block *m_pending_blocks = nullptr;
|
|
||||||
|
|
||||||
/* Pending static symbols and types at the top level. */
|
|
||||||
struct pending *m_file_symbols = nullptr;
|
|
||||||
|
|
||||||
/* Pending global functions and variables. */
|
|
||||||
struct pending *m_global_symbols = nullptr;
|
|
||||||
|
|
||||||
/* Pending symbols that are local to the lexical context. */
|
|
||||||
struct pending *m_local_symbols = nullptr;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The work-in-progress of the compunit we are building.
|
|
||||||
This is created first, before any subfiles by start_symtab. */
|
|
||||||
|
|
||||||
static struct buildsym_compunit *buildsym_compunit;
|
|
||||||
|
|
||||||
/* List of blocks already made (lexical contexts already closed).
|
|
||||||
This is used at the end to make the blockvector. */
|
|
||||||
|
|
||||||
struct pending_block
|
|
||||||
{
|
|
||||||
struct pending_block *next;
|
|
||||||
struct block *block;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void free_buildsym_compunit (void);
|
|
||||||
|
|
||||||
static int compare_line_numbers (const void *ln1p, const void *ln2p);
|
|
||||||
|
|
||||||
/* Initial sizes of data structures. These are realloc'd larger if
|
|
||||||
needed, and realloc'd down to the size actually used, when
|
|
||||||
completed. */
|
|
||||||
|
|
||||||
#define INITIAL_LINE_VECTOR_LENGTH 1000
|
|
||||||
|
|
||||||
|
|
||||||
/* Maintain the lists of symbols and blocks. */
|
/* Maintain the lists of symbols and blocks. */
|
||||||
|
|
||||||
/* Add a symbol to one of the lists of symbols. */
|
/* Add a symbol to one of the lists of symbols. */
|
||||||
|
|
288
gdb/buildsym.h
288
gdb/buildsym.h
|
@ -108,6 +108,294 @@ struct context_stack
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Buildsym's counterpart to struct compunit_symtab. */
|
||||||
|
|
||||||
|
struct buildsym_compunit
|
||||||
|
{
|
||||||
|
/* Start recording information about a primary source file (IOW, not an
|
||||||
|
included source file).
|
||||||
|
COMP_DIR is the directory in which the compilation unit was compiled
|
||||||
|
(or NULL if not known). */
|
||||||
|
|
||||||
|
buildsym_compunit (struct objfile *objfile_, const char *name,
|
||||||
|
const char *comp_dir_, enum language language_,
|
||||||
|
CORE_ADDR last_addr);
|
||||||
|
|
||||||
|
/* Reopen an existing compunit_symtab so that additional symbols can
|
||||||
|
be added to it. Arguments are as for the main constructor. CUST
|
||||||
|
is the expandable compunit_symtab to be reopened. */
|
||||||
|
|
||||||
|
buildsym_compunit (struct objfile *objfile_, const char *name,
|
||||||
|
const char *comp_dir_, enum language language_,
|
||||||
|
CORE_ADDR last_addr, struct compunit_symtab *cust)
|
||||||
|
: objfile (objfile_),
|
||||||
|
m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
|
||||||
|
comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)),
|
||||||
|
compunit_symtab (cust),
|
||||||
|
language (language_),
|
||||||
|
m_last_source_start_addr (last_addr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~buildsym_compunit ();
|
||||||
|
|
||||||
|
DISABLE_COPY_AND_ASSIGN (buildsym_compunit);
|
||||||
|
|
||||||
|
void set_last_source_file (const char *name)
|
||||||
|
{
|
||||||
|
char *new_name = name == NULL ? NULL : xstrdup (name);
|
||||||
|
m_last_source_file.reset (new_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *get_last_source_file ()
|
||||||
|
{
|
||||||
|
return m_last_source_file.get ();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct macro_table *get_macro_table ();
|
||||||
|
|
||||||
|
struct macro_table *release_macros ()
|
||||||
|
{
|
||||||
|
struct macro_table *result = m_pending_macros;
|
||||||
|
m_pending_macros = nullptr;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This function is called to discard any pending blocks. */
|
||||||
|
|
||||||
|
void free_pending_blocks ()
|
||||||
|
{
|
||||||
|
m_pending_block_obstack.clear ();
|
||||||
|
m_pending_blocks = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct block *finish_block (struct symbol *symbol,
|
||||||
|
struct pending_block *old_blocks,
|
||||||
|
const struct dynamic_prop *static_link,
|
||||||
|
CORE_ADDR start, CORE_ADDR end);
|
||||||
|
|
||||||
|
void record_block_range (struct block *block,
|
||||||
|
CORE_ADDR start, CORE_ADDR end_inclusive);
|
||||||
|
|
||||||
|
void start_subfile (const char *name);
|
||||||
|
|
||||||
|
void patch_subfile_names (struct subfile *subfile, const char *name);
|
||||||
|
|
||||||
|
void push_subfile ();
|
||||||
|
|
||||||
|
const char *pop_subfile ();
|
||||||
|
|
||||||
|
void record_line (struct subfile *subfile, int line, CORE_ADDR pc);
|
||||||
|
|
||||||
|
struct compunit_symtab *get_compunit_symtab ()
|
||||||
|
{
|
||||||
|
return compunit_symtab;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_last_source_start_addr (CORE_ADDR addr)
|
||||||
|
{
|
||||||
|
m_last_source_start_addr = addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
CORE_ADDR get_last_source_start_addr ()
|
||||||
|
{
|
||||||
|
return m_last_source_start_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct using_direct **get_local_using_directives ()
|
||||||
|
{
|
||||||
|
return &m_local_using_directives;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_local_using_directives (struct using_direct *new_local)
|
||||||
|
{
|
||||||
|
m_local_using_directives = new_local;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct using_direct **get_global_using_directives ()
|
||||||
|
{
|
||||||
|
return &m_global_using_directives;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool outermost_context_p () const
|
||||||
|
{
|
||||||
|
return m_context_stack.empty ();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct context_stack *get_current_context_stack ()
|
||||||
|
{
|
||||||
|
if (m_context_stack.empty ())
|
||||||
|
return nullptr;
|
||||||
|
return &m_context_stack.back ();
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_context_stack_depth () const
|
||||||
|
{
|
||||||
|
return m_context_stack.size ();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct subfile *get_current_subfile ()
|
||||||
|
{
|
||||||
|
return m_current_subfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pending **get_local_symbols ()
|
||||||
|
{
|
||||||
|
return &m_local_symbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pending **get_file_symbols ()
|
||||||
|
{
|
||||||
|
return &m_file_symbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pending **get_global_symbols ()
|
||||||
|
{
|
||||||
|
return &m_global_symbols;
|
||||||
|
}
|
||||||
|
|
||||||
|
void record_debugformat (const char *format)
|
||||||
|
{
|
||||||
|
debugformat = format;
|
||||||
|
}
|
||||||
|
|
||||||
|
void record_producer (const char *producer)
|
||||||
|
{
|
||||||
|
this->producer = producer;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct context_stack *push_context (int desc, CORE_ADDR valu);
|
||||||
|
|
||||||
|
struct context_stack pop_context ();
|
||||||
|
|
||||||
|
struct block *end_symtab_get_static_block (CORE_ADDR end_addr,
|
||||||
|
int expandable, int required);
|
||||||
|
|
||||||
|
struct compunit_symtab *end_symtab_from_static_block
|
||||||
|
(struct block *static_block, int section, int expandable);
|
||||||
|
|
||||||
|
struct compunit_symtab *end_symtab (CORE_ADDR end_addr, int section);
|
||||||
|
|
||||||
|
struct compunit_symtab *end_expandable_symtab (CORE_ADDR end_addr,
|
||||||
|
int section);
|
||||||
|
|
||||||
|
void augment_type_symtab ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void record_pending_block (struct block *block, struct pending_block *opblock);
|
||||||
|
|
||||||
|
struct block *finish_block_internal (struct symbol *symbol,
|
||||||
|
struct pending **listhead,
|
||||||
|
struct pending_block *old_blocks,
|
||||||
|
const struct dynamic_prop *static_link,
|
||||||
|
CORE_ADDR start, CORE_ADDR end,
|
||||||
|
int is_global, int expandable);
|
||||||
|
|
||||||
|
struct blockvector *make_blockvector ();
|
||||||
|
|
||||||
|
void watch_main_source_file_lossage ();
|
||||||
|
|
||||||
|
struct compunit_symtab *end_symtab_with_blockvector
|
||||||
|
(struct block *static_block, int section, int expandable);
|
||||||
|
|
||||||
|
/* The objfile we're reading debug info from. */
|
||||||
|
struct objfile *objfile;
|
||||||
|
|
||||||
|
/* List of subfiles (source files).
|
||||||
|
Files are added to the front of the list.
|
||||||
|
This is important mostly for the language determination hacks we use,
|
||||||
|
which iterate over previously added files. */
|
||||||
|
struct subfile *subfiles = nullptr;
|
||||||
|
|
||||||
|
/* The subfile of the main source file. */
|
||||||
|
struct subfile *main_subfile = nullptr;
|
||||||
|
|
||||||
|
/* Name of source file whose symbol data we are now processing. This
|
||||||
|
comes from a symbol of type N_SO for stabs. For DWARF it comes
|
||||||
|
from the DW_AT_name attribute of a DW_TAG_compile_unit DIE. */
|
||||||
|
gdb::unique_xmalloc_ptr<char> m_last_source_file;
|
||||||
|
|
||||||
|
/* E.g., DW_AT_comp_dir if DWARF. Space for this is malloc'd. */
|
||||||
|
gdb::unique_xmalloc_ptr<char> comp_dir;
|
||||||
|
|
||||||
|
/* Space for this is not malloc'd, and is assumed to have at least
|
||||||
|
the same lifetime as objfile. */
|
||||||
|
const char *producer = nullptr;
|
||||||
|
|
||||||
|
/* Space for this is not malloc'd, and is assumed to have at least
|
||||||
|
the same lifetime as objfile. */
|
||||||
|
const char *debugformat = nullptr;
|
||||||
|
|
||||||
|
/* The compunit we are building. */
|
||||||
|
struct compunit_symtab *compunit_symtab = nullptr;
|
||||||
|
|
||||||
|
/* Language of this compunit_symtab. */
|
||||||
|
enum language language;
|
||||||
|
|
||||||
|
/* The macro table for the compilation unit whose symbols we're
|
||||||
|
currently reading. */
|
||||||
|
struct macro_table *m_pending_macros = nullptr;
|
||||||
|
|
||||||
|
/* True if symtab has line number info. This prevents an otherwise
|
||||||
|
empty symtab from being tossed. */
|
||||||
|
bool m_have_line_numbers = false;
|
||||||
|
|
||||||
|
/* Core address of start of text of current source file. This too
|
||||||
|
comes from the N_SO symbol. For Dwarf it typically comes from the
|
||||||
|
DW_AT_low_pc attribute of a DW_TAG_compile_unit DIE. */
|
||||||
|
CORE_ADDR m_last_source_start_addr;
|
||||||
|
|
||||||
|
/* Stack of subfile names. */
|
||||||
|
std::vector<const char *> m_subfile_stack;
|
||||||
|
|
||||||
|
/* The "using" directives local to lexical context. */
|
||||||
|
struct using_direct *m_local_using_directives = nullptr;
|
||||||
|
|
||||||
|
/* Global "using" directives. */
|
||||||
|
struct using_direct *m_global_using_directives = nullptr;
|
||||||
|
|
||||||
|
/* The stack of contexts that are pushed by push_context and popped
|
||||||
|
by pop_context. */
|
||||||
|
std::vector<struct context_stack> m_context_stack;
|
||||||
|
|
||||||
|
struct subfile *m_current_subfile = nullptr;
|
||||||
|
|
||||||
|
/* The mutable address map for the compilation unit whose symbols
|
||||||
|
we're currently reading. The symtabs' shared blockvector will
|
||||||
|
point to a fixed copy of this. */
|
||||||
|
struct addrmap *m_pending_addrmap = nullptr;
|
||||||
|
|
||||||
|
/* The obstack on which we allocate pending_addrmap.
|
||||||
|
If pending_addrmap is NULL, this is uninitialized; otherwise, it is
|
||||||
|
initialized (and holds pending_addrmap). */
|
||||||
|
auto_obstack m_pending_addrmap_obstack;
|
||||||
|
|
||||||
|
/* True if we recorded any ranges in the addrmap that are different
|
||||||
|
from those in the blockvector already. We set this to false when
|
||||||
|
we start processing a symfile, and if it's still false at the
|
||||||
|
end, then we just toss the addrmap. */
|
||||||
|
bool m_pending_addrmap_interesting = false;
|
||||||
|
|
||||||
|
/* An obstack used for allocating pending blocks. */
|
||||||
|
auto_obstack m_pending_block_obstack;
|
||||||
|
|
||||||
|
/* Pointer to the head of a linked list of symbol blocks which have
|
||||||
|
already been finalized (lexical contexts already closed) and which
|
||||||
|
are just waiting to be built into a blockvector when finalizing the
|
||||||
|
associated symtab. */
|
||||||
|
struct pending_block *m_pending_blocks = nullptr;
|
||||||
|
|
||||||
|
/* Pending static symbols and types at the top level. */
|
||||||
|
struct pending *m_file_symbols = nullptr;
|
||||||
|
|
||||||
|
/* Pending global functions and variables. */
|
||||||
|
struct pending *m_global_symbols = nullptr;
|
||||||
|
|
||||||
|
/* Pending symbols that are local to the lexical context. */
|
||||||
|
struct pending *m_local_symbols = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
/* The type of the record_line function. */
|
/* The type of the record_line function. */
|
||||||
typedef void (record_line_ftype) (struct subfile *subfile, int line,
|
typedef void (record_line_ftype) (struct subfile *subfile, int line,
|
||||||
CORE_ADDR pc);
|
CORE_ADDR pc);
|
||||||
|
|
Loading…
Add table
Reference in a new issue