diff options
Diffstat (limited to 'gdb/symtab.h')
-rw-r--r-- | gdb/symtab.h | 102 |
1 files changed, 64 insertions, 38 deletions
diff --git a/gdb/symtab.h b/gdb/symtab.h index bb22d0d..7f511f0 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -23,12 +23,8 @@ #if !defined (SYMTAB_H) #define SYMTAB_H 1 -/* Some definitions and declarations to go with use of obstacks. */ - -#include "obstack.h" -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free xfree -#include "bcache.h" +/* Opaque declarations. */ +struct obstack; /* 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 @@ -93,11 +89,13 @@ struct general_symbol_info char *demangled_name; } cplus_specific; - struct chill_specific /* For Chill */ - { - char *demangled_name; - } - chill_specific; +#if 0 + /* OBSOLETE struct chill_specific *//* For Chill */ + /* OBSOLETE { */ + /* OBSOLETE char *demangled_name; */ + /* OBSOLETE } */ + /* OBSOLETE chill_specific; */ +#endif } language_specific; @@ -148,10 +146,10 @@ extern CORE_ADDR symbol_overlayed_address (CORE_ADDR, asection *); { \ SYMBOL_CPLUS_DEMANGLED_NAME (symbol) = NULL; \ } \ - else if (SYMBOL_LANGUAGE (symbol) == language_chill) \ - { \ - SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL; \ - } \ + /* OBSOLETE else if (SYMBOL_LANGUAGE (symbol) == language_chill) */ \ + /* OBSOLETE { */ \ + /* OBSOLETE SYMBOL_CHILL_DEMANGLED_NAME (symbol) = NULL; */ \ + /* OBSOLETE } */ \ else \ { \ memset (&(symbol)->ginfo.language_specific, 0, \ @@ -172,12 +170,12 @@ extern void symbol_init_demangled_name (struct general_symbol_info *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) \ - : NULL)) + : /* OBSOLETE (SYMBOL_LANGUAGE (symbol) == language_chill */ \ + /* OBSOLETE ? SYMBOL_CHILL_DEMANGLED_NAME (symbol) */ \ + NULL) -#define SYMBOL_CHILL_DEMANGLED_NAME(symbol) \ - (symbol)->ginfo.language_specific.chill_specific.demangled_name +/* OBSOLETE #define SYMBOL_CHILL_DEMANGLED_NAME(symbol) */ +/* OBSOLETE (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 @@ -387,6 +385,25 @@ struct block unsigned char gcc_compile_flag; + /* The symbols for this block are either in a simple linear list or + in a simple hashtable. Blocks which correspond to a function + (which have a list of symbols corresponding to arguments) use + a linear list, as do some older symbol readers (currently only + mdebugread and dstread). Other blocks are hashed. + + The hashtable uses the same hash function as the minsym hashtables, + found in minsyms.c:minsym_hash_iw. Symbols are hashed based on + their demangled name if appropriate, and on their name otherwise. + The hash function ignores space, and stops at the beginning of the + argument list if any. + + The table is laid out in NSYMS/5 buckets and symbols are chained via + their hash_next field. */ + + /* If this is really a hashtable of the symbols, this flag is 1. */ + + unsigned char hashtable; + /* Number of local symbols. */ int nsyms; @@ -399,30 +416,38 @@ struct block #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 +#define BLOCK_HASHTABLE(bl) (bl)->hashtable + +/* For blocks without a hashtable (BLOCK_HASHTABLE (bl) == 0) only. */ +#define BLOCK_NSYMS(bl) (bl)->nsyms +#define BLOCK_SYM(bl, n) (bl)->sym[n] -/* Macro to loop through all symbols in a block BL. - i counts which symbol we are looking at, and sym points to the current - symbol. - The contortion at the end is to avoid reading past the last valid - BLOCK_SYM. */ -#define ALL_BLOCK_SYMBOLS(bl, i, sym) \ - for ((i) = 0, (sym) = BLOCK_SYM ((bl), (i)); \ - (i) < BLOCK_NSYMS ((bl)); \ - ++(i), (sym) = ((i) < BLOCK_NSYMS ((bl))) \ - ? BLOCK_SYM ((bl), (i)) \ - : NULL) +/* For blocks with a hashtable, but these are valid for non-hashed blocks as + well - each symbol will appear to be one bucket by itself. */ +#define BLOCK_BUCKETS(bl) (bl)->nsyms +#define BLOCK_BUCKET(bl, n) (bl)->sym[n] + +/* Macro used to set the size of a hashtable for N symbols. */ +#define BLOCK_HASHTABLE_SIZE(n) ((n)/5 + 1) + +/* Macro to loop through all symbols in a block BL, in no particular order. + i counts which bucket we are in, and sym points to the current symbol. */ + +#define ALL_BLOCK_SYMBOLS(bl, i, sym) \ + for ((i) = 0; (i) < BLOCK_BUCKETS ((bl)); (i)++) \ + for ((sym) = BLOCK_BUCKET ((bl), (i)); (sym); \ + (sym) = (sym)->hash_next) /* 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. */ + arguments. Also don't sort any block that we chose to hash. */ -#define BLOCK_SHOULD_SORT(bl) ((bl)->nsyms >= 40 && BLOCK_FUNCTION (bl) == NULL) +#define BLOCK_SHOULD_SORT(bl) (! BLOCK_HASHTABLE (bl) \ + && BLOCK_FUNCTION (bl) == NULL) /* Represent one symbol name; a variable, constant, function or typedef. */ @@ -672,6 +697,8 @@ struct symbol /* List of ranges where this symbol is active. This is only used by alias symbols at the current time. */ struct range_list *ranges; + + struct symbol *hash_next; }; @@ -1077,9 +1104,8 @@ find_pc_partial_function (CORE_ADDR, char **, CORE_ADDR *, CORE_ADDR *); extern void clear_pc_function_cache (void); -extern int -find_pc_sect_partial_function (CORE_ADDR, asection *, - char **, CORE_ADDR *, CORE_ADDR *); +extern int find_pc_sect_partial_function (CORE_ADDR, asection *, + char **, CORE_ADDR *, CORE_ADDR *); /* from symtab.c: */ |