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>
|
||||
|
||||
* buildsym.c (reset_symtab_globals): Remove.
|
||||
|
|
347
gdb/buildsym.c
347
gdb/buildsym.c
|
@ -85,24 +85,42 @@
|
|||
|
||||
#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
|
||||
{
|
||||
/* 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). */
|
||||
static struct buildsym_compunit *buildsym_compunit;
|
||||
|
||||
buildsym_compunit (struct objfile *objfile_, const char *name,
|
||||
const char *comp_dir_, enum language language_,
|
||||
/* 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
|
||||
|
||||
|
||||
buildsym_compunit::buildsym_compunit (struct objfile *objfile_,
|
||||
const char *name,
|
||||
const char *comp_dir_,
|
||||
enum language language_,
|
||||
CORE_ADDR last_addr)
|
||||
: objfile (objfile_),
|
||||
m_last_source_file (name == nullptr ? nullptr : xstrdup (name)),
|
||||
comp_dir (comp_dir_ == nullptr ? nullptr : xstrdup (comp_dir_)),
|
||||
language (language_),
|
||||
m_last_source_start_addr (last_addr)
|
||||
{
|
||||
{
|
||||
/* Allocate the compunit symtab now. The caller needs it to allocate
|
||||
non-primary symtabs. It is also needed by get_macro_table. */
|
||||
compunit_symtab = allocate_compunit_symtab (objfile, name);
|
||||
|
@ -117,26 +135,10 @@ struct buildsym_compunit
|
|||
/* Save this so that we don't have to go looking for it at the end
|
||||
of the subfiles list. */
|
||||
main_subfile = m_current_subfile;
|
||||
}
|
||||
}
|
||||
|
||||
/* 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 ()
|
||||
{
|
||||
buildsym_compunit::~buildsym_compunit ()
|
||||
{
|
||||
struct subfile *subfile, *nextsub;
|
||||
|
||||
if (m_pending_macros != nullptr)
|
||||
|
@ -165,294 +167,17 @@ struct buildsym_compunit
|
|||
next1 = next->next;
|
||||
xfree ((void *) next);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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 *
|
||||
buildsym_compunit::get_macro_table ()
|
||||
{
|
||||
if (m_pending_macros == nullptr)
|
||||
m_pending_macros = new_macro_table (&objfile->per_bfd->storage_obstack,
|
||||
objfile->per_bfd->macro_cache,
|
||||
compunit_symtab);
|
||||
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. */
|
||||
|
||||
|
|
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. */
|
||||
typedef void (record_line_ftype) (struct subfile *subfile, int line,
|
||||
CORE_ADDR pc);
|
||||
|
|
Loading…
Add table
Reference in a new issue