From b84b918329af17874b18bea912c07974ed751f10 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Wed, 22 Oct 1997 23:28:30 +0000 Subject: * mdebugread.c (psymtab_to_symtab_1): Handle new live range stabs entries. * dbxread.c: More comment cleanups. * stabsread.c: Fix various violations of the GNU coding and formatting standards. Update/add comments to make code clearer. (resolve_reference): Delete unused function. (ref_search_val): Remove function. It didn't belong in stabsread.c (resolve_live_range): No longer returns a value. Do not add it to the live range list until the entire range stab has been parsed. (get_substring): Remove duplicate declaration. (resolve_symbol_reference): Now static. Remove unnecessary code to deal with cleanups. (ref_add): Use xrealloc instea of realloc. (process_reference): Reorganize slightly to make clearer. * stabsread.h (resolve_symbol_reference): Remove declaration. (resolve_reference): Likewise. * symtab.c (find_active_alias): New function. (lookup_block_symbol): Use find_active_alias. * symtab.h (struct range_list): Fix dangling struct live_range reference. (ref_search_val): Remove decl. * symtab.h (struct range_list): Renamed from struct live_range. (struct symbol): Remove struct live_range_info substruct. Bring the alias list and range list fields up to the toplevel as "aliases" and "ranges". (SYMBOL_ALIASES, SYMBOL_RANGES): Corresponding changes. (SYMBOL_RANGE_START, SYMBOL_RANGE_END, SYMBOL_RANGE_NEXT): Delete. * stabsread.c: Corresponding changes. Bring first round of cleanups over from r5900 branch. --- gdb/ChangeLog | 31 +++++++ gdb/dbxread.c | 4 - gdb/mdebugread.c | 9 +- gdb/stabsread.c | 276 +++++++++++++++++++++++++++---------------------------- gdb/stabsread.h | 5 - 5 files changed, 176 insertions(+), 149 deletions(-) (limited to 'gdb') diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 36ebe41..cca3e6a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,36 @@ Wed Oct 22 13:04:52 1997 Jeffrey A Law (law@cygnus.com) + * mdebugread.c (psymtab_to_symtab_1): Handle new live range stabs + entries. + + * dbxread.c: More comment cleanups. + * stabsread.c: Fix various violations of the GNU coding and + formatting standards. Update/add comments to make code clearer. + (resolve_reference): Delete unused function. + (ref_search_val): Remove function. It didn't belong in stabsread.c + (resolve_live_range): No longer returns a value. Do not add it + to the live range list until the entire range stab has been parsed. + (get_substring): Remove duplicate declaration. + (resolve_symbol_reference): Now static. Remove unnecessary code + to deal with cleanups. + (ref_add): Use xrealloc instea of realloc. + (process_reference): Reorganize slightly to make clearer. + * stabsread.h (resolve_symbol_reference): Remove declaration. + (resolve_reference): Likewise. + * symtab.c (find_active_alias): New function. + (lookup_block_symbol): Use find_active_alias. + * symtab.h (struct range_list): Fix dangling struct live_range + reference. + (ref_search_val): Remove decl. + + * symtab.h (struct range_list): Renamed from struct live_range. + (struct symbol): Remove struct live_range_info substruct. + Bring the alias list and range list fields up to the toplevel + as "aliases" and "ranges". + (SYMBOL_ALIASES, SYMBOL_RANGES): Corresponding changes. + (SYMBOL_RANGE_START, SYMBOL_RANGE_END, SYMBOL_RANGE_NEXT): Delete. + * stabsread.c: Corresponding changes. + * dbxread.c: Fix various violations of the GNU coding and formatting standards. Update/add comments to make code clearer. diff --git a/gdb/dbxread.c b/gdb/dbxread.c index d7af14f..44f198e 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -2411,10 +2411,6 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile) char *s; int refnum; - /* If defined, store away a pointer to the symbol; - we'll use it later when we resolve references in - "resolve_symbol_reference". */ - /* If this stab defines a new reference ID that is not on the reference list, then put it on the reference list. diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 325afab..f3f3ec4 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -3297,7 +3297,8 @@ psymtab_to_symtab_1 (pst, filename) &sh); name = debug_info->ss + fh->issBase + sh.iss; valu = sh.value; - if (ECOFF_IS_STAB (&sh)) + /* XXX This is a hack. It will go away! */ + if (ECOFF_IS_STAB (&sh) || (name[0] == '#')) { int type_code = ECOFF_UNMARK_STAB (sh.index); @@ -3309,6 +3310,12 @@ psymtab_to_symtab_1 (pst, filename) process_one_symbol (type_code, 0, valu, name, pst->section_offsets, pst->objfile); } + /* Similarly a hack. */ + else if (name[0] == '#') + { + process_one_symbol (N_SLINE, 0, valu, name, + pst->section_offsets, pst->objfile); + } if (type_code == N_FUN) { /* Make up special symbol to contain diff --git a/gdb/stabsread.c b/gdb/stabsread.c index c998810..872e07e 100644 --- a/gdb/stabsread.c +++ b/gdb/stabsread.c @@ -176,7 +176,7 @@ static void add_live_range PARAMS ((struct objfile *, struct symbol *, CORE_ADDR, CORE_ADDR)); -static int +static void resolve_live_range PARAMS ((struct objfile *, struct symbol *, char *)); static int @@ -188,8 +188,8 @@ ref_search_value PARAMS ((int refnum)); static void ref_init PARAMS ((void)); -static char * -get_substring PARAMS ((char ** p, int c)); +static int +resolve_symbol_reference PARAMS ((struct objfile *, struct symbol *, char *)); static const char vptr_name[] = { '_','v','p','t','r',CPLUS_MARKER,'\0' }; static const char vb_name[] = { '_','v','b',CPLUS_MARKER,'\0' }; @@ -1043,24 +1043,21 @@ resolve_cfront_continuation (objfile, sym, p) /* End of code added to support parsing of ARM/Cfront stabs strings */ -/* This routine fixes up symbol references to point to the original - symbol definition. - The main need for this function is to add information for supporting - live range splitting. - eg: p : "#7=", "#2=z:r(0,1)" "#2:r(0,1);l(#5,#6),l(#7,#4)" */ -int +/* This routine fixes up symbol references/aliases to point to the original + symbol definition. */ + +static int resolve_symbol_reference (objfile, sym, p) - struct objfile * objfile; - struct symbol * sym; - char * p; + struct objfile *objfile; + struct symbol *sym; + char *p; { int refnum; - struct symbol * ref_sym=0; - struct cleanup *back_to; - - back_to = make_cleanup (null_cleanup, 0); + struct symbol *ref_sym=0; + struct alias_list *alias; - if (*p != '#') /* symbol ref id */ + /* If this is not a symbol reference return now. */ + if (*p != '#') return 0; /* Use "#" as the name; we'll fix the name later. @@ -1075,11 +1072,16 @@ resolve_symbol_reference (objfile, sym, p) /*---------------------------------------------------------*/ /* This gets reference name from string. sym may not have a name. */ + + /* Get the reference number associated with the reference id in the + gdb stab string. From that reference number, get the main/primary + symbol for this alias. */ refnum = process_reference (&p); ref_sym = ref_search (refnum); if (!ref_sym) error ("error: symbol for reference not found.\n"); + /* Parse the stab of the referencing symbol now that we have the referenced symbol. Add it as a new symbol and a link back to the referenced symbol. @@ -1107,8 +1109,30 @@ resolve_symbol_reference (objfile, sym, p) /*--------------------------------------------------*/ /* Add this symbol to the reference list. */ /*--------------------------------------------------*/ - SYMBOL_ALIASES (sym) = SYMBOL_ALIASES (ref_sym); - SYMBOL_ALIASES (ref_sym) = sym; + + alias = (struct alias_list *) obstack_alloc (&objfile->type_obstack, + sizeof (struct alias_list)); + if (!alias) + error ("Unable to allocate alias list memory"); + + alias->next = 0; + alias->sym = sym; + + if (!SYMBOL_ALIASES (ref_sym)) + { + SYMBOL_ALIASES (ref_sym) = alias; + } + else + { + struct alias_list *temp; + + /* Get to the end of the list. */ + for (temp = SYMBOL_ALIASES (ref_sym); + temp->next; + temp = temp->next); + ; + temp->next = alias; + } /* Want to fix up name so that other functions (eg. valops) will correctly print the name. @@ -1117,35 +1141,9 @@ resolve_symbol_reference (objfile, sym, p) SYMBOL_NAME (sym) = SYMBOL_NAME (ref_sym); /* Done! */ - - do_cleanups (back_to); return 0; } -/* Get range symbol reference. eg. "#2),l(#3,#5)" - postpone resolve_reference until after we're done reading symbols. */ -struct symbol * -resolve_reference (p) - char *p; -{ - char sym_refid[32]; - struct symbol *sym = 0; - char *s = p; - int len; - - if (!s || *s != '#') - return 0; - p = strchr (s, ')'); - if (!p || p == s) - return 0; - len = p - s + 1; - strncpy (sym_refid, s, len); - sym_refid[len] = '\0'; - sym = lookup_symbol (sym_refid, 0, VAR_NAMESPACE, 0, 0); - return sym; -} - - #define MAX_CHUNK_REFS 100 #define REF_CHUNK_SIZE \ MAX_CHUNK_REFS * sizeof (struct ref_map_s) @@ -1168,11 +1166,7 @@ static int ref_count = 0; static int ref_chunk = 0; /* Initialize our list of references. - This should be called before any symbol table is read. - FIXME: Will reference numbers be unique only to objects? If so, we may - need to add something to disambiguate the refids. Or, it might be OK to - leave as is, as long as we read and process an object's symbol table all - at once. */ + This should be called before any symbol table is read. */ static void ref_init () @@ -1200,7 +1194,7 @@ ref_add (refnum, sym, stabs, value) { int new_slots = ref_count - ref_chunk * MAX_CHUNK_REFS; int new_chunks = new_slots / MAX_CHUNK_REFS + 1; - ref_map = realloc (ref_map, REF_MAP_SIZE(ref_chunk + new_chunks)); + ref_map = xrealloc (ref_map, REF_MAP_SIZE(ref_chunk + new_chunks)); if (!ref_map) error ("no more free slots in chain\n"); memset (ref_map + REF_MAP_SIZE(ref_chunk), 0, new_chunks * REF_CHUNK_SIZE); @@ -1211,7 +1205,7 @@ ref_add (refnum, sym, stabs, value) ref_map[refnum].value = value; } -/* Return defined sym for the reference "refnum" */ +/* Return defined sym for the reference REFNUM. */ struct symbol * ref_search (refnum) int refnum; @@ -1221,7 +1215,8 @@ ref_search (refnum) return ref_map[refnum].sym; } -/* Return value for the reference "refnum" */ +/* Return value for the reference REFNUM. */ + static CORE_ADDR ref_search_value (refnum) int refnum; @@ -1231,9 +1226,8 @@ ref_search_value (refnum) return ref_map[refnum].value; } -/* Parse reference id and advance string to the next character following - the string. - Return the reference number. */ +/* Parse a reference id in STRING and return the resulting + reference number. Move STRING beyond the reference id. */ static int process_reference (string) @@ -1245,8 +1239,10 @@ process_reference (string) if (**string != '#') return 0; + /* Advance beyond the initial '#'. */ + p = *string + 1; + /* Read number as reference id. */ - p = *string + 1; /* Advance beyond '#' */ while (*p && isdigit (*p)) { refnum = refnum * 10 + *p - '0'; @@ -1256,9 +1252,9 @@ process_reference (string) return refnum; } -/* If string defines a reference, store away a pointer to the reference - definition for fast lookup when we "process_later", - and return the reference number. */ +/* If STRING defines a reference, store away a pointer to the reference + definition for later use. Return the reference number. */ + int symbol_reference_defined (string) char **string; @@ -1272,7 +1268,6 @@ symbol_reference_defined (string) if (*p == '=') { /* Symbol is being defined here. */ - *string = p + 1; return refnum; } @@ -1280,9 +1275,8 @@ symbol_reference_defined (string) { /* Must be a reference. Either the symbol has already been defined, or this is a forward reference to it. */ - *string = p; - return 0; /* Not defined here */ + return 0; } } @@ -1394,37 +1388,42 @@ define_symbol (valu, string, desc, type, objfile) char *s; int refnum, nlen; - /* Initialize symbol references and determine if this is - a definition. If symbol reference is being defined, go - ahead and add it. Otherwise, just return sym. */ + /* If STRING defines a new reference id, then add it to the + reference map. Else it must be referring to a previously + defined symbol, so add it to the alias list of the previously + defined symbol. */ s = string; if (refnum = symbol_reference_defined (&s), refnum) - ref_add (refnum, sym, string, SYMBOL_VALUE (sym)); + ref_add (refnum, sym, string, SYMBOL_VALUE (sym)); else - process_later (sym, string, resolve_symbol_reference); + resolve_symbol_reference (objfile, sym, string); - /* s is after refid... advance string there - so that the symbol name will not include the refid. */ + /* S..P contains the name of the symbol. We need to store + the correct name into SYMBOL_NAME. */ nlen = p - s; - if (nlen > 0) - { - SYMBOL_NAME (sym) = (char *) - obstack_alloc (&objfile -> symbol_obstack, nlen); - strncpy (SYMBOL_NAME (sym), s, nlen); - SYMBOL_NAME (sym)[nlen] = '\0'; - SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack); - } - else - /* FIXME! Want SYMBOL_NAME (sym) = 0; - Get error if leave name 0. So give it something. */ - { - nlen = p - string; - SYMBOL_NAME (sym) = (char *) - obstack_alloc (&objfile -> symbol_obstack, nlen); - strncpy (SYMBOL_NAME (sym), string, nlen); - SYMBOL_NAME (sym)[nlen] = '\0'; - SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack); - } + if (refnum) + { + if (nlen > 0) + { + SYMBOL_NAME (sym) = (char *) + obstack_alloc (&objfile -> symbol_obstack, nlen); + strncpy (SYMBOL_NAME (sym), s, nlen); + SYMBOL_NAME (sym)[nlen] = '\0'; + SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack); + } + else + /* FIXME! Want SYMBOL_NAME (sym) = 0; + Get error if leave name 0. So give it something. */ + { + nlen = p - string; + SYMBOL_NAME (sym) = (char *) + obstack_alloc (&objfile -> symbol_obstack, nlen); + strncpy (SYMBOL_NAME (sym), string, nlen); + SYMBOL_NAME (sym)[nlen] = '\0'; + SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack); + } + } + /* Advance STRING beyond the reference id. */ string = s; } else @@ -2108,7 +2107,7 @@ define_symbol (valu, string, desc, type, objfile) } } - /* Is there more to parse? eg. ";l(#1,#2);l(#3,#5)" */ + /* Is there more to parse? For example LRS/alias information? */ while (*p && (*p == ';' || *p == ',')) { p++; @@ -2117,8 +2116,8 @@ define_symbol (valu, string, desc, type, objfile) /* GNU extensions for live range splitting may be appended to the end of the stab string. eg. "l(#1,#2);l(#3,#5)" */ - /* Fix up ranges later. */ - process_later (sym, p, resolve_live_range); + /* Resolve the live range and add it to SYM's live range list. */ + resolve_live_range (objfile, sym, p); /* Find end of live range info. */ p = strchr (p, ')'); @@ -2130,18 +2129,18 @@ define_symbol (valu, string, desc, type, objfile) return sym; } +/* Add the live range found in P to the symbol SYM in objfile OBJFILE. */ -/* Add live range information to symbol. (eg. p is l(#1,#2)...) */ -static int +static void resolve_live_range (objfile, sym, p) struct objfile * objfile; struct symbol *sym; char *p; { - char *s=p; int refnum; CORE_ADDR start, end; - + + /* Sanity check the beginning of the stabs string. */ if (!*p || *p != 'l') error ("Internal error: live range string.\n"); p++; @@ -2150,8 +2149,10 @@ resolve_live_range (objfile, sym, p) error ("Internal error: live range string.\n"); p++; - /* Get starting value of range symbol reference. eg. "#1,#2),l(#3,#5)" - and advance p past the refid. */ + /* Get starting value of range and advance P past the reference id. + + ?!? In theory, the process_reference should never fail, but we should + catch that case just in case the compiler scrogged the stabs. */ refnum = process_reference (&p); start = ref_search_value (refnum); if (!start) @@ -2161,76 +2162,59 @@ resolve_live_range (objfile, sym, p) error ("Internal error: live range string.\n"); p++; - /* Get ending value of range symbol reference. eg. "#2),l(#3,#5)" */ + /* Get ending value of range and advance P past the reference id. + + ?!? In theory, the process_reference should never fail, but we should + catch that case just in case the compiler scrogged the stabs. */ refnum = process_reference (&p); end = ref_search_value (refnum); if (!end) error ("Internal error: live range symbol not found.\n"); - add_live_range (objfile, sym, start, end); - if (!*p || *p != ')') error ("Internal error: live range string.\n"); - p++; - return 0; + + /* Now that we know the bounds of the range, add it to the + symbol. */ + add_live_range (objfile, sym, start, end); } +/* Add a new live range defined by START and END to the symbol SYM + in objfile OBJFILE. */ + static void add_live_range (objfile, sym, start, end) struct objfile *objfile; struct symbol *sym; CORE_ADDR start, end; { - struct live_range *r, *rs; + struct range_list *r, *rs; if (start >= end) error ("Internal error: end of live range follows start.\n"); /* Alloc new live range structure. */ - r = (struct live_range *) + r = (struct range_list *) obstack_alloc (&objfile->type_obstack, - sizeof (struct live_range)); + sizeof (struct range_list)); r->start = start; r->end = end; r->next = 0; /* Append this range to the symbol's range list. */ - if (!SYMBOL_RANGE (sym)) + if (!SYMBOL_RANGES (sym)) { - SYMBOL_RANGE (sym) = r; + SYMBOL_RANGES (sym) = r; } else { /* Get the last range for the symbol. */ - for (rs = SYMBOL_RANGE (sym); rs->next; rs = rs->next) + for (rs = SYMBOL_RANGES (sym); rs->next; rs = rs->next) ; rs->next = r; } } -/* Given addr, Search thu alias list to find the one active. */ -struct symbol * -ref_search_val (sym, addr) - struct symbol *sym; - CORE_ADDR addr; -{ - struct live_range *r; - - while (sym) - { - if (!SYMBOL_RANGE (sym)) - return sym; - for (r = SYMBOL_RANGE (sym); r; r = r->next) - { - if (r->start <= addr - && r->end > addr) - return sym; - } - sym = SYMBOL_ALIASES (sym); - } - return 0; -} - /* Skip rest of this symbol and return an error type. @@ -4973,6 +4957,9 @@ scan_file_globals (objfile) if (SYMBOL_NAME (msymbol)[0] == SYMBOL_NAME (sym)[0] && STREQ(SYMBOL_NAME (msymbol) + 1, SYMBOL_NAME (sym) + 1)) { + + struct alias_list *aliases; + /* Splice this symbol out of the hash chain and assign the value we have to it. */ if (prev) @@ -4994,19 +4981,30 @@ scan_file_globals (objfile) /* FIXME: Maybe should have added aliases to the global chain, resolved symbol name, then treated aliases as normal symbols? Still, we wouldn't want to add_to_list. */ /* Now do the same for each alias of this symbol */ - for (rsym = sym; rsym; rsym = SYMBOL_ALIASES (rsym)) + rsym = sym; + aliases = SYMBOL_ALIASES (sym); + while (rsym) { if (SYMBOL_CLASS (rsym) == LOC_BLOCK) - { - fix_common_block (rsym, SYMBOL_VALUE_ADDRESS (msymbol)); - } + { + fix_common_block (rsym, + SYMBOL_VALUE_ADDRESS (msymbol)); + } else - { - SYMBOL_VALUE_ADDRESS (rsym) + { + SYMBOL_VALUE_ADDRESS (rsym) = SYMBOL_VALUE_ADDRESS (msymbol); - } + } SYMBOL_SECTION (rsym) = SYMBOL_SECTION (msymbol); + if (aliases) + { + rsym = aliases->sym; + aliases = aliases->next; + } + else + rsym = NULL; } + if (prev) { diff --git a/gdb/stabsread.h b/gdb/stabsread.h index 7561726..77ea291 100644 --- a/gdb/stabsread.h +++ b/gdb/stabsread.h @@ -243,11 +243,6 @@ extern void ref_add PARAMS ((int, struct symbol *, char *, CORE_ADDR)); extern struct symbol * ref_search PARAMS ((int)); -extern struct symbol * resolve_reference PARAMS ((char *p)); - -extern int resolve_symbol_reference - PARAMS ((struct objfile * objfile, struct symbol * sym, char * p)); - extern int resolve_cfront_continuation PARAMS ((struct objfile * objfile, struct symbol * sym, char * p)); -- cgit v1.1