forked from Imagelibrary/binutils-gdb
* defs.h (STRCMP, STREQ, STREQN): New macros.
* defs.h (demangle_and_match): Remove prototype. * dwarfread.c (STREQ, STREQN): Remove macros, replaced with STREQ and STREQN defined in defs.h. * dwarfread.c (set_cu_language): For completely unknown languages, try to deduce the language from the filename. Retain behavior that for known languages we don't know how to handle, we use language_unknown. * dwarfread.c (enum_type, symthesize_typedef): Initialize language and demangled name fields in symbol. * dwarfread.c, mipsread.c, partial-stab.h: For all usages of ADD_PSYMBOL_TO_LIST, add language and objfile parameters. * dwarfread.c (new_symbol): Attempt to demangle C++ symbol names and cache the results in SYMBOL_DEMANGLED_NAME for the symbol. * elfread.c (STREQ): Remove macro, use STREQ defined in defs.h. Replace usages throughout. * elfread.c (demangle.h): Include. * elfread.c (record_minimal_symbol): Remove prototype and function. * gdbtypes.h, symtab.h (B_SET, B_CLR, B_TST, B_TYPE, B_BYTES, B_CLRALL): Moved from symtab.h to gdbtypes.h. * infcmd.c (jump_command): Remove code to demangle name and add it to a cleanup list. Now just use SYMBOL_DEMANGLED_NAME. * minsyms.c (demangle.h): Include. * minsyms.c (lookup_minimal_symbol): Indent comment to match code. * minsyms.c (install_minimal_symbols): Attempt to demangle symbol names as C++ names, and cache them in SYMBOL_DEMANGLED_NAME. * mipsread.c (psymtab_language): Add static variable. * stabsread.c (demangle.h): Include. * stabsread.c (define_symbol): Attempt to demangle C++ symbol names and cache them in the SYMBOL_DEMANGLED_NAME field. * stack.c (return_command): Remove explicit demangling of name and use of cleanups. Just use SYMBOL_DEMANGLED_NAME. * symfile.c (demangle.h): Include. * symfile.c (add_psymbol_to_list, add_psymbol_addr_to_list): Fix to match macros in symfile.h and allow them to be compiled if INLINE_ADD_PSYMBOL is not true. * symfile.h (INLINE_ADD_PSYMBOL): Default to true if not set. * symfile.h (ADD_PSYMBOL_*): Add language and objfile parameters. Add code to demangle and cache C++ symbol names. Use macro form if INLINE_ADD_PSYMBOL is true, otherwise use C function form. * symmisc.c (add_psymbol_to_list, add_psymbol_addr_to_list): Remove, also defined in symfile.c, which we already fixed. * symtab.c (expensive_mangler): Remove prototype and function. * symtab.c (find_methods): Remove physnames parameter and fix prototype to match. * symtab.c (completion_list_add_symbol): Name changed to completion_list_add_name. * symtab.c (COMPLETION_LIST_ADD_SYMBOL): New macro, adds both the normal symbol name and the cached C++ demangled name. * symtab.c (lookup_demangled_partial_symbol, lookup_demangled_block_symbol): Remove prototypes and functions. * symtab.c (lookup_symbol): Remove use of expensive_mangler, use lookup_block_symbol instead of lookup_demangled_block_symbol. Remove code to try demangling names and matching them. * symtab.c (lookup_partial_symbol, lookup_block_symbol): Fix to try matching the cached demangled name if no match is found using the regular symbol name. * symtab.c (find_methods): Remove unused physnames array. * symtab.c (name_match, NAME_MATCH): Remove function and macro, replaced with SYMBOL_MATCHES_REGEXP from symtab.h. * symtab.c (completion_list_add_symbol): Rewrite to use cached C++ demangled symbol names. * symtab.h: Much reformatting of structures and such to add whitespace to make them more readable, and make them more consistent with other gdb structure definitions. * symtab.h (general_symbol_info): New struct containing fields common to all symbols. * symtab.h (SYMBOL_LANGUAGE, SYMBOL_DEMANGLED_NAME, SYMBOL_SOURCE_NAME, SYMBOL_LINKAGE_NAME, SYMBOL_MATCHES_NAME, SYMBOL_MATCHES_REGEXP, MSYMBOL_INFO, MSYMBOL_TYPE): New macros. * symtab. (struct minimal_symbol, struct partial_symbol, struct symbol): Use general_symbol_info struct. * utils.c (demangle_and_match): Remove, no longer used. * valops.c (demangle.h): Include. * xcoffexec.c (eq): Remove macro, replace usages with STREQ. * blockframe.c, breakpoint.c, c-exp.y, c-valprint.c, dbxread.c, infcmd.c, m2-exp.y, minsyms.c, objfiles.h, solib.c, stack.c, symmisc.c, symtab.c, valops.c: Replace references to minimal symbol fields with appropriate macros. * breakpoint.c, buildsym.c, c-exp.y, c-typeprint.c, c-valprint.c, coffread.c, command.c, convex-tdep.c, cp-valprint.c, dbxread.c, demangle.c, elfread.c, energize.c, environ.c, exec.c, gdbtypes.c, i960-tdep.c, infrun.c, infrun-hacked.c, language.c, main.c, minsyms.c, mipsread.c, partial-stab.h, remote-es1800.c, remote-nindy.c, remote-udi.c, rs6000-tdep.c, solib.c, source.c, sparc-pinsn.c, stabsread.c, standalone.c, state.c, stuff.c, symfile.c, symmisc.c, symtab.c, symtab.h, tm-sysv4.h, tm-ultra3.h, values.c, xcoffexec.c, xcoffread.c: Replace strcmp and strncmp usages with STREQ, STREQN, or STRCMP as appropriate. * breakpoint.c, buildsym.c, c-typeprint.c, expprint.c, findvar.c, mipsread.c, printcmd.c, source.c, stabsread.c, stack.c, symmisc.c, tm-29k.h, valops.c, values.c: Replace SYMBOL_NAME references with SYMBOL_SOURCE_NAME or SYMBOL_LINKAGE_NAME as appropriate. * buildsym.c (start_subfile, patch_subfile_names): Default the source language to what can be deduced from the filename. * buildsym.c (end_symtab): Update the source language in the allocated symtab to match what we have been using. * buildsym.h (struct subfile): Add a language field. * c-typeprint.c (c_print_type): Remove code to do explicit demangling. * dbxread.c (psymtab_language): Add static variable. * dbxread.c (start_psymtab): Initialize psymtab_language using deduce_language_from_filename.
This commit is contained in:
598
gdb/symtab.h
598
gdb/symtab.h
@@ -19,48 +19,156 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#if !defined (SYMTAB_H)
|
||||
#define SYMTAB_H 1
|
||||
#include "obstack.h"
|
||||
|
||||
/* See the comment in symfile.c about how current_objfile is used. */
|
||||
|
||||
extern struct objfile *current_objfile;
|
||||
|
||||
/* Some definitions and declarations to go with use of obstacks. */
|
||||
|
||||
#include "obstack.h"
|
||||
#define obstack_chunk_alloc xmalloc
|
||||
#define obstack_chunk_free free
|
||||
|
||||
/* Some macros for char-based bitfields. */
|
||||
#define B_SET(a,x) ((a)[(x)>>3] |= (1 << ((x)&7)))
|
||||
#define B_CLR(a,x) ((a)[(x)>>3] &= ~(1 << ((x)&7)))
|
||||
#define B_TST(a,x) ((a)[(x)>>3] & (1 << ((x)&7)))
|
||||
#define B_TYPE unsigned char
|
||||
#define B_BYTES(x) ( 1 + ((x)>>3) )
|
||||
#define B_CLRALL(a,x) memset ((a), 0, B_BYTES(x))
|
||||
/* Define a structure for the information that is common to all symbol types,
|
||||
including minimal symbols, partial symbols, and full symbols. */
|
||||
|
||||
struct general_symbol_info
|
||||
{
|
||||
/* Name of the symbol. This is a required field. Storage for the name is
|
||||
allocated on the psymbol_obstack or symbol_obstack for the associated
|
||||
objfile. */
|
||||
|
||||
char *name;
|
||||
|
||||
/* Constant value, or address if static, or register number,
|
||||
or offset in arguments, or offset in stack frame. All of
|
||||
these are in host byte order (though what they point to might
|
||||
be in target byte order, e.g. LOC_CONST_BYTES).
|
||||
|
||||
Note that the address of a function is SYMBOL_VALUE_ADDRESS (pst)
|
||||
in a partial symbol table, but BLOCK_START (SYMBOL_BLOCK_VALUE (st))
|
||||
in a symbol table. */
|
||||
|
||||
union
|
||||
{
|
||||
/* for LOC_CONST, LOC_REGISTER, LOC_ARG, LOC_REF_ARG, LOC_REGPARM,
|
||||
LOC_LOCAL */
|
||||
|
||||
long value;
|
||||
|
||||
/* for LOC_BLOCK */
|
||||
|
||||
struct block *block;
|
||||
|
||||
/* for LOC_CONST_BYTES */
|
||||
|
||||
char *bytes;
|
||||
|
||||
/* for LOC_STATIC, LOC_LABEL */
|
||||
|
||||
CORE_ADDR address;
|
||||
|
||||
/* for opaque typedef struct chain */
|
||||
|
||||
struct symbol *chain;
|
||||
}
|
||||
value;
|
||||
|
||||
/* In a multilanguage environment, some language specific information may
|
||||
need to be recorded along with each symbol. */
|
||||
|
||||
struct language_dependent_info
|
||||
{
|
||||
|
||||
/* Record the language that this information applies to. */
|
||||
|
||||
enum language language;
|
||||
|
||||
/* Since one and only one language can apply, wrap the information inside
|
||||
a union. */
|
||||
|
||||
union
|
||||
{
|
||||
/* For C++ */
|
||||
struct
|
||||
{
|
||||
char *demangled_name;
|
||||
} cplus_specific;
|
||||
} lang_u;
|
||||
} lang_specific;
|
||||
};
|
||||
|
||||
#define SYMBOL_NAME(symbol) (symbol)->ginfo.name
|
||||
#define SYMBOL_VALUE(symbol) (symbol)->ginfo.value.value
|
||||
#define SYMBOL_VALUE_ADDRESS(symbol) (symbol)->ginfo.value.address
|
||||
#define SYMBOL_VALUE_BYTES(symbol) (symbol)->ginfo.value.bytes
|
||||
#define SYMBOL_BLOCK_VALUE(symbol) (symbol)->ginfo.value.block
|
||||
#define SYMBOL_VALUE_CHAIN(symbol) (symbol)->ginfo.value.chain
|
||||
#define SYMBOL_LANGUAGE(symbol) (symbol)->ginfo.lang_specific.language
|
||||
#define SYMBOL_DEMANGLED_NAME(symbol) \
|
||||
(symbol)->ginfo.lang_specific.lang_u.cplus_specific.demangled_name
|
||||
|
||||
extern int demangle; /* We reference it, so go ahead and declare it. */
|
||||
|
||||
/* Macro that returns the "natural source name" of a symbol. In C++ this is
|
||||
the "demangled" form of the name if demangle is on and the "mangled" form
|
||||
of the name if demangle is off. In other languages this is just the
|
||||
symbol name. */
|
||||
|
||||
#define SYMBOL_SOURCE_NAME(symbol) \
|
||||
((demangle && (SYMBOL_LANGUAGE(symbol) == language_cplus) && \
|
||||
(SYMBOL_DEMANGLED_NAME(symbol) != NULL)) ? \
|
||||
SYMBOL_DEMANGLED_NAME (symbol) : SYMBOL_NAME (symbol))
|
||||
|
||||
/* Macro that returns the "natural assembly name" of a symbol. In C++ this is
|
||||
the "mangled" form of the name if demangle is off, or if demangle is on and
|
||||
asm_demangle is off. Otherwise if asm_demangle is on it is the "demangled"
|
||||
form. In other languages this is just the symbol name. */
|
||||
|
||||
#define SYMBOL_LINKAGE_NAME(symbol) \
|
||||
((demangle && asm_demangle && (SYMBOL_LANGUAGE(symbol) == language_cplus) &&\
|
||||
(SYMBOL_DEMANGLED_NAME(symbol) != NULL)) ? \
|
||||
SYMBOL_DEMANGLED_NAME (symbol) : SYMBOL_NAME (symbol))
|
||||
|
||||
/* Macro that tests a symbol for a match against a specified name string.
|
||||
First test the unencoded name, then looks for and test a C++ encoded
|
||||
name if it exists. Note that whitespace is ignored while attempting to
|
||||
match a C++ encoded name, so that "foo::bar(int,long)" is the same as
|
||||
"foo :: bar (int, long)".
|
||||
Evaluates to zero if the match fails, or nonzero if it succeeds. */
|
||||
|
||||
#define SYMBOL_MATCHES_NAME(symbol, name) \
|
||||
(STREQ (SYMBOL_NAME (symbol), (name)) || \
|
||||
(SYMBOL_LANGUAGE (symbol) == language_cplus && \
|
||||
SYMBOL_DEMANGLED_NAME (symbol) != NULL && \
|
||||
strcmp_iw (SYMBOL_DEMANGLED_NAME (symbol), (name)) == 0))
|
||||
|
||||
/* Macro that tests a symbol for an re-match against the last compiled regular
|
||||
expression. First test the unencoded name, then look for and test a C++
|
||||
encoded name if it exists.
|
||||
Evaluates to zero if the match fails, or nonzero if it succeeds. */
|
||||
|
||||
#define SYMBOL_MATCHES_REGEXP(symbol) \
|
||||
(re_exec (SYMBOL_NAME (symbol)) != 0 || \
|
||||
(SYMBOL_LANGUAGE (symbol) == language_cplus && \
|
||||
SYMBOL_DEMANGLED_NAME (symbol) != NULL && \
|
||||
re_exec (SYMBOL_DEMANGLED_NAME (symbol)) != 0))
|
||||
|
||||
/* Define a simple structure used to hold some very basic information about
|
||||
all defined global symbols (text, data, bss, abs, etc). The only two
|
||||
required pieces of information are the symbol's name and the address
|
||||
associated with that symbol. In many cases, even if a file was compiled
|
||||
with no special options for debugging at all, as long as was not stripped
|
||||
it will contain sufficient information to build a useful minimal symbol
|
||||
table using this structure. Even when a file contains enough debugging
|
||||
information to build a full symbol table, these minimal symbols are still
|
||||
useful for quickly mapping between names and addresses, and vice versa.
|
||||
They are also sometimes used to figure out what full symbol table entries
|
||||
need to be read in. */
|
||||
all defined global symbols (text, data, bss, abs, etc). The only required
|
||||
information is the general_symbol_info.
|
||||
|
||||
In many cases, even if a file was compiled with no special options for
|
||||
debugging at all, as long as was not stripped it will contain sufficient
|
||||
information to build a useful minimal symbol table using this structure.
|
||||
Even when a file contains enough debugging information to build a full
|
||||
symbol table, these minimal symbols are still useful for quickly mapping
|
||||
between names and addresses, and vice versa. They are also sometimes
|
||||
used to figure out what full symbol table entries need to be read in. */
|
||||
|
||||
struct minimal_symbol
|
||||
{
|
||||
|
||||
/* Name of the symbol. This is a required field. Storage for the name is
|
||||
allocated on the symbol_obstack for the associated objfile. */
|
||||
/* The general symbol info required for all types of symbols. */
|
||||
|
||||
char *name;
|
||||
|
||||
/* Address of the symbol. This is a required field. */
|
||||
|
||||
CORE_ADDR address;
|
||||
struct general_symbol_info ginfo;
|
||||
|
||||
/* The info field is available for caching machine-specific information that
|
||||
The AMD 29000 tdep.c uses it to remember things it has decoded from the
|
||||
@@ -92,6 +200,9 @@ struct minimal_symbol
|
||||
|
||||
};
|
||||
|
||||
#define MSYMBOL_INFO(msymbol) (msymbol)->info
|
||||
#define MSYMBOL_TYPE(msymbol) (msymbol)->type
|
||||
|
||||
|
||||
/* All of the name-scope contours of the program
|
||||
are represented by `struct block' objects.
|
||||
@@ -127,18 +238,26 @@ struct blockvector
|
||||
struct block *block[1];
|
||||
};
|
||||
|
||||
#define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
|
||||
#define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
|
||||
|
||||
/* Special block numbers */
|
||||
#define GLOBAL_BLOCK 0
|
||||
#define STATIC_BLOCK 1
|
||||
|
||||
#define GLOBAL_BLOCK 0
|
||||
#define STATIC_BLOCK 1
|
||||
#define FIRST_LOCAL_BLOCK 2
|
||||
|
||||
struct block
|
||||
{
|
||||
|
||||
/* Addresses in the executable code that are in this block.
|
||||
Note: in an unrelocated symbol segment in a file,
|
||||
these are always zero. They can be filled in from the
|
||||
N_LBRAC and N_RBRAC symbols in the loader symbol table. */
|
||||
CORE_ADDR startaddr, endaddr;
|
||||
|
||||
CORE_ADDR startaddr;
|
||||
CORE_ADDR endaddr;
|
||||
|
||||
/* The symbol that names this block,
|
||||
if the block is the body of a function;
|
||||
otherwise, zero.
|
||||
@@ -148,124 +267,208 @@ struct block
|
||||
(since the name resides in a higher block).
|
||||
Since the symbol does point to the block (as its value),
|
||||
it is possible to find the block and set its name properly. */
|
||||
|
||||
struct symbol *function;
|
||||
/* The `struct block' for the containing block, or 0 if none. */
|
||||
/* Note that in an unrelocated symbol segment in an object file
|
||||
|
||||
/* The `struct block' for the containing block, or 0 if none.
|
||||
Note that in an unrelocated symbol segment in an object file
|
||||
this pointer may be zero when the correct value should be
|
||||
the second special block (for symbols whose scope is one compilation).
|
||||
This is because the compiler outputs the special blocks at the
|
||||
very end, after the other blocks. */
|
||||
|
||||
struct block *superblock;
|
||||
|
||||
/* A flag indicating whether or not the function corresponding
|
||||
to this block was compiled with gcc or not. If there is no
|
||||
function corresponding to this block, this meaning of this flag
|
||||
is undefined. (In practice it will be 1 if the block was created
|
||||
while processing a file compiled with gcc and 0 when not). */
|
||||
|
||||
unsigned char gcc_compile_flag;
|
||||
|
||||
/* Number of local symbols. */
|
||||
|
||||
int nsyms;
|
||||
|
||||
/* The symbols. */
|
||||
|
||||
struct symbol *sym[1];
|
||||
};
|
||||
|
||||
#define BLOCK_START(bl) (bl)->startaddr
|
||||
#define BLOCK_END(bl) (bl)->endaddr
|
||||
#define BLOCK_NSYMS(bl) (bl)->nsyms
|
||||
#define BLOCK_SYM(bl, n) (bl)->sym[n]
|
||||
#define BLOCK_FUNCTION(bl) (bl)->function
|
||||
#define BLOCK_SUPERBLOCK(bl) (bl)->superblock
|
||||
#define BLOCK_GCC_COMPILED(bl) (bl)->gcc_compile_flag
|
||||
|
||||
/* Nonzero if symbols of block BL should be sorted alphabetically. */
|
||||
|
||||
#define BLOCK_SHOULD_SORT(bl) ((bl)->nsyms >= 40)
|
||||
|
||||
|
||||
/* Represent one symbol name; a variable, constant, function or typedef. */
|
||||
|
||||
/* Different name spaces for symbols. Looking up a symbol specifies
|
||||
a namespace and ignores symbol definitions in other name spaces.
|
||||
|
||||
VAR_NAMESPACE is the usual namespace.
|
||||
In C, this contains variables, function names, typedef names
|
||||
and enum type values.
|
||||
|
||||
STRUCT_NAMESPACE is used in C to hold struct, union and enum type names.
|
||||
Thus, if `struct foo' is used in a C program,
|
||||
it produces a symbol named `foo' in the STRUCT_NAMESPACE.
|
||||
|
||||
LABEL_NAMESPACE may be used for names of labels (for gotos);
|
||||
currently it is not used and labels are not recorded at all. */
|
||||
|
||||
/* For a non-global symbol allocated statically,
|
||||
the correct core address cannot be determined by the compiler.
|
||||
The compiler puts an index number into the symbol's value field.
|
||||
This index number can be matched with the "desc" field of
|
||||
an entry in the loader symbol table. */
|
||||
|
||||
/* Different name spaces for symbols. Looking up a symbol specifies a
|
||||
namespace and ignores symbol definitions in other name spaces. */
|
||||
|
||||
enum namespace
|
||||
{
|
||||
UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE, LABEL_NAMESPACE
|
||||
/* UNDEF_NAMESPACE is used when a namespace has not been discovered or
|
||||
none of the following apply. This usually indicates an error either
|
||||
in the symbol information or in gdb's handling of symbols. */
|
||||
|
||||
UNDEF_NAMESPACE,
|
||||
|
||||
/* VAR_NAMESPACE is the usual namespace. In C, this contains variables,
|
||||
function names, typedef names and enum type values. */
|
||||
|
||||
VAR_NAMESPACE,
|
||||
|
||||
/* STRUCT_NAMESPACE is used in C to hold struct, union and enum type names.
|
||||
Thus, if `struct foo' is used in a C program, it produces a symbol named
|
||||
`foo' in the STRUCT_NAMESPACE. */
|
||||
|
||||
STRUCT_NAMESPACE,
|
||||
|
||||
/* LABEL_NAMESPACE may be used for names of labels (for gotos);
|
||||
currently it is not used and labels are not recorded at all. */
|
||||
|
||||
LABEL_NAMESPACE
|
||||
};
|
||||
|
||||
/* An address-class says where to find the value of a symbol. */
|
||||
|
||||
enum address_class
|
||||
{
|
||||
LOC_UNDEF, /* Not used; catches errors */
|
||||
LOC_CONST, /* Value is constant int SYMBOL_VALUE, host byteorder */
|
||||
LOC_STATIC, /* Value is at fixed address SYMBOL_VALUE_ADDRESS */
|
||||
LOC_REGISTER, /* Value is in register */
|
||||
LOC_ARG, /* Value is at spec'd offset in arglist */
|
||||
LOC_REF_ARG, /* Value address is at spec'd offset in arglist. */
|
||||
LOC_REGPARM, /* Value is at spec'd offset in register window */
|
||||
LOC_LOCAL, /* Value is at spec'd offset in stack frame */
|
||||
LOC_TYPEDEF, /* Value not used; definition in SYMBOL_TYPE
|
||||
Symbols in the namespace STRUCT_NAMESPACE
|
||||
all have this class. */
|
||||
LOC_LABEL, /* Value is address SYMBOL_VALUE_ADDRESS in the code */
|
||||
LOC_BLOCK, /* Value is address SYMBOL_VALUE_BLOCK of a
|
||||
`struct block'. Function names have this class. */
|
||||
LOC_CONST_BYTES, /* Value is a constant byte-sequence pointed to by
|
||||
SYMBOL_VALUE_ADDRESS, in target byte order. */
|
||||
LOC_LOCAL_ARG /* Value is arg at spec'd offset in stack frame.
|
||||
Differs from LOC_LOCAL in that symbol is an
|
||||
argument; differs from LOC_ARG in that we find it
|
||||
in the frame (FRAME_LOCALS_ADDRESS), not in the
|
||||
arglist (FRAME_ARGS_ADDRESS). Added for i960,
|
||||
which passes args in regs then copies to frame. */
|
||||
/* Not used; catches errors */
|
||||
|
||||
LOC_UNDEF,
|
||||
|
||||
/* Value is constant int SYMBOL_VALUE, host byteorder */
|
||||
|
||||
LOC_CONST,
|
||||
|
||||
/* Value is at fixed address SYMBOL_VALUE_ADDRESS */
|
||||
|
||||
LOC_STATIC,
|
||||
|
||||
/* Value is in register */
|
||||
|
||||
LOC_REGISTER,
|
||||
|
||||
/* Value is at spec'd offset in arglist */
|
||||
|
||||
LOC_ARG,
|
||||
|
||||
/* Value address is at spec'd offset in arglist. */
|
||||
|
||||
LOC_REF_ARG,
|
||||
|
||||
/* Value is at spec'd offset in register window */
|
||||
|
||||
LOC_REGPARM,
|
||||
|
||||
/* Value is at spec'd offset in stack frame */
|
||||
|
||||
LOC_LOCAL,
|
||||
|
||||
/* Value not used; definition in SYMBOL_TYPE. Symbols in the namespace
|
||||
STRUCT_NAMESPACE all have this class. */
|
||||
|
||||
LOC_TYPEDEF,
|
||||
|
||||
/* Value is address SYMBOL_VALUE_ADDRESS in the code */
|
||||
|
||||
LOC_LABEL,
|
||||
|
||||
/* Value is address SYMBOL_VALUE_BLOCK of a `struct block'. Function names
|
||||
have this class. */
|
||||
|
||||
LOC_BLOCK,
|
||||
|
||||
/* Value is a constant byte-sequence pointed to by SYMBOL_VALUE_ADDRESS, in
|
||||
target byte order. */
|
||||
|
||||
LOC_CONST_BYTES,
|
||||
|
||||
/* Value is arg at spec'd offset in stack frame. Differs from LOC_LOCAL in
|
||||
that symbol is an argument; differs from LOC_ARG in that we find it
|
||||
in the frame (FRAME_LOCALS_ADDRESS), not in the arglist
|
||||
(FRAME_ARGS_ADDRESS). Added for i960, which passes args in regs then
|
||||
copies to frame. */
|
||||
|
||||
LOC_LOCAL_ARG
|
||||
|
||||
};
|
||||
|
||||
struct symbol
|
||||
{
|
||||
/* Symbol name */
|
||||
char *name;
|
||||
|
||||
/* The general symbol info required for all types of symbols. */
|
||||
|
||||
struct general_symbol_info ginfo;
|
||||
|
||||
/* Name space code. */
|
||||
|
||||
enum namespace namespace;
|
||||
|
||||
/* Address class */
|
||||
|
||||
enum address_class class;
|
||||
|
||||
/* Data type of value */
|
||||
|
||||
struct type *type;
|
||||
|
||||
/* Line number of definition. */
|
||||
/* Line number of definition. FIXME: Should we really make the assumption
|
||||
that nobody will try to debug files longer than 64K lines? What about
|
||||
machine generated programs? */
|
||||
|
||||
unsigned short line;
|
||||
|
||||
/* constant value, or address if static, or register number,
|
||||
or offset in arguments, or offset in stack frame. All of
|
||||
these are in host byte order (though what they point to might
|
||||
be in target byte order, e.g. LOC_CONST_BYTES). */
|
||||
union
|
||||
{
|
||||
long value; /* for LOC_CONST, LOC_REGISTER, LOC_ARG,
|
||||
LOC_REF_ARG, LOC_REGPARM, LOC_LOCAL */
|
||||
struct block *block; /* for LOC_BLOCK */
|
||||
char *bytes; /* for LOC_CONST_BYTES */
|
||||
CORE_ADDR address; /* for LOC_STATIC, LOC_LABEL */
|
||||
struct symbol *chain; /* for opaque typedef struct chain */
|
||||
}
|
||||
value;
|
||||
|
||||
/* Some symbols require an additional value to be recorded on a per-
|
||||
symbol basis. Stash those values here. */
|
||||
|
||||
union
|
||||
{
|
||||
struct /* for OP_BASEREG in DWARF location specs */
|
||||
/* for OP_BASEREG in DWARF location specs */
|
||||
struct
|
||||
{
|
||||
short regno_valid; /* 0 == regno invalid; !0 == regno valid */
|
||||
short regno; /* base register number {0, 1, 2, ...} */
|
||||
} basereg;
|
||||
}
|
||||
aux_value;
|
||||
|
||||
};
|
||||
|
||||
#define SYMBOL_NAMESPACE(symbol) (symbol)->namespace
|
||||
#define SYMBOL_CLASS(symbol) (symbol)->class
|
||||
#define SYMBOL_TYPE(symbol) (symbol)->type
|
||||
#define SYMBOL_LINE(symbol) (symbol)->line
|
||||
#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg.regno
|
||||
|
||||
/* This currently fails because some symbols are not being initialized
|
||||
to zero on allocation, and no code is currently setting this value.
|
||||
Basereg handling will probably change significantly in the next release.
|
||||
FIXME -fnf */
|
||||
|
||||
#if 0
|
||||
#define SYMBOL_BASEREG_VALID(symbol) (symbol)->aux_value.basereg.regno_valid
|
||||
#else
|
||||
#define SYMBOL_BASEREG_VALID(symbol) 0
|
||||
#endif
|
||||
|
||||
|
||||
/* A partial_symbol records the name, namespace, and address class of
|
||||
symbols whose types we have not parsed yet. For functions, it also
|
||||
contains their memory address, so we can find them from a PC value.
|
||||
@@ -275,28 +478,27 @@ struct symbol
|
||||
|
||||
struct partial_symbol
|
||||
{
|
||||
/* Symbol name */
|
||||
char *name;
|
||||
|
||||
/* The general symbol info required for all types of symbols. */
|
||||
|
||||
struct general_symbol_info ginfo;
|
||||
|
||||
/* Name space code. */
|
||||
|
||||
enum namespace namespace;
|
||||
|
||||
/* Address class (for info_symbols) */
|
||||
|
||||
enum address_class class;
|
||||
/* Value (only used for static functions currently). Done this
|
||||
way so that we can use the struct symbol macros.
|
||||
Note that the address of a function is SYMBOL_VALUE_ADDRESS (pst)
|
||||
in a partial symbol table, but BLOCK_START (SYMBOL_BLOCK_VALUE (st))
|
||||
in a symbol table. */
|
||||
union
|
||||
{
|
||||
long value;
|
||||
CORE_ADDR address;
|
||||
}
|
||||
value;
|
||||
|
||||
};
|
||||
|
||||
#define PSYMBOL_NAMESPACE(psymbol) (psymbol)->namespace
|
||||
#define PSYMBOL_CLASS(psymbol) (psymbol)->class
|
||||
|
||||
|
||||
/* Source-file information.
|
||||
This describes the relation between source files and line numbers
|
||||
and addresses in the program text. */
|
||||
/* Source-file information. This describes the relation between source files,
|
||||
ine numbers and addresses in the program text. */
|
||||
|
||||
struct sourcevector
|
||||
{
|
||||
@@ -356,50 +558,84 @@ struct section_offsets
|
||||
|
||||
struct symtab
|
||||
{
|
||||
|
||||
/* Chain of all existing symtabs. */
|
||||
|
||||
struct symtab *next;
|
||||
|
||||
/* List of all symbol scope blocks for this symtab. */
|
||||
|
||||
struct blockvector *blockvector;
|
||||
|
||||
/* Table mapping core addresses to line numbers for this file.
|
||||
Can be NULL if none. */
|
||||
|
||||
struct linetable *linetable;
|
||||
|
||||
/* Name of this source file. */
|
||||
|
||||
char *filename;
|
||||
|
||||
/* Directory in which it was compiled, or NULL if we don't know. */
|
||||
|
||||
char *dirname;
|
||||
|
||||
/* This component says how to free the data we point to:
|
||||
free_contents => do a tree walk and free each object.
|
||||
free_nothing => do nothing; some other symtab will free
|
||||
the data this one uses.
|
||||
free_linetable => free just the linetable. */
|
||||
enum free_code {free_nothing, free_contents, free_linetable}
|
||||
free_code;
|
||||
free_linetable => free just the linetable. */
|
||||
|
||||
enum free_code
|
||||
{
|
||||
free_nothing, free_contents, free_linetable
|
||||
}
|
||||
free_code;
|
||||
|
||||
/* Pointer to one block of storage to be freed, if nonzero. */
|
||||
/* This is IN ADDITION to the action indicated by free_code. */
|
||||
|
||||
char *free_ptr;
|
||||
|
||||
/* Total number of lines found in source file. */
|
||||
|
||||
int nlines;
|
||||
|
||||
/* Array mapping line number to character position. */
|
||||
|
||||
int *line_charpos;
|
||||
|
||||
/* Language of this source file. */
|
||||
|
||||
enum language language;
|
||||
|
||||
/* String of version information. May be zero. */
|
||||
|
||||
char *version;
|
||||
|
||||
/* Full name of file as found by searching the source path.
|
||||
0 if not yet known. */
|
||||
NULL if not yet known. */
|
||||
|
||||
char *fullname;
|
||||
|
||||
/* Object file from which this symbol information was read. */
|
||||
|
||||
struct objfile *objfile;
|
||||
|
||||
/* Anything extra for this symtab. This is for target machines
|
||||
with special debugging info of some sort (which cannot just
|
||||
be represented in a normal symtab). */
|
||||
|
||||
#if defined (EXTRA_SYMTAB_INFO)
|
||||
EXTRA_SYMTAB_INFO
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
#define BLOCKVECTOR(symtab) (symtab)->blockvector
|
||||
#define LINETABLE(symtab) (symtab)->linetable
|
||||
|
||||
|
||||
/* Each source file that has not been fully read in is represented by
|
||||
a partial_symtab. This contains the information on where in the
|
||||
executable the debugging symbols for a specific file are, and a
|
||||
@@ -413,31 +649,46 @@ struct symtab
|
||||
|
||||
struct partial_symtab
|
||||
{
|
||||
|
||||
/* Chain of all existing partial symtabs. */
|
||||
|
||||
struct partial_symtab *next;
|
||||
|
||||
/* Name of the source file which this partial_symtab defines */
|
||||
|
||||
char *filename;
|
||||
|
||||
/* Information about the object file from which symbols should be read. */
|
||||
|
||||
struct objfile *objfile;
|
||||
|
||||
/* Set of relocation offsets to apply to each section. */
|
||||
|
||||
struct section_offsets *section_offsets;
|
||||
|
||||
/* Range of text addresses covered by this file; texthigh is the
|
||||
beginning of the next section. */
|
||||
CORE_ADDR textlow, texthigh;
|
||||
|
||||
CORE_ADDR textlow;
|
||||
CORE_ADDR texthigh;
|
||||
|
||||
/* Array of pointers to all of the partial_symtab's which this one
|
||||
depends on. Since this array can only be set to previous or
|
||||
the current (?) psymtab, this dependency tree is guaranteed not
|
||||
to have any loops. */
|
||||
|
||||
struct partial_symtab **dependencies;
|
||||
|
||||
int number_of_dependencies;
|
||||
|
||||
/* Global symbol list. This list will be sorted after readin to
|
||||
improve access. Binary search will be the usual method of
|
||||
finding a symbol within it. globals_offset is an integer offset
|
||||
within global_psymbols[]. */
|
||||
int globals_offset, n_global_syms;
|
||||
|
||||
int globals_offset;
|
||||
int n_global_syms;
|
||||
|
||||
/* Static symbol list. This list will *not* be sorted after readin;
|
||||
to find a symbol in it, exhaustive search must be used. This is
|
||||
reasonable because searches through this list will eventually
|
||||
@@ -445,80 +696,40 @@ struct partial_symtab
|
||||
to take a *lot* of time; check) or an error (and we don't care
|
||||
how long errors take). This is an offset and size within
|
||||
static_psymbols[]. */
|
||||
int statics_offset, n_static_syms;
|
||||
|
||||
int statics_offset;
|
||||
int n_static_syms;
|
||||
|
||||
/* Pointer to symtab eventually allocated for this source file, 0 if
|
||||
!readin or if we haven't looked for the symtab after it was readin. */
|
||||
|
||||
struct symtab *symtab;
|
||||
|
||||
/* Pointer to function which will read in the symtab corresponding to
|
||||
this psymtab. */
|
||||
|
||||
void (*read_symtab) PARAMS ((struct partial_symtab *));
|
||||
|
||||
/* Information that lets read_symtab() locate the part of the symbol table
|
||||
that this psymtab corresponds to. This information is private to the
|
||||
format-dependent symbol reading routines. For further detail examine
|
||||
the various symbol reading modules. Should really be (void *) but is
|
||||
(char *) as with other such gdb variables. (FIXME) */
|
||||
|
||||
char *read_symtab_private;
|
||||
/* Non-zero if the symtab corresponding to this psymtab has been
|
||||
readin */
|
||||
|
||||
/* Non-zero if the symtab corresponding to this psymtab has been readin */
|
||||
|
||||
unsigned char readin;
|
||||
};
|
||||
|
||||
/* A fast way to get from a psymtab to its symtab (after the first time). */
|
||||
#define PSYMTAB_TO_SYMTAB(pst) ((pst)->symtab? \
|
||||
(pst)->symtab: \
|
||||
psymtab_to_symtab (pst) )
|
||||
#define PSYMTAB_TO_SYMTAB(pst) \
|
||||
((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
|
||||
|
||||
/* This symtab variable specifies the current file for printing source lines */
|
||||
|
||||
extern struct symtab *current_source_symtab;
|
||||
|
||||
/* This is the next line to print for listing source lines. */
|
||||
|
||||
extern int current_source_line;
|
||||
|
||||
#define BLOCKVECTOR(symtab) (symtab)->blockvector
|
||||
|
||||
#define LINETABLE(symtab) (symtab)->linetable
|
||||
|
||||
/* Macros normally used to access components of symbol table structures. */
|
||||
|
||||
#define BLOCKVECTOR_NBLOCKS(blocklist) (blocklist)->nblocks
|
||||
#define BLOCKVECTOR_BLOCK(blocklist,n) (blocklist)->block[n]
|
||||
|
||||
#define BLOCK_START(bl) (bl)->startaddr
|
||||
#define BLOCK_END(bl) (bl)->endaddr
|
||||
#define BLOCK_NSYMS(bl) (bl)->nsyms
|
||||
#define BLOCK_SYM(bl, n) (bl)->sym[n]
|
||||
#define BLOCK_FUNCTION(bl) (bl)->function
|
||||
#define BLOCK_SUPERBLOCK(bl) (bl)->superblock
|
||||
#define BLOCK_GCC_COMPILED(bl) (bl)->gcc_compile_flag
|
||||
|
||||
/* Nonzero if symbols of block BL should be sorted alphabetically. */
|
||||
#define BLOCK_SHOULD_SORT(bl) ((bl)->nsyms >= 40)
|
||||
|
||||
#define SYMBOL_NAME(symbol) (symbol)->name
|
||||
#define SYMBOL_NAMESPACE(symbol) (symbol)->namespace
|
||||
#define SYMBOL_CLASS(symbol) (symbol)->class
|
||||
#define SYMBOL_VALUE(symbol) (symbol)->value.value
|
||||
#define SYMBOL_VALUE_ADDRESS(symbol) (symbol)->value.address
|
||||
#define SYMBOL_VALUE_BYTES(symbol) (symbol)->value.bytes
|
||||
#define SYMBOL_BLOCK_VALUE(symbol) (symbol)->value.block
|
||||
#define SYMBOL_VALUE_CHAIN(symbol) (symbol)->value.chain
|
||||
#define SYMBOL_TYPE(symbol) (symbol)->type
|
||||
#define SYMBOL_LINE(symbol) (symbol)->line
|
||||
#if 0
|
||||
/* This currently fails because some symbols are not being initialized
|
||||
to zero on allocation, and no code is currently setting this value.
|
||||
Basereg handling will probably change significantly in the next release.
|
||||
FIXME -fnf */
|
||||
#define SYMBOL_BASEREG_VALID(symbol) (symbol)->aux_value.basereg.regno_valid
|
||||
#else
|
||||
#define SYMBOL_BASEREG_VALID(symbol) 0
|
||||
#endif
|
||||
#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg.regno
|
||||
|
||||
/* The virtual function table is now an array of structures
|
||||
which have the form { int16 offset, delta; void *pfn; }.
|
||||
/* The virtual function table is now an array of structures which have the
|
||||
form { int16 offset, delta; void *pfn; }.
|
||||
|
||||
In normal virtual function tables, OFFSET is unused.
|
||||
DELTA is the amount which is added to the apparent object's base
|
||||
@@ -528,19 +739,31 @@ extern int current_source_line;
|
||||
|
||||
#define VTBL_FNADDR_OFFSET 2
|
||||
|
||||
/* Macro that yields non-zero value iff NAME is the prefix
|
||||
for C++ operator names. If you leave out the parenthesis
|
||||
here you will lose!
|
||||
|
||||
/* Macro that yields non-zero value iff NAME is the prefix for C++ operator
|
||||
names. If you leave out the parenthesis here you will lose!
|
||||
Currently 'o' 'p' CPLUS_MARKER is used for both the symbol in the
|
||||
symbol-file and the names in gdb's symbol table. */
|
||||
#define OPNAME_PREFIX_P(NAME) ((NAME)[0] == 'o' && (NAME)[1] == 'p' \
|
||||
&& (NAME)[2] == CPLUS_MARKER)
|
||||
|
||||
#define VTBL_PREFIX_P(NAME) ((NAME)[3] == CPLUS_MARKER \
|
||||
&& !strncmp ((NAME), "_vt", 3))
|
||||
#define OPNAME_PREFIX_P(NAME) \
|
||||
((NAME)[0] == 'o' && (NAME)[1] == 'p' && (NAME)[2] == CPLUS_MARKER)
|
||||
|
||||
#define VTBL_PREFIX_P(NAME) \
|
||||
((NAME)[3] == CPLUS_MARKER && !strncmp ((NAME), "_vt", 3))
|
||||
|
||||
|
||||
/* Functions that work on the objects described above */
|
||||
/* External variables and functions for the objects described above. */
|
||||
|
||||
/* This symtab variable specifies the current file for printing source lines */
|
||||
|
||||
extern struct symtab *current_source_symtab;
|
||||
|
||||
/* This is the next line to print for listing source lines. */
|
||||
|
||||
extern int current_source_line;
|
||||
|
||||
/* See the comment in symfile.c about how current_objfile is used. */
|
||||
|
||||
extern struct objfile *current_objfile;
|
||||
|
||||
extern struct symtab *
|
||||
lookup_symtab PARAMS ((char *));
|
||||
@@ -562,15 +785,6 @@ lookup_union PARAMS ((char *, struct block *));
|
||||
extern struct type *
|
||||
lookup_enum PARAMS ((char *, struct block *));
|
||||
|
||||
extern struct type *
|
||||
check_struct PARAMS ((struct type *));
|
||||
|
||||
extern struct type *
|
||||
check_union PARAMS ((struct type *));
|
||||
|
||||
extern struct type *
|
||||
check_enum PARAMS ((struct type *));
|
||||
|
||||
extern struct symbol *
|
||||
block_function PARAMS ((struct block *));
|
||||
|
||||
@@ -645,9 +859,8 @@ struct symtabs_and_lines
|
||||
int nelts;
|
||||
};
|
||||
|
||||
/* Given a pc value, return line number it is in.
|
||||
Second arg nonzero means if pc is on the boundary
|
||||
use the previous statement's line number. */
|
||||
/* Given a pc value, return line number it is in. Second arg nonzero means
|
||||
if pc is on the boundary use the previous statement's line number. */
|
||||
|
||||
extern struct symtab_and_line
|
||||
find_pc_line PARAMS ((CORE_ADDR, int));
|
||||
@@ -663,8 +876,8 @@ find_line_pc_range PARAMS ((struct symtab *, int, CORE_ADDR *, CORE_ADDR *));
|
||||
extern void
|
||||
resolve_sal_pc PARAMS ((struct symtab_and_line *));
|
||||
|
||||
/* Given a string, return the line specified by it.
|
||||
For commands like "list" and "breakpoint". */
|
||||
/* Given a string, return the line specified by it. For commands like "list"
|
||||
and "breakpoint". */
|
||||
|
||||
extern struct symtabs_and_lines
|
||||
decode_line_spec PARAMS ((char *, int));
|
||||
@@ -732,9 +945,6 @@ clear_symtab_users_once PARAMS ((void));
|
||||
extern struct partial_symtab *
|
||||
find_main_psymtab PARAMS ((void));
|
||||
|
||||
extern struct type *
|
||||
find_nested_type PARAMS ((struct type *, char*));
|
||||
|
||||
/* blockframe.c */
|
||||
|
||||
extern struct blockvector *
|
||||
|
||||
Reference in New Issue
Block a user