/* Symbol table definitions for GDB.
- Copyright (C) 1986, 1989, 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1986, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
This file is part of GDB.
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
+/* Don't do this; it means that if some .o's are compiled with GNU C
+ and some are not (easy to do accidentally the way we configure
+ things; also it is a pain to have to "make clean" every time you
+ want to switch compilers), then GDB dies a horrible death. */
+/* GNU C supports enums that are bitfields. Some compilers don't. */
+#if 0 && defined(__GNUC__) && !defined(BYTE_BITFIELD)
+#define BYTE_BITFIELD :8;
+#else
+#define BYTE_BITFIELD /*nothing*/
+#endif
+
/* Define a structure for the information that is common to all symbol types,
- including minimal symbols, partial symbols, and full symbols. */
+ including minimal symbols, partial symbols, and full symbols. In a
+ multilanguage environment, some language specific information may need to
+ be recorded along with each symbol.
+
+ These fields are ordered to encourage good packing, since we frequently
+ have tens or hundreds of thousands of these. */
struct general_symbol_info
{
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. */
+ /* Value of the symbol. Which member of this union to use, and what
+ it means, depends on what kind of symbol this is and its
+ SYMBOL_CLASS. See comments there for more details. 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
{
- /* for LOC_CONST, LOC_REGISTER, LOC_ARG, LOC_REF_ARG, LOC_REGPARM,
- LOC_LOCAL */
-
- long value;
-
- /* for LOC_BLOCK */
+ /* The fact that this is a long not a LONGEST mainly limits the
+ range of a LOC_CONST. Since LOC_CONST_BYTES exists, I'm not
+ sure that is a big deal. */
+ long ivalue;
struct block *block;
- /* for LOC_CONST_BYTES */
-
char *bytes;
- /* for LOC_STATIC, LOC_LABEL */
-
CORE_ADDR address;
/* for opaque typedef struct chain */
}
value;
- /* In a multilanguage environment, some language specific information may
- need to be recorded along with each symbol. */
+ /* Since one and only one language can apply, wrap the language specific
+ information inside a union. */
- struct language_dependent_info
+ union
{
+ struct cplus_specific /* For C++ */
+ {
+ char *demangled_name;
+ } cplus_specific;
+ struct chill_specific /* For Chill */
+ {
+ char *demangled_name;
+ } chill_specific;
+ } language_specific;
- /* Record the language that this information applies to. */
-
- enum language language;
+ /* Record the source code language that applies to this symbol.
+ This is used to select one of the fields from the language specific
+ union above. */
- /* Since one and only one language can apply, wrap the information inside
- a union. */
-
- union lang_specific
- {
- /* For C++ */
- struct cplus_specific
- {
- char *demangled_name;
- } cplus_specific;
- /* For Chill */
- struct chill_specific
- {
- char *demangled_name;
- } chill_specific;
- } lang_u;
- } lang_specific;
+ enum language language BYTE_BITFIELD;
/* Which section is this symbol in? This is an index into
section_offsets for this objfile. Negative means that the symbol
- does not get relocated relative to a section. */
- /* Disclaimer: currently this is just used for xcoff, so don't expect
- all symbol-reading code to set it correctly. */
- int section;
+ does not get relocated relative to a section.
+ Disclaimer: currently this is just used for xcoff, so don't
+ expect all symbol-reading code to set it correctly (the ELF code
+ also tries to set it correctly). */
+
+ short section;
};
#define SYMBOL_NAME(symbol) (symbol)->ginfo.name
-#define SYMBOL_VALUE(symbol) (symbol)->ginfo.value.value
+#define SYMBOL_VALUE(symbol) (symbol)->ginfo.value.ivalue
#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_LANGUAGE(symbol) (symbol)->ginfo.language
#define SYMBOL_SECTION(symbol) (symbol)->ginfo.section
#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol) \
- (symbol)->ginfo.lang_specific.lang_u.cplus_specific.demangled_name
+ (symbol)->ginfo.language_specific.cplus_specific.demangled_name
extern int demangle; /* We reference it, so go ahead and declare it. */
} \
else \
{ \
- memset (&(symbol)->ginfo.lang_specific.lang_u, 0, \
- sizeof ((symbol)->ginfo.lang_specific.lang_u)); \
+ memset (&(symbol)->ginfo.language_specific, 0, \
+ sizeof ((symbol)->ginfo.language_specific)); \
} \
} while (0)
: NULL))
#define SYMBOL_CHILL_DEMANGLED_NAME(symbol) \
- (symbol)->ginfo.lang_specific.lang_u.chill_specific.demangled_name
+ (symbol)->ginfo.language_specific.chill_specific.demangled_name
/* 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
? SYMBOL_DEMANGLED_NAME (symbol) \
: SYMBOL_NAME (symbol))
+/* From utils.c. */
+extern int demangle;
+extern int asm_demangle;
+
/* 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
struct minimal_symbol
{
- /* The general symbol info required for all types of symbols. */
+ /* The general symbol info required for all types of symbols.
+
+ The SYMBOL_VALUE_ADDRESS contains the address that this symbol
+ corresponds to. */
struct general_symbol_info ginfo;
mst_text, /* Generally executable instructions */
mst_data, /* Generally initialized data */
mst_bss, /* Generally uninitialized data */
- mst_abs /* Generally absolute (nonrelocatable) */
- } type;
+ mst_abs, /* Generally absolute (nonrelocatable) */
+ /* GDB uses mst_solib_trampoline for the start address of a shared
+ library trampoline entry. Breakpoints for shared library functions
+ are put there if the shared library is not yet loaded.
+ After the shared library is loaded, lookup_minimal_symbol will
+ prefer the minimal symbol from the shared library (usually
+ a mst_text symbol) over the mst_solib_trampoline symbol, and the
+ breakpoints will be moved to their true address in the shared
+ library via breakpoint_re_set. */
+ mst_solib_trampoline, /* Shared library trampoline code */
+ /* For the mst_file* types, the names are only guaranteed to be unique
+ within a given .o file. */
+ mst_file_text, /* Static version of mst_text */
+ mst_file_data, /* Static version of mst_data */
+ mst_file_bss /* Static version of mst_bss */
+ } type BYTE_BITFIELD;
};
int nsyms;
- /* The symbols. */
+ /* The symbols. If some of them are arguments, then they must be
+ in the order in which we would like to print them. */
struct symbol *sym[1];
};
#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. */
+/* Nonzero if symbols of block BL should be sorted alphabetically.
+ Don't sort a block which corresponds to a function. If we did the
+ sorting would have to preserve the order of the symbols for the
+ arguments. */
-#define BLOCK_SHOULD_SORT(bl) ((bl)->nsyms >= 40)
+#define BLOCK_SHOULD_SORT(bl) ((bl)->nsyms >= 40 && BLOCK_FUNCTION (bl) == NULL)
\f
/* Represent one symbol name; a variable, constant, function or typedef. */
LOC_STATIC,
- /* Value is in register */
+ /* Value is in register. SYMBOL_VALUE is the register number. */
LOC_REGISTER,
- /* Value is at spec'd offset in arglist */
+ /* It's an argument; the value is at SYMBOL_VALUE offset in arglist. */
LOC_ARG,
- /* Value address is at spec'd offset in arglist. Currently this is used
- for C++ references (and presumably will be used for Pascal VAR
- parameters), and is only dereferenced in certain contexts. */
+ /* Value address is at SYMBOL_VALUE offset in arglist. */
LOC_REF_ARG,
- /* Value is in specified register. Just like LOC_REGISTER except this is
- an argument. Probably the cleaner way to handle this would be to
- separate address_class (which would include separate ARG and LOCAL
- to deal with FRAME_ARGS_ADDRESS versus FRAME_LOCALS_ADDRESS), and
- an is_argument flag.
+ /* Value is in register number SYMBOL_VALUE. Just like LOC_REGISTER
+ except this is an argument. Probably the cleaner way to handle
+ this would be to separate address_class (which would include
+ separate ARG and LOCAL to deal with FRAME_ARGS_ADDRESS versus
+ FRAME_LOCALS_ADDRESS), and an is_argument flag.
For some symbol formats (stabs, for some compilers at least),
- gdb generates a LOC_ARG and a LOC_REGISTER rather than a LOC_REGPARM.
- This is because that's what the compiler does, but perhaps it would
- be better if the symbol-reading code detected this (is it possible?)
- and generated a LOC_REGPARM. */
+ the compiler generates two symbols, an argument and a register.
+ In some cases we combine them to a single LOC_REGPARM in symbol
+ reading, but currently not for all cases (e.g. it's passed on the
+ stack and then loaded into a register). */
LOC_REGPARM,
- /* Value is at spec'd offset in stack frame */
+ /* Value is in specified register. Just like LOC_REGPARM except the
+ register holds the address of the argument instead of the argument
+ itself. This is currently used for the passing of structs and unions
+ on sparc and hppa. It is also used for call by reference where the
+ address is in a register, at least by mipsread.c. */
+
+ LOC_REGPARM_ADDR,
+
+ /* Value is a local variable at SYMBOL_VALUE offset in stack frame. */
LOC_LOCAL,
LOC_LABEL,
- /* Value is address SYMBOL_VALUE_BLOCK of a `struct block'. Function names
- have this class. */
+ /* In a symbol table, value is SYMBOL_BLOCK_VALUE of a `struct block'.
+ In a partial symbol table, SYMBOL_VALUE_ADDRESS is the start address
+ of the block. Function names have this class. */
LOC_BLOCK,
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. */
+ /* Value is arg at SYMBOL_VALUE 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,
+ /* Value is at SYMBOL_VALUE offset from the current value of
+ register number SYMBOL_BASEREG. This exists mainly for the same
+ things that LOC_LOCAL and LOC_ARG do; but we need to do this
+ instead because on 88k DWARF gives us the offset from the
+ frame/stack pointer, rather than the offset from the "canonical
+ frame address" used by COFF, stabs, etc., and we don't know how
+ to convert between these until we start examining prologues.
+
+ Note that LOC_BASEREG is much less general than a DWARF expression.
+ We don't need the generality (at least not yet), and storing a general
+ DWARF expression would presumably take up more space than the existing
+ scheme. */
+
+ LOC_BASEREG,
+
+ /* Same as LOC_BASEREG but it is an argument. */
+
+ LOC_BASEREG_ARG,
+
/* The variable does not actually exist in the program.
- The SYMBOL_VALUE is ignored. */
+ The value is ignored. */
LOC_OPTIMIZED_OUT
};
struct general_symbol_info ginfo;
- /* Name space code. */
+ /* Data type of value */
- enum namespace namespace;
+ struct type *type;
- /* Address class */
+ /* Name space code. */
- enum address_class class;
+ enum namespace namespace BYTE_BITFIELD;
- /* Data type of value */
+ /* Address class */
- struct type *type;
+ enum address_class class BYTE_BITFIELD;
/* Line number of definition. FIXME: Should we really make the assumption
that nobody will try to debug files longer than 64K lines? What about
union
{
- /* 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;
+ /* Used by LOC_BASEREG and LOC_BASEREG_ARG. */
+ short 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
-
+#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg
\f
/* A partial_symbol records the name, namespace, and address class of
symbols whose types we have not parsed yet. For functions, it also
/* Name space code. */
- enum namespace namespace;
+ enum namespace namespace BYTE_BITFIELD;
/* Address class (for info_symbols) */
- enum address_class class;
+ enum address_class class BYTE_BITFIELD;
};
CORE_ADDR pc;
};
+/* The order of entries in the linetable is significant. They should
+ be sorted by increasing values of the pc field. If there is more than
+ one entry for a given pc, then I'm not sure what should happen (and
+ I not sure whether we currently handle it the best way).
+
+ Example: a C for statement generally looks like this
+
+ 10 0x100 - for the init/test part of a for stmt.
+ 20 0x200
+ 30 0x300
+ 10 0x400 - for the increment part of a for stmt.
+
+ */
+
struct linetable
{
int nitems;
+
+ /* Actually NITEMS elements. If you don't like this use of the
+ `struct hack', you can shove it up your ANSI (seriously, if the
+ committee tells us how to do it, we can probably go along). */
struct linetable_entry item[1];
};
#define ANOFFSET(secoff, whichone) (secoff->offsets[whichone])
-/* Each source file is represented by a struct symtab.
+/* Each source file or header is represented by a struct symtab.
These objects are chained through the `next' field. */
struct symtab
struct symtab *next;
- /* List of all symbol scope blocks for this symtab. */
+ /* List of all symbol scope blocks for this symtab. May be shared
+ between different symtabs (and normally is for all the symtabs
+ in a given compilation unit). */
struct blockvector *blockvector;
/* Table mapping core addresses to line numbers for this file.
- Can be NULL if none. */
+ Can be NULL if none. Never shared between different symtabs. */
struct linetable *linetable;
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. */
+ free_linetable => free just the linetable. FIXME: Is this redundant
+ with the primary field? */
enum free_code
{
int nlines;
- /* Array mapping line number to character position. */
+ /* line_charpos[N] is the position of the (N-1)th line of the
+ source file. "position" means something we can lseek() to; it
+ is not guaranteed to be useful any other way. */
int *line_charpos;
/* 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. */
+ to have any loops. "depends on" means that symbols must be read
+ for the dependencies before being read for this psymtab; this is
+ for type references in stabs, where if foo.c includes foo.h, declarations
+ in foo.h may use type numbers defined in foo.c. For other debugging
+ formats there may be no need to use dependencies. */
struct partial_symtab **dependencies;
extern struct symbol *
find_pc_function PARAMS ((CORE_ADDR));
-extern int
-find_pc_partial_function PARAMS ((CORE_ADDR, char **, CORE_ADDR *));
+extern int find_pc_partial_function
+ PARAMS ((CORE_ADDR, char **, CORE_ADDR *, CORE_ADDR *));
extern void
clear_pc_function_cache PARAMS ((void));
extern void
reread_symbols PARAMS ((void));
+/* Macro for name of symbol to indicate a file compiled with gcc. */
+#ifndef GCC_COMPILED_FLAG_SYMBOL
+#define GCC_COMPILED_FLAG_SYMBOL "gcc_compiled."
+#endif
+
+/* Macro for name of symbol to indicate a file compiled with gcc2. */
+#ifndef GCC2_COMPILED_FLAG_SYMBOL
+#define GCC2_COMPILED_FLAG_SYMBOL "gcc2_compiled."
+#endif
+
/* Functions for dealing with the minimal symbol table, really a misc
address<->symbol mapping for things we don't have debug symbols for. */
-extern void
-prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
- enum minimal_symbol_type));
+extern void prim_record_minimal_symbol PARAMS ((const char *, CORE_ADDR,
+ enum minimal_symbol_type,
+ struct objfile *));
-extern void
-prim_record_minimal_symbol_and_info PARAMS ((const char *, CORE_ADDR,
- enum minimal_symbol_type,
- char *info, int section));
+extern void prim_record_minimal_symbol_and_info
+ PARAMS ((const char *, CORE_ADDR,
+ enum minimal_symbol_type,
+ char *info, int section,
+ struct objfile *));
extern struct minimal_symbol *
lookup_minimal_symbol PARAMS ((const char *, struct objfile *));
extern struct minimal_symbol *
lookup_minimal_symbol_by_pc PARAMS ((CORE_ADDR));
+extern struct minimal_symbol *
+lookup_solib_trampoline_symbol_by_pc PARAMS ((CORE_ADDR));
+
+extern CORE_ADDR
+find_solib_trampoline_target PARAMS ((CORE_ADDR));
+
extern void
init_minimal_symbol_collection PARAMS ((void));
struct symtab_and_line
{
struct symtab *symtab;
+
+ /* Line number. Line numbers start at 1 and proceed through symtab->nlines.
+ 0 is never a valid line number; it is used to indicate that line number
+ information is not available. */
int line;
+
CORE_ADDR pc;
CORE_ADDR end;
};
extern struct symtab_and_line
find_pc_line PARAMS ((CORE_ADDR, int));
+/* Given an address, return the nearest symbol at or below it in memory.
+ Optionally return the symtab it's from through 2nd arg, and the
+ address in inferior memory of the symbol through 3rd arg. */
+
+extern struct symbol *
+find_addr_symbol PARAMS ((CORE_ADDR, struct symtab **, CORE_ADDR *));
+
/* Given a symtab and line number, return the pc there. */
extern CORE_ADDR
find_line_pc PARAMS ((struct symtab *, int));
extern int
-find_line_pc_range PARAMS ((struct symtab *, int, CORE_ADDR *, CORE_ADDR *));
+find_line_pc_range PARAMS ((struct symtab_and_line,
+ CORE_ADDR *, CORE_ADDR *));
extern void
resolve_sal_pc PARAMS ((struct symtab_and_line *));
decode_line_spec_1 PARAMS ((char *, int));
extern struct symtabs_and_lines
-decode_line_1 PARAMS ((char **, int, struct symtab *, int));
+decode_line_1 PARAMS ((char **, int, struct symtab *, int, char ***));
/* Symmisc.c */
void
maintenance_print_objfiles PARAMS ((char *, int));
+void
+maintenance_check_symtabs PARAMS ((char *, int));
+
#endif
extern void
/* source.c */
+extern int frame_file_full_name; /* in stack.c */
+
extern int
-identify_source_line PARAMS ((struct symtab *, int, int));
+identify_source_line PARAMS ((struct symtab *, int, int, CORE_ADDR));
extern void
print_source_lines PARAMS ((struct symtab *, int, int, int));
extern void
select_source_symtab PARAMS ((struct symtab *));
-extern char **
-make_symbol_completion_list PARAMS ((char *));
+extern char **make_symbol_completion_list PARAMS ((char *, char *));
/* symtab.c */
-extern void
-clear_symtab_users_once PARAMS ((void));
-
extern struct partial_symtab *
find_main_psymtab PARAMS ((void));
/* symfile.c */
+extern void
+clear_symtab_users PARAMS ((void));
+
extern enum language
deduce_language_from_filename PARAMS ((char *));