#include "obstack.h"
#define obstack_chunk_alloc xmalloc
#define obstack_chunk_free free
+#include "bcache.h"
/* 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
union
{
- struct cplus_specific /* For C++ */
+ struct cplus_specific /* For C++ and Java */
{
char *demangled_name;
} cplus_specific;
also tries to set it correctly). */
short section;
+
+ /* The bfd section associated with this symbol. */
+
+ asection *bfd_section;
};
+extern CORE_ADDR symbol_overlayed_address PARAMS((CORE_ADDR, asection *));
+
#define SYMBOL_NAME(symbol) (symbol)->ginfo.name
#define SYMBOL_VALUE(symbol) (symbol)->ginfo.value.ivalue
#define SYMBOL_VALUE_ADDRESS(symbol) (symbol)->ginfo.value.address
#define SYMBOL_VALUE_CHAIN(symbol) (symbol)->ginfo.value.chain
#define SYMBOL_LANGUAGE(symbol) (symbol)->ginfo.language
#define SYMBOL_SECTION(symbol) (symbol)->ginfo.section
+#define SYMBOL_BFD_SECTION(symbol) (symbol)->ginfo.bfd_section
#define SYMBOL_CPLUS_DEMANGLED_NAME(symbol) \
(symbol)->ginfo.language_specific.cplus_specific.demangled_name
#define SYMBOL_INIT_LANGUAGE_SPECIFIC(symbol,language) \
do { \
SYMBOL_LANGUAGE (symbol) = language; \
- if (SYMBOL_LANGUAGE (symbol) == language_cplus) \
+ if (SYMBOL_LANGUAGE (symbol) == language_cplus \
+ || SYMBOL_LANGUAGE (symbol) == language_java) \
{ \
SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL; \
} \
SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL; \
} \
} \
+ if (SYMBOL_LANGUAGE (symbol) == language_java) \
+ { \
+ demangled = \
+ cplus_demangle (SYMBOL_NAME (symbol), \
+ DMGL_PARAMS | DMGL_ANSI | DMGL_JAVA); \
+ if (demangled != NULL) \
+ { \
+ SYMBOL_LANGUAGE (symbol) = language_java; \
+ SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = \
+ obsavestring (demangled, strlen (demangled), (obstack)); \
+ free (demangled); \
+ } \
+ else \
+ { \
+ SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL; \
+ } \
+ } \
if (demangled == NULL \
&& (SYMBOL_LANGUAGE (symbol) == language_chill \
|| SYMBOL_LANGUAGE (symbol) == language_auto)) \
#define SYMBOL_DEMANGLED_NAME(symbol) \
(SYMBOL_LANGUAGE (symbol) == language_cplus \
+ || SYMBOL_LANGUAGE (symbol) == language_java \
? SYMBOL_CPLUS_DEMANGLED_NAME (symbol) \
: (SYMBOL_LANGUAGE (symbol) == language_chill \
? SYMBOL_CHILL_DEMANGLED_NAME (symbol) \
mst_file_data, /* Static version of mst_data */
mst_file_bss /* Static version of mst_bss */
} type BYTE_BITFIELD;
-
};
#define MSYMBOL_INFO(msymbol) (msymbol)->info
LOC_OPTIMIZED_OUT
};
+/* Linked list of symbol's live ranges. */
+
+struct live_range
+{
+ CORE_ADDR start;
+ CORE_ADDR end;
+ struct live_range *next;
+};
+
struct symbol
{
/* Name space code. */
+#ifdef __MFC4__
+ /* FIXME: don't conflict with C++'s namespace */
+ /* would be safer to do a global change for all namespace identifiers. */
+ #define namespace _namespace
+#endif
namespace_enum namespace BYTE_BITFIELD;
/* Address class */
short basereg;
}
aux_value;
+
+ /* Live range information (if present) for debugging of optimized code.
+ Gcc extensions were added to stabs to encode live range information.
+ The syntax for referencing (defining) symbol aliases is "#n" ("#n=")
+ where n is a number. The syntax for specifying a range is "l(#<m>,#<n>)",
+ where m and n are numbers.
+ aliases - list of other symbols which are lexically the same symbol,
+ but were optimized into different storage classes (eg. for the
+ local symbol "x", one symbol contains range information where x
+ is on the stack, while an alias contains the live ranges where x
+ is in a register).
+ range - list of instruction ranges where the symbol is live. */
+ struct live_range_info
+ {
+ struct symbol *aliases; /* Link to other aliases for this symbol. */
+ struct live_range *range; /* Linked list of live ranges. */
+ } live;
};
#define SYMBOL_NAMESPACE(symbol) (symbol)->namespace
#define SYMBOL_TYPE(symbol) (symbol)->type
#define SYMBOL_LINE(symbol) (symbol)->line
#define SYMBOL_BASEREG(symbol) (symbol)->aux_value.basereg
+#define SYMBOL_ALIASES(symbol) (symbol)->live.aliases
+#define SYMBOL_RANGE(symbol) (symbol)->live.range
+#define SYMBOL_RANGE_START(symbol) (symbol)->live.range->start
+#define SYMBOL_RANGE_END(symbol) (symbol)->live.range->end
+#define SYMBOL_RANGE_NEXT(symbol) (symbol)->live.range->next
\f
/* A partial_symbol records the name, namespace, and address class of
symbols whose types we have not parsed yet. For functions, it also
#define ANOFFSET(secoff, whichone) (secoff->offsets[whichone])
+/* The maximum possible size of a section_offsets table. */
+
+#define SIZEOF_SECTION_OFFSETS \
+ (sizeof (struct section_offsets) \
+ + sizeof (((struct section_offsets *) 0)->offsets) * (SECT_OFF_MAX-1))
+
+
/* Each source file or header is represented by a struct symtab.
These objects are chained through the `next' field. */
enum language language;
+ /* String that identifies the format of the debugging information, such
+ as "stabs", "dwarf 1", "dwarf 2", "coff", etc. This is mostly useful
+ for automated testing of gdb but may also be information that is
+ useful to the user. */
+
+ char *debugformat;
+
/* String of version information. May be zero. */
char *version;
extern int demangle;
extern int asm_demangle;
+/* symtab.c lookup functions */
+
+/* lookup a symbol table by source file name */
+
extern struct symtab *
lookup_symtab PARAMS ((char *));
+/* lookup a symbol by name (optional block, optional symtab) */
+
extern struct symbol *
lookup_symbol PARAMS ((const char *, const struct block *,
const namespace_enum, int *, struct symtab **));
+/* lookup a symbol by name, within a specified block */
+
extern struct symbol *
lookup_block_symbol PARAMS ((const struct block *, const char *,
const namespace_enum));
+/* lookup a [struct, union, enum] by name, within a specified block */
+
extern struct type *
lookup_struct PARAMS ((char *, struct block *));
extern struct type *
lookup_enum PARAMS ((char *, struct block *));
+/* lookup the function corresponding to the block */
+
extern struct symbol *
block_function PARAMS ((struct block *));
+/* from blockframe.c: */
+
+/* lookup the function symbol corresponding to the address */
+
extern struct symbol *
find_pc_function PARAMS ((CORE_ADDR));
-extern int find_pc_partial_function
- PARAMS ((CORE_ADDR, char **, CORE_ADDR *, CORE_ADDR *));
+/* lookup the function corresponding to the address and section */
+
+extern struct symbol *
+find_pc_sect_function PARAMS ((CORE_ADDR, asection *));
+
+/* lookup function from address, return name, start addr and end addr */
+
+extern int find_pc_partial_function PARAMS ((CORE_ADDR, char **,
+ CORE_ADDR *, CORE_ADDR *));
extern void
clear_pc_function_cache PARAMS ((void));
+/* from symtab.c: */
+
+/* lookup partial symbol table by filename */
+
extern struct partial_symtab *
lookup_partial_symtab PARAMS ((char *));
+/* lookup partial symbol table by address */
+
extern struct partial_symtab *
find_pc_psymtab PARAMS ((CORE_ADDR));
+/* lookup partial symbol table by address and section */
+
+extern struct partial_symtab *
+find_pc_sect_psymtab PARAMS ((CORE_ADDR, asection *));
+
+/* lookup full symbol table by address */
+
extern struct symtab *
find_pc_symtab PARAMS ((CORE_ADDR));
+/* lookup full symbol table by address and section */
+
+extern struct symtab *
+find_pc_sect_symtab PARAMS ((CORE_ADDR, asection *));
+
+/* lookup partial symbol by address */
+
extern struct partial_symbol *
find_pc_psymbol PARAMS ((struct partial_symtab *, CORE_ADDR));
+/* lookup partial symbol by address and section */
+
+extern struct partial_symbol *
+find_pc_sect_psymbol PARAMS ((struct partial_symtab *, CORE_ADDR, asection *));
+
extern int
find_pc_line_pc_range PARAMS ((CORE_ADDR, CORE_ADDR *, CORE_ADDR *));
PARAMS ((const char *, CORE_ADDR,
enum minimal_symbol_type,
char *info, int section,
+ asection *bfd_section,
struct objfile *));
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
extern struct minimal_symbol *
lookup_minimal_symbol_text PARAMS ((const char *, const char *, struct objfile *));
+struct minimal_symbol *
+lookup_minimal_symbol_solib_trampoline PARAMS ((const char *,
+ const char *,
+ struct objfile *));
+
extern struct minimal_symbol *
lookup_minimal_symbol_by_pc PARAMS ((CORE_ADDR));
+extern struct minimal_symbol *
+lookup_minimal_symbol_by_pc_section PARAMS ((CORE_ADDR, asection *));
+
extern struct minimal_symbol *
lookup_solib_trampoline_symbol_by_pc PARAMS ((CORE_ADDR));
struct symtab_and_line
{
struct symtab *symtab;
-
+ asection *section;
/* 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. */
CORE_ADDR end;
};
+#define INIT_SAL(sal) { \
+ (sal)->symtab = 0; \
+ (sal)->section = 0; \
+ (sal)->line = 0; \
+ (sal)->pc = 0; \
+ (sal)->end = 0; \
+}
+
struct symtabs_and_lines
{
struct symtab_and_line *sals;
extern struct symtab_and_line
find_pc_line PARAMS ((CORE_ADDR, int));
+/* Same function, but specify a section as well as an address */
+
+extern struct symtab_and_line
+find_pc_sect_line PARAMS ((CORE_ADDR, asection *, 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 symtabs_and_lines
decode_line_1 PARAMS ((char **, int, struct symtab *, int, char ***));
-/* Symmisc.c */
-
#if MAINTENANCE_CMDS
+/* Symmisc.c */
+
void
maintenance_print_symbols PARAMS ((char *, int));
void
maintenance_check_symtabs PARAMS ((char *, int));
+/* maint.c */
+
+void
+maintenance_print_statistics PARAMS ((char *, int));
+
#endif
extern void
extern struct blockvector *
blockvector_for_pc PARAMS ((CORE_ADDR, int *));
+
+extern struct blockvector *
+blockvector_for_pc_sect PARAMS ((CORE_ADDR, asection *, int *,
+ struct symtab *));
/* symfile.c */
extern void
extern int
in_prologue PARAMS ((CORE_ADDR pc, CORE_ADDR func_start));
+extern struct symbol *
+fixup_symbol_section PARAMS ((struct symbol *, struct objfile *));
+
#endif /* !defined(SYMTAB_H) */