diff options
author | Jeff Law <law@redhat.com> | 1997-10-22 19:04:30 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1997-10-22 19:04:30 +0000 |
commit | ab41527bce44356bde40cd303ad4c204f3ffc572 (patch) | |
tree | 40a3cf7fa0a359039101b70474d3a1cb874633a1 /gdb/dbxread.c | |
parent | f109cc3d9ef5ddcbd26afa98207b3eebaea9463f (diff) | |
download | gdb-ab41527bce44356bde40cd303ad4c204f3ffc572.zip gdb-ab41527bce44356bde40cd303ad4c204f3ffc572.tar.gz gdb-ab41527bce44356bde40cd303ad4c204f3ffc572.tar.bz2 |
* dbxread.c: Fix various violations of the GNU coding and
formatting standards. Update/add comments to make code
clearer.
(process_later): Use xrealloc instead of realloc.
Diffstat (limited to 'gdb/dbxread.c')
-rw-r--r-- | gdb/dbxread.c | 81 |
1 files changed, 59 insertions, 22 deletions
diff --git a/gdb/dbxread.c b/gdb/dbxread.c index ad2fe08..d7af14f 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -165,6 +165,11 @@ static int block_address_function_relative = 0; reflect the address it will be loaded at). */ static CORE_ADDR lowest_text_address; +/* Non-zero if there is any line number info in the objfile. Prevents + end_psymtab from discarding an otherwise empty psymtab. */ + +static int has_line_numbers; + /* Complaints about the symbols we have encountered. */ struct complaint lbrac_complaint = @@ -794,21 +799,29 @@ static struct cont_elem *cont_list = 0; static int cont_limit = 0; static int cont_count = 0; +/* Arrange for function F to be called with arguments SYM and P later + in the stabs reading process. */ void process_later (sym, p, f) - struct symbol * sym; - char * p; + struct symbol *sym; + char *p; int (*f) PARAMS ((struct objfile *, struct symbol *, char *)); { + + /* Allocate more space for the deferred list. */ if (cont_count >= cont_limit - 1) { cont_limit += 32; /* chunk size */ - cont_list = (struct cont_elem *) realloc (cont_list, - cont_limit * sizeof (struct cont_elem)); + + cont_list + = (struct cont_elem *) xrealloc (cont_list, + (cont_limit + * sizeof (struct cont_elem))); if (!cont_list) error ("Virtual memory exhausted\n"); } - /* save state so we can process these stabs later */ + + /* Save state variables so we can process these stabs later. */ cont_list[cont_count].sym_idx = symbuf_idx; cont_list[cont_count].sym_end = symbuf_end; cont_list[cont_count].symnum = symnum; @@ -818,40 +831,49 @@ process_later (sym, p, f) cont_count++; } +/* Call deferred funtions in CONT_LIST. */ + static void process_now (objfile) - struct objfile * objfile; + struct objfile *objfile; { int i; - /* save original state */ - int save_symbuf_idx = symbuf_idx; - int save_symbuf_end = symbuf_end; - int save_symnum = symnum; + int save_symbuf_idx; + int save_symbuf_end; + int save_symnum; struct symbol *sym; char *stabs; int err; int (*func) PARAMS ((struct objfile *, struct symbol *, char *)); - for (i=0; i<cont_count; i++) + /* Save the state of our caller, we'll want to restore it before + returning. */ + save_symbuf_idx = symbuf_idx; + save_symbuf_end = symbuf_end; + save_symnum = symnum; + + /* Iterate over all the deferred stabs. */ + for (i = 0; i < cont_count; i++) { - /* Set state as if we were parsing stabs strings - for this symbol */ - symbuf_idx = cont_list[i].sym_idx; /* statics used by gdb */ + /* Restore the state for this deferred stab. */ + symbuf_idx = cont_list[i].sym_idx; symbuf_end = cont_list[i].sym_end; symnum = cont_list[i].symnum; sym = cont_list[i].sym; stabs = cont_list[i].stabs; func = cont_list[i].func; + /* Call the function to handle this deferrd stab. */ err = (*func) (objfile, sym, stabs); if (err) error ("Internal error: unable to resolve stab.\n"); } - /* restore original state */ + + /* Restore our caller's state. */ symbuf_idx = save_symbuf_idx; symbuf_end = save_symbuf_end; symnum = save_symnum; - cont_count=0; /* reset for next run */ + cont_count = 0; } @@ -1243,6 +1265,7 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size) symbuf_end = symbuf_idx = 0; next_symbol_text_func = dbx_next_symbol_text; textlow_not_set = 1; + has_line_numbers = 0; for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++) { @@ -1256,7 +1279,10 @@ read_dbx_symtab (section_offsets, objfile, text_addr, text_size) * Special case to speed up readin. */ if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE) - continue; + { + has_line_numbers = 1; + continue; + } INTERNALIZE_SYMBOL (nlist, bufp, abfd); OBJSTAT (objfile, n_stabs++); @@ -1517,7 +1543,8 @@ end_psymtab (pst, include_list, num_includes, capping_symbol_offset, if (num_includes == 0 && number_dependencies == 0 && pst->n_global_syms == 0 - && pst->n_static_syms == 0) + && pst->n_static_syms == 0 + && has_line_numbers == 0) { /* Throw away this psymtab, it's empty. We can't deallocate it, since it is on the obstack, but we can forget to chain it on the list. */ @@ -1815,7 +1842,7 @@ read_ofile_symtab (pst) pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT); /* Process items which we had to "process_later" due to dependancies - on other stabs. */ + on other stabs. */ process_now (objfile); end_stabs (); @@ -2370,23 +2397,33 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile) break; } - /* Special GNU C extension for referencing names. */ + /* '#' is a GNU C extension to allow one symbol to refer to another + related symbol. + + Generally this is used so that an alias can refer to its main + symbol. */ if (name[0] == '#') { /* Initialize symbol reference names and determine if this is a definition. If symbol reference is being defined, go ahead and add it. Otherwise, just return sym. */ + 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". */ - s = name; + /* If this stab defines a new reference ID that is not on the + reference list, then put it on the reference list. + + We go ahead and advance NAME past the reference, even though + it is not strictly necessary at this time. */ if (refnum = symbol_reference_defined (&s), refnum) if (!ref_search (refnum)) ref_add (refnum, 0, name, valu); - name = s; /* Advance past refid. */ + name = s; } |