diff options
author | Fred Fish <fnf@specifix.com> | 1992-01-11 01:41:23 +0000 |
---|---|---|
committer | Fred Fish <fnf@specifix.com> | 1992-01-11 01:41:23 +0000 |
commit | 4d315a071a055cdc1625dad4be04a8562b817d48 (patch) | |
tree | b4a98dd85a8bd64615bb879e4b4d1f3247d62657 /gdb/dwarfread.c | |
parent | 3f7607af77ce302f7c3e9e8ce1cbbe09a80e46cc (diff) | |
download | gdb-4d315a071a055cdc1625dad4be04a8562b817d48.zip gdb-4d315a071a055cdc1625dad4be04a8562b817d48.tar.gz gdb-4d315a071a055cdc1625dad4be04a8562b817d48.tar.bz2 |
Many changes to convert over to generic symbol table reading code in
buildsym.c (second cvs ci attempt)
Diffstat (limited to 'gdb/dwarfread.c')
-rw-r--r-- | gdb/dwarfread.c | 739 |
1 files changed, 92 insertions, 647 deletions
diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index c43330d..366149a 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -36,12 +36,6 @@ put enum constants there. And dbxread seems to invent a lot of typedefs we never see. Use the new printpsym command to see the partial symbol table contents. -FIXME: Change forward declarations of static functions to allow for compilers -without prototypes. - -FIXME: Figure out a better way to tell gdb (all the debug reading routines) -the names of the gccX_compiled flags. - FIXME: Figure out a better way to tell gdb about the name of the function contain the user's entry point (I.E. main()) @@ -55,14 +49,11 @@ make this code more flexible and just use shorts, ints, and longs (and their sizes) where it seems appropriate. I.E. we use a short int to hold DWARF tags, and assume that the tag size in the file is the same as sizeof(short). -FIXME: Figure out how to get the name of the symbol indicating that a module -has been compiled with gcc (gcc_compiledXX) in a more portable way than -hardcoding it into the object file readers. - FIXME: See other FIXME's and "ifdef 0" scattered throughout the code for other things to work on, if you get bored. :-) */ + #include <stdio.h> #ifdef __STDC__ #include <stdarg.h> @@ -77,6 +68,7 @@ other things to work on, if you get bored. :-) #include "symfile.h" #include "elf/dwarf.h" #include "ansidecl.h" +#include "buildsym.h" #ifdef MAINTENANCE /* Define to 1 to compile in some maintenance stuff */ #define SQUAWK(stuff) dwarfwarn stuff @@ -90,10 +82,12 @@ other things to work on, if you get bored. :-) typedef unsigned int DIEREF; /* Reference to a DIE */ -#define GCC_COMPILED_FLAG_SYMBOL "gcc_compiled%" /* FIXME */ -#define GCC2_COMPILED_FLAG_SYMBOL "gcc2_compiled%" /* FIXME */ +#ifndef GCC_PRODUCER +#define GCC_PRODUCER "GNU C " +#endif #define STREQ(a,b) (strcmp(a,b)==0) +#define STREQN(a,b,n) (strncmp(a,b,n)==0) /* The Amiga SVR4 header file <dwarf.h> defines AT_element_list as a FORM_BLOCK2, and this is the value emitted by the AT&T compiler. @@ -233,49 +227,16 @@ struct dwfinfo { #define DBLENGTH(p) (((struct dwfinfo *)((p)->read_symtab_private))->dblength) #define LNFOFF(p) (((struct dwfinfo *)((p)->read_symtab_private))->lnfoff) -/* Record the symbols defined for each context in a linked list. We don't - create a struct block for the context until we know how long to make it. - Global symbols for each file are maintained in the global_symbols list. */ +/* The generic symbol table building routines have separate lists for + file scope symbols and all all other scopes (local scopes). So + we need to select the right one to pass to add_symbol_to_list(). + We do it by keeping a pointer to the correct list in list_in_scope. -struct pending_symbol { - struct pending_symbol *next; /* Next pending symbol */ - struct symbol *symbol; /* The actual symbol */ -}; + FIXME: The original dwarf code just treated the file scope as the first + local scope, and all other local scopes as nested local scopes, and worked + fine. Check to see if we really need to distinguish these in buildsym.c */ -static struct pending_symbol *global_symbols; /* global funcs and vars */ -static struct block *global_symbol_block; - -/* Line number entries are read into a dynamically expandable vector before - being added to the symbol table section. Once we know how many there are - we can add them. */ - -static struct linetable *line_vector; /* Vector of line numbers. */ -static int line_vector_index; /* Index of next entry. */ -static int line_vector_length; /* Current allocation limit */ - -/* Scope information is kept in a scope tree, one node per scope. Each time - a new scope is started, a child node is created under the current node - and set to the current scope. Each time a scope is closed, the current - scope moves back up the tree to the parent of the current scope. - - Each scope contains a pointer to the list of symbols defined in the scope, - a pointer to the block vector for the scope, a pointer to the symbol - that names the scope (if any), and the range of PC values that mark - the start and end of the scope. */ - -struct scopenode { - struct scopenode *parent; - struct scopenode *child; - struct scopenode *sibling; - struct pending_symbol *symbols; - struct block *block; - struct symbol *namesym; - CORE_ADDR lowpc; - CORE_ADDR highpc; -}; - -static struct scopenode *scopetree; -static struct scopenode *scope; +struct pending **list_in_scope; /* DIES which have user defined types or modified user defined types refer to other DIES for the type information. Thus we need to associate the offset @@ -317,17 +278,18 @@ EXFUN (scan_partial_symbols, (char *thisdie AND char *enddie)); static void EXFUN (scan_compilation_units, - (char *filename AND CORE_ADDR addr AND char *thisdie AND char *enddie + (char *filename AND char *thisdie AND char *enddie AND unsigned int dbfoff AND unsigned int lnoffset AND struct objfile *objfile)); static struct partial_symtab * -EXFUN(start_psymtab, (struct objfile *objfile AND CORE_ADDR addr +EXFUN(dwarf_start_psymtab, (struct objfile *objfile AND CORE_ADDR addr AND char *filename AND CORE_ADDR textlow AND CORE_ADDR texthigh AND int dbfoff AND int curoff AND int culength AND int lnfoff AND struct partial_symbol *global_syms AND struct partial_symbol *static_syms)); + static void EXFUN(add_partial_symbol, (struct dieinfo *dip)); @@ -365,7 +327,7 @@ static struct type * EXFUN(decode_subscr_data, (char *scan AND char *end)); static void -EXFUN(read_array_type, (struct dieinfo *dip)); +EXFUN(dwarf_read_array_type, (struct dieinfo *dip)); static void EXFUN(read_subroutine_type, @@ -384,32 +346,6 @@ static struct type * EXFUN(enum_type, (struct dieinfo *dip)); static void -EXFUN(start_symtab, (void)); - -static void -EXFUN(end_symtab, - (char *filename AND long language AND struct objfile *objfile)); - -static int -EXFUN(scopecount, (struct scopenode *node)); - -static void -EXFUN(openscope, - (struct symbol *namesym AND CORE_ADDR lowpc AND CORE_ADDR highpc)); - -static void -EXFUN(freescope, (struct scopenode *node)); - -static struct block * -EXFUN(buildblock, (struct pending_symbol *syms)); - -static void -EXFUN(closescope, (void)); - -static void -EXFUN(record_line, (int line AND CORE_ADDR pc)); - -static void EXFUN(decode_line_numbers, (char *linetable)); static struct type * @@ -431,16 +367,6 @@ EXFUN(decode_fund_type, (unsigned short fundtype)); static char * EXFUN(create_name, (char *name AND struct obstack *obstackp)); -static void -EXFUN(add_symbol_to_list, - (struct symbol *symbol AND struct pending_symbol **listhead)); - -static struct block ** -EXFUN(gatherblocks, (struct block **dest AND struct scopenode *node)); - -static struct blockvector * -EXFUN(make_blockvector, (void)); - static struct type * EXFUN(lookup_utype, (DIEREF dieref)); @@ -530,18 +456,22 @@ DEFUN(dwarf_build_psymtabs, } /* From this point on, we don't need to pass mainline around, so zap - addr to zero if we don't need relocation. */ + baseaddr to zero if we don't need relocation. */ if (mainline) { - addr = 0; + baseaddr = 0; + } + else + { + baseaddr = addr; } /* Follow the compilation unit sibling chain, building a partial symbol table entry for each one. Save enough information about each compilation unit to locate the full DWARF information later. */ - scan_compilation_units (filename, addr, dbbase, dbbase + dbsize, + scan_compilation_units (filename, dbbase, dbbase + dbsize, dbfoff, lnoffset, objfile); do_cleanups (back_to); @@ -605,6 +535,7 @@ NOTES */ #ifdef __STDC__ + static void DEFUN(dwarfwarn, (fmt), char *fmt DOTS) { @@ -622,6 +553,7 @@ DEFUN(dwarfwarn, (fmt), char *fmt DOTS) fflush (stderr); va_end (ap); } + #else static void @@ -644,7 +576,9 @@ dwarfwarn (va_alist) fflush (stderr); va_end (ap); } + #endif + /* LOCAL FUNCTION @@ -717,9 +651,17 @@ DEFUN(read_lexical_block_scope, (dip, thisdie, enddie, objfile), char *enddie AND struct objfile *objfile) { - openscope (NULL, dip -> at_low_pc, dip -> at_high_pc); + register struct context_stack *new; + + (void) push_context (0, dip -> at_low_pc); process_dies (thisdie + dip -> dielength, enddie, objfile); - closescope (); + new = pop_context (); + if (local_symbols != NULL) + { + finish_block (0, &local_symbols, new -> old_blocks, new -> start_addr, + dip -> at_high_pc); + } + local_symbols = new -> locals; } /* @@ -1204,11 +1146,11 @@ DEFUN(decode_subscr_data, (scan, end), char *scan AND char *end) LOCAL FUNCTION - read_array_type -- read TAG_array_type DIE + dwarf_read_array_type -- read TAG_array_type DIE SYNOPSIS - static void read_array_type (struct dieinfo *dip) + static void dwarf_read_array_type (struct dieinfo *dip) DESCRIPTION @@ -1217,7 +1159,7 @@ DESCRIPTION */ static void -DEFUN(read_array_type, (dip), struct dieinfo *dip) +DEFUN(dwarf_read_array_type, (dip), struct dieinfo *dip) { struct type *type; char *sub; @@ -1431,7 +1373,7 @@ DEFUN(enum_type, (dip), struct dieinfo *dip) SYMBOL_CLASS (sym) = LOC_CONST; SYMBOL_TYPE (sym) = type; SYMBOL_VALUE (sym) = list -> field.bitpos; - add_symbol_to_list (sym, &scope -> symbols); + add_symbol_to_list (sym, list_in_scope); } /* Now create the vector of fields, and record how big it is. This is where we reverse the order, by pulling the members of the list in @@ -1481,22 +1423,27 @@ DEFUN(read_func_scope, (dip, thisdie, enddie, objfile), char *enddie AND struct objfile *objfile) { - struct symbol *sym; + register struct context_stack *new; if (entry_point >= dip -> at_low_pc && entry_point < dip -> at_high_pc) { entry_scope_lowpc = dip -> at_low_pc; entry_scope_highpc = dip -> at_high_pc; } - if (strcmp (dip -> at_name, "main") == 0) /* FIXME: hardwired name */ + if (STREQ (dip -> at_name, "main")) /* FIXME: hardwired name */ { main_scope_lowpc = dip -> at_low_pc; main_scope_highpc = dip -> at_high_pc; } - sym = new_symbol (dip); - openscope (sym, dip -> at_low_pc, dip -> at_high_pc); + new = push_context (0, dip -> at_low_pc); + new -> name = new_symbol (dip); + list_in_scope = &local_symbols; process_dies (thisdie + dip -> dielength, enddie, objfile); - closescope (); + new = pop_context (); + /* Make a block for the local symbols within. */ + finish_block (new -> name, &local_symbols, new -> old_blocks, + new -> start_addr, dip -> at_high_pc); + list_in_scope = &file_symbols; } /* @@ -1529,22 +1476,39 @@ DEFUN(read_file_scope, (dip, thisdie, enddie, objfile), struct objfile *objfile) { struct cleanup *back_to; + struct symtab *symtab; if (entry_point >= dip -> at_low_pc && entry_point < dip -> at_high_pc) { startup_file_start = dip -> at_low_pc; startup_file_end = dip -> at_high_pc; } + if (dip -> at_producer != NULL) + { + processing_gcc_compilation = + STREQN (dip -> at_producer, GCC_PRODUCER, strlen (GCC_PRODUCER)); + } numutypes = (enddie - thisdie) / 4; utypes = (struct type **) xmalloc (numutypes * sizeof (struct type *)); back_to = make_cleanup (free, utypes); (void) memset (utypes, 0, numutypes * sizeof (struct type *)); - start_symtab (); - openscope (NULL, dip -> at_low_pc, dip -> at_high_pc); + start_symtab (dip -> at_name, NULL, dip -> at_low_pc); decode_line_numbers (lnbase); process_dies (thisdie + dip -> dielength, enddie, objfile); - closescope (); - end_symtab (dip -> at_name, dip -> at_language, objfile); + symtab = end_symtab (dip -> at_high_pc, 0, 0, objfile); + /* FIXME: The following may need to be expanded for other languages */ + switch (dip -> at_language) + { + case LANG_C89: + case LANG_C: + symtab -> language = language_c; + break; + case LANG_C_PLUS_PLUS: + symtab -> language = language_cplus; + break; + default: + ; + } do_cleanups (back_to); utypes = NULL; numutypes = 0; @@ -1554,37 +1518,6 @@ DEFUN(read_file_scope, (dip, thisdie, enddie, objfile), LOCAL FUNCTION - start_symtab -- do initialization for starting new symbol table - -SYNOPSIS - - static void start_symtab (void) - -DESCRIPTION - - Called whenever we are starting to process dies for a new - compilation unit, to perform initializations. Right now - the only thing we really have to do is initialize storage - space for the line number vector. - - */ - -static void -DEFUN_VOID (start_symtab) -{ - int nbytes; - - line_vector_index = 0; - line_vector_length = 1000; - nbytes = sizeof (struct linetable); - nbytes += line_vector_length * sizeof (struct linetable_entry); - line_vector = (struct linetable *) xmalloc (nbytes); -} - -/* - -LOCAL FUNCTION - process_dies -- process a range of DWARF Information Entries SYNOPSIS @@ -1653,7 +1586,7 @@ DEFUN(process_dies, (thisdie, enddie, objfile), read_subroutine_type (&di, thisdie, nextdie); break; case TAG_array_type: - read_array_type (&di); + dwarf_read_array_type (&di); break; default: (void) new_symbol (&di); @@ -1668,368 +1601,6 @@ DEFUN(process_dies, (thisdie, enddie, objfile), LOCAL FUNCTION - end_symtab -- finish processing for a compilation unit - -SYNOPSIS - - static void end_symtab (char *filename, long language) - -DESCRIPTION - - Complete the symbol table entry for the current compilation - unit. Make the struct symtab and put it on the list of all - such symtabs. - - */ - -static void -DEFUN(end_symtab, (filename, language, objfile), - char *filename AND long language AND struct objfile *objfile) -{ - struct symtab *symtab; - struct blockvector *blockvector; - int nbytes; - - /* Ignore a file that has no functions with real debugging info. */ - if (global_symbols == NULL && scopetree -> block == NULL) - { - free (line_vector); - line_vector = NULL; - line_vector_length = -1; - freescope (scopetree); - scope = scopetree = NULL; - } - - /* Create the blockvector that points to all the file's blocks. */ - - blockvector = make_blockvector (); - - /* Now create the symtab object for this source file. */ - - symtab = allocate_symtab (savestring (filename, strlen (filename)), - objfile); - - symtab -> free_ptr = 0; - - /* Fill in its components. */ - symtab -> blockvector = blockvector; - symtab -> free_code = free_linetable; - - /* Save the line number information. */ - - line_vector -> nitems = line_vector_index; - nbytes = sizeof (struct linetable); - if (line_vector_index > 1) - { - nbytes += (line_vector_index - 1) * sizeof (struct linetable_entry); - } - symtab -> linetable = (struct linetable *) xrealloc (line_vector, nbytes); - - /* FIXME: The following may need to be expanded for other languages */ - switch (language) - { - case LANG_C89: - case LANG_C: - symtab -> language = language_c; - break; - case LANG_C_PLUS_PLUS: - symtab -> language = language_cplus; - break; - default: - ; - } - - /* Link the new symtab into the list of such. */ - symtab -> next = symtab_list; - symtab_list = symtab; - - /* Recursively free the scope tree */ - freescope (scopetree); - scope = scopetree = NULL; - - /* Reinitialize for beginning of new file. */ - line_vector = 0; - line_vector_length = -1; -} - -/* - -LOCAL FUNCTION - - scopecount -- count the number of enclosed scopes - -SYNOPSIS - - static int scopecount (struct scopenode *node) - -DESCRIPTION - - Given pointer to a node, compute the size of the subtree which is - rooted in this node, which also happens to be the number of scopes - to the subtree. - */ - -static int -DEFUN(scopecount, (node), struct scopenode *node) -{ - int count = 0; - - if (node != NULL) - { - count += scopecount (node -> child); - count += scopecount (node -> sibling); - count++; - } - return (count); -} - -/* - -LOCAL FUNCTION - - openscope -- start a new lexical block scope - -SYNOPSIS - - static void openscope (struct symbol *namesym, CORE_ADDR lowpc, - CORE_ADDR highpc) - -DESCRIPTION - - Start a new scope by allocating a new scopenode, adding it as the - next child of the current scope (if any) or as the root of the - scope tree, and then making the new node the current scope node. - */ - -static void -DEFUN(openscope, (namesym, lowpc, highpc), - struct symbol *namesym AND - CORE_ADDR lowpc AND - CORE_ADDR highpc) -{ - struct scopenode *new; - struct scopenode *child; - - new = (struct scopenode *) xmalloc (sizeof (*new)); - (void) memset (new, 0, sizeof (*new)); - new -> namesym = namesym; - new -> lowpc = lowpc; - new -> highpc = highpc; - if (scope == NULL) - { - scopetree = new; - } - else if ((child = scope -> child) == NULL) - { - scope -> child = new; - new -> parent = scope; - } - else - { - while (child -> sibling != NULL) - { - child = child -> sibling; - } - child -> sibling = new; - new -> parent = scope; - } - scope = new; -} - -/* - -LOCAL FUNCTION - - freescope -- free a scope tree rooted at the given node - -SYNOPSIS - - static void freescope (struct scopenode *node) - -DESCRIPTION - - Given a pointer to a node in the scope tree, free the subtree - rooted at that node. First free all the children and sibling - nodes, and then the node itself. Used primarily for cleaning - up after ourselves and returning memory to the system. - */ - -static void -DEFUN(freescope, (node), struct scopenode *node) -{ - if (node != NULL) - { - freescope (node -> child); - freescope (node -> sibling); - free (node); - } -} - -/* - -LOCAL FUNCTION - - buildblock -- build a new block from pending symbols list - -SYNOPSIS - - static struct block *buildblock (struct pending_symbol *syms) - -DESCRIPTION - - Given a pointer to a list of symbols, build a new block and free - the symbol list structure. Also check each symbol to see if it - is the special symbol that flags that this block was compiled by - gcc, and if so, mark the block appropriately. - */ - -static struct block * -DEFUN(buildblock, (syms), struct pending_symbol *syms) -{ - struct pending_symbol *next, *next1; - int i; - struct block *newblock; - int nbytes; - - for (next = syms, i = 0 ; next ; next = next -> next, i++) {;} - - /* Allocate a new block */ - - nbytes = sizeof (struct block); - if (i > 1) - { - nbytes += (i - 1) * sizeof (struct symbol *); - } - newblock = (struct block *) obstack_alloc (symbol_obstack, nbytes); - (void) memset (newblock, 0, nbytes); - - /* Copy the symbols into the block. */ - - BLOCK_NSYMS (newblock) = i; - for (next = syms ; next ; next = next -> next) - { - BLOCK_SYM (newblock, --i) = next -> symbol; - if (STREQ (GCC_COMPILED_FLAG_SYMBOL, SYMBOL_NAME (next -> symbol)) || - STREQ (GCC2_COMPILED_FLAG_SYMBOL, SYMBOL_NAME (next -> symbol))) - { - BLOCK_GCC_COMPILED (newblock) = 1; - } - } - - /* Now free the links of the list, and empty the list. */ - - for (next = syms ; next ; next = next1) - { - next1 = next -> next; - free (next); - } - - return (newblock); -} - -/* - -LOCAL FUNCTION - - closescope -- close a lexical block scope - -SYNOPSIS - - static void closescope (void) - -DESCRIPTION - - Close the current lexical block scope. Closing the current scope - is as simple as moving the current scope pointer up to the parent - of the current scope pointer. But we also take this opportunity - to build the block for the current scope first, since we now have - all of it's symbols. - */ - -static void -DEFUN_VOID(closescope) -{ - struct scopenode *child; - - if (scope == NULL) - { - error ("DWARF parse error, too many close scopes"); - } - else - { - if (scope -> parent == NULL) - { - global_symbol_block = buildblock (global_symbols); - global_symbols = NULL; - BLOCK_START (global_symbol_block) = scope -> lowpc + baseaddr; - BLOCK_END (global_symbol_block) = scope -> highpc + baseaddr; - } - scope -> block = buildblock (scope -> symbols); - scope -> symbols = NULL; - BLOCK_START (scope -> block) = scope -> lowpc + baseaddr; - BLOCK_END (scope -> block) = scope -> highpc + baseaddr; - - /* Put the local block in as the value of the symbol that names it. */ - - if (scope -> namesym) - { - SYMBOL_BLOCK_VALUE (scope -> namesym) = scope -> block; - BLOCK_FUNCTION (scope -> block) = scope -> namesym; - } - - /* Install this scope's local block as the superblock of all child - scope blocks. */ - - for (child = scope -> child ; child ; child = child -> sibling) - { - BLOCK_SUPERBLOCK (child -> block) = scope -> block; - } - - scope = scope -> parent; - } -} - -/* - -LOCAL FUNCTION - - record_line -- record a line number entry in the line vector - -SYNOPSIS - - static void record_line (int line, CORE_ADDR pc) - -DESCRIPTION - - Given a line number and the corresponding pc value, record - this pair in the line number vector, expanding the vector as - necessary. - */ - -static void -DEFUN(record_line, (line, pc), int line AND CORE_ADDR pc) -{ - struct linetable_entry *e; - int nbytes; - - /* Make sure line vector is big enough. */ - - if (line_vector_index + 2 >= line_vector_length) - { - line_vector_length *= 2; - nbytes = sizeof (struct linetable); - nbytes += (line_vector_length * sizeof (struct linetable_entry)); - line_vector = (struct linetable *) xrealloc (line_vector, nbytes); - } - e = line_vector -> item + line_vector_index++; - e -> line = line; - e -> pc = pc; -} - -/* - -LOCAL FUNCTION - decode_line_numbers -- decode a line number table fragment SYNOPSIS @@ -2114,7 +1685,7 @@ DEFUN(decode_line_numbers, (linetable), char *linetable) pc += base; if (line > 0) { - record_line (line, pc); + record_line (current_subfile, line, pc); } } } @@ -2124,133 +1695,6 @@ DEFUN(decode_line_numbers, (linetable), char *linetable) LOCAL FUNCTION - add_symbol_to_list -- add a symbol to head of current symbol list - -SYNOPSIS - - static void add_symbol_to_list (struct symbol *symbol, struct - pending_symbol **listhead) - -DESCRIPTION - - Given a pointer to a symbol and a pointer to a pointer to a - list of symbols, add this symbol as the current head of the - list. Typically used for example to add a symbol to the - symbol list for the current scope. - - */ - -static void -DEFUN(add_symbol_to_list, (symbol, listhead), - struct symbol *symbol AND struct pending_symbol **listhead) -{ - struct pending_symbol *link; - - if (symbol != NULL) - { - link = (struct pending_symbol *) xmalloc (sizeof (*link)); - link -> next = *listhead; - link -> symbol = symbol; - *listhead = link; - } -} - -/* - -LOCAL FUNCTION - - gatherblocks -- walk a scope tree and build block vectors - -SYNOPSIS - - static struct block **gatherblocks (struct block **dest, - struct scopenode *node) - -DESCRIPTION - - Recursively walk a scope tree rooted in the given node, adding blocks - to the array pointed to by DEST, in preorder. I.E., first we add the - block for the current scope, then all the blocks for child scopes, - and finally all the blocks for sibling scopes. - */ - -static struct block ** -DEFUN(gatherblocks, (dest, node), - struct block **dest AND struct scopenode *node) -{ - if (node != NULL) - { - *dest++ = node -> block; - dest = gatherblocks (dest, node -> child); - dest = gatherblocks (dest, node -> sibling); - } - return (dest); -} - -/* - -LOCAL FUNCTION - - make_blockvector -- make a block vector from current scope tree - -SYNOPSIS - - static struct blockvector *make_blockvector (void) - -DESCRIPTION - - Make a blockvector from all the blocks in the current scope tree. - The first block is always the global symbol block, followed by the - block for the root of the scope tree which is the local symbol block, - followed by all the remaining blocks in the scope tree, which are all - local scope blocks. - -NOTES - - Note that since the root node of the scope tree is created at the time - each file scope is entered, there are always at least two blocks, - neither of which may have any symbols, but always contribute a block - to the block vector. So the test for number of blocks greater than 1 - below is unnecessary given bug free code. - - The resulting block structure varies slightly from that produced - by dbxread.c, in that block 0 and block 1 are sibling blocks while - with dbxread.c, block 1 is a child of block 0. This does not - seem to cause any problems, but probably should be fixed. (FIXME) - */ - -static struct blockvector * -DEFUN_VOID(make_blockvector) -{ - struct blockvector *blockvector = NULL; - int i; - int nbytes; - - /* Recursively walk down the tree, counting the number of blocks. - Then add one to account for the global's symbol block */ - - i = scopecount (scopetree) + 1; - nbytes = sizeof (struct blockvector); - if (i > 1) - { - nbytes += (i - 1) * sizeof (struct block *); - } - blockvector = (struct blockvector *) - obstack_alloc (symbol_obstack, nbytes); - - /* Copy the blocks into the blockvector. */ - - BLOCKVECTOR_NBLOCKS (blockvector) = i; - BLOCKVECTOR_BLOCK (blockvector, 0) = global_symbol_block; - gatherblocks (&BLOCKVECTOR_BLOCK (blockvector, 1), scopetree); - - return (blockvector); -} - -/* - -LOCAL FUNCTION - locval -- compute the value of a location attribute SYNOPSIS @@ -2584,7 +2028,7 @@ DEFUN(init_psymbol_list, (total_symbols), int total_symbols) LOCAL FUNCTION - start_psymtab -- allocate and partially fill a partial symtab entry + dwarf_start_psymtab -- allocate and fill a partial symtab entry DESCRIPTION @@ -2603,7 +2047,7 @@ DESCRIPTION */ static struct partial_symtab * -DEFUN(start_psymtab, +DEFUN(dwarf_start_psymtab, (objfile, addr, filename, textlow, texthigh, dbfoff, curoff, culength, lnfoff, global_syms, static_syms), struct objfile *objfile AND @@ -2879,9 +2323,8 @@ RETURNS static void DEFUN(scan_compilation_units, - (filename, addr, thisdie, enddie, dbfoff, lnoffset, objfile), + (filename, thisdie, enddie, dbfoff, lnoffset, objfile), char *filename AND - CORE_ADDR addr AND char *thisdie AND char *enddie AND unsigned int dbfoff AND @@ -2920,9 +2363,9 @@ DEFUN(scan_compilation_units, curoff = thisdie - dbbase; culength = nextdie - thisdie; curlnoffset = di.has_at_stmt_list ? lnoffset + di.at_stmt_list : 0; - pst = start_psymtab (objfile, addr, di.at_name, - di.at_low_pc + addr, - di.at_high_pc + addr, + pst = dwarf_start_psymtab (objfile, baseaddr, di.at_name, + di.at_low_pc, + di.at_high_pc, dbfoff, curoff, culength, curlnoffset, global_psymbols.next, static_psymbols.next); @@ -2982,12 +2425,12 @@ DEFUN(new_symbol, (dip), struct dieinfo *dip) switch (dip -> dietag) { case TAG_label: - SYMBOL_VALUE (sym) = dip -> at_low_pc + baseaddr; + SYMBOL_VALUE (sym) = dip -> at_low_pc; SYMBOL_CLASS (sym) = LOC_LABEL; break; case TAG_global_subroutine: case TAG_subroutine: - SYMBOL_VALUE (sym) = dip -> at_low_pc + baseaddr; + SYMBOL_VALUE (sym) = dip -> at_low_pc; SYMBOL_TYPE (sym) = lookup_function_type (SYMBOL_TYPE (sym)); SYMBOL_CLASS (sym) = LOC_BLOCK; if (dip -> dietag == TAG_global_subroutine) @@ -2996,7 +2439,7 @@ DEFUN(new_symbol, (dip), struct dieinfo *dip) } else { - add_symbol_to_list (sym, &scope -> symbols); + add_symbol_to_list (sym, list_in_scope); } break; case TAG_global_variable: @@ -3013,8 +2456,8 @@ DEFUN(new_symbol, (dip), struct dieinfo *dip) } else { - add_symbol_to_list (sym, &scope -> symbols); - if (scope -> parent != NULL) + add_symbol_to_list (sym, list_in_scope); + if (context_stack_depth > 0) { if (isreg) { @@ -3037,7 +2480,7 @@ DEFUN(new_symbol, (dip), struct dieinfo *dip) { SYMBOL_VALUE (sym) = locval (dip -> at_location); } - add_symbol_to_list (sym, &scope -> symbols); + add_symbol_to_list (sym, list_in_scope); if (isreg) { SYMBOL_CLASS (sym) = LOC_REGPARM; @@ -3056,12 +2499,12 @@ DEFUN(new_symbol, (dip), struct dieinfo *dip) case TAG_enumeration_type: SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE; - add_symbol_to_list (sym, &scope -> symbols); + add_symbol_to_list (sym, list_in_scope); break; case TAG_typedef: SYMBOL_CLASS (sym) = LOC_TYPEDEF; SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE; - add_symbol_to_list (sym, &scope -> symbols); + add_symbol_to_list (sym, list_in_scope); break; default: /* Not a tag we recognize. Hopefully we aren't processing trash @@ -3533,10 +2976,12 @@ DEFUN(completedieinfo, (dip), struct dieinfo *dip) break; case AT_low_pc: (void) memcpy (&dip -> at_low_pc, diep, sizeof (long)); + dip -> at_low_pc += baseaddr; dip -> has_at_low_pc = 1; break; case AT_high_pc: (void) memcpy (&dip -> at_high_pc, diep, sizeof (long)); + dip -> at_high_pc += baseaddr; break; case AT_language: (void) memcpy (&dip -> at_language, diep, sizeof (long)); |