diff options
author | Jeff Law <law@redhat.com> | 1995-03-04 00:55:45 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1995-03-04 00:55:45 +0000 |
commit | 3a0fbb3bb368cc59bf6780579d8cedc3c2d604cf (patch) | |
tree | 6ec5bd225845a797ecce50fad23bb901d5715dd1 /gdb/hpread.c | |
parent | ab62d0499e0aae8236683eb37999d5f03c98edc9 (diff) | |
download | gdb-3a0fbb3bb368cc59bf6780579d8cedc3c2d604cf.zip gdb-3a0fbb3bb368cc59bf6780579d8cedc3c2d604cf.tar.gz gdb-3a0fbb3bb368cc59bf6780579d8cedc3c2d604cf.tar.bz2 |
* hpread.c (hpread_record_lines): New argument "offset". All
callers changed. Use it to handle dynamic address relocation.
(hpread_build_psymtabs): Adjust texthigh as we read each function
debug symbol. Fix computation of texthigh.
(hpread_read_subrange_type): Work around macro bugs in HP's
compilers.
(hpread_process_one_debug_symbol): Correctly map source lines.
Diffstat (limited to 'gdb/hpread.c')
-rw-r--r-- | gdb/hpread.c | 49 |
1 files changed, 29 insertions, 20 deletions
diff --git a/gdb/hpread.c b/gdb/hpread.c index 099a883..bc8f834 100644 --- a/gdb/hpread.c +++ b/gdb/hpread.c @@ -174,7 +174,8 @@ static void hpread_process_one_debug_symbol struct objfile *, CORE_ADDR, int, char *, int)); static sltpointer hpread_record_lines - PARAMS ((struct subfile *, sltpointer, sltpointer, struct objfile *)); + PARAMS ((struct subfile *, sltpointer, sltpointer, + struct objfile *, CORE_ADDR)); static struct type *hpread_read_function_type PARAMS ((dnttpointer, union dnttentry *, struct objfile *)); @@ -448,7 +449,6 @@ hpread_build_psymtabs (objfile, section_offsets, mainline) if (pst && past_first_source_file) { - texthigh += ANOFFSET (section_offsets, SECT_OFF_TEXT); hpread_end_psymtab (pst, psymtab_include_list, includes_used, (hp_symnum @@ -498,10 +498,12 @@ hpread_build_psymtabs (objfile, section_offsets, mainline) case DNTT_TYPE_ENTRY: /* The beginning of a function. DNTT_TYPE_ENTRY may also denote a secondary entry point. */ + valu = dn_bufp->dfunc.hiaddr + ANOFFSET (section_offsets, + SECT_OFF_TEXT); + if (valu > texthigh) + texthigh = valu; valu = dn_bufp->dfunc.lowaddr + ANOFFSET (section_offsets, SECT_OFF_TEXT); - if (dn_bufp->dfunc.hiaddr > texthigh) - texthigh = dn_bufp->dfunc.hiaddr; SET_NAMESTRING (dn_bufp, &namestring, objfile); ADD_PSYMBOL_TO_LIST (namestring, strlen (namestring), VAR_NAMESPACE, LOC_BLOCK, @@ -515,7 +517,6 @@ hpread_build_psymtabs (objfile, section_offsets, mainline) and file blocks right now. */ if (dn_bufp->dend.endkind == DNTT_TYPE_MODULE) { - texthigh += ANOFFSET (section_offsets, SECT_OFF_TEXT); hpread_end_psymtab (pst, psymtab_include_list, includes_used, (hp_symnum * sizeof (struct dntt_type_block)), @@ -1602,8 +1603,9 @@ hpread_read_subrange_type (hp_type, dn_bufp, objfile) TYPE_CODE (type) = TYPE_CODE_RANGE; TYPE_LENGTH (type) = dn_bufp->dsubr.bitlength / 8; TYPE_NFIELDS (type) = 2; - TYPE_FIELDS (type) = (struct field *) obstack_alloc - (&objfile->type_obstack, 2 * sizeof (struct field)); + TYPE_FIELDS (type) + = (struct field *) obstack_alloc (&objfile->type_obstack, + 2 * sizeof (struct field)); if (dn_bufp->dsubr.dyn_low) TYPE_FIELD_BITPOS (type, 0) = 0; @@ -1738,10 +1740,11 @@ hpread_type_lookup (hp_type, objfile) } static sltpointer -hpread_record_lines (subfile, s_idx, e_idx, objfile) +hpread_record_lines (subfile, s_idx, e_idx, objfile, offset) struct subfile *subfile; sltpointer s_idx, e_idx; struct objfile *objfile; + CORE_ADDR offset; { union sltentry *sl_bufp; @@ -1751,7 +1754,8 @@ hpread_record_lines (subfile, s_idx, e_idx, objfile) /* Only record "normal" entries in the SLT. */ if (sl_bufp->snorm.sltdesc == SLT_NORMAL || sl_bufp->snorm.sltdesc == SLT_EXIT) - record_line (subfile, sl_bufp->snorm.line, sl_bufp->snorm.address); + record_line (subfile, sl_bufp->snorm.line, + sl_bufp->snorm.address + offset); s_idx++; } return e_idx; @@ -1808,14 +1812,19 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, finish the symbol table of the previous source file (if any) and start accumulating a new symbol table. */ - valu = text_offset + offset; /* Relocate for dynamic loading */ + valu = text_offset; if (!last_source_file) - start_symtab (name, NULL, valu); - - SL_INDEX (objfile) = hpread_record_lines (current_subfile, - SL_INDEX (objfile), - dn_bufp->dsfile.address, - objfile); + { + start_symtab (name, NULL, valu); + SL_INDEX (objfile) = dn_bufp->dsfile.address; + } + else + { + SL_INDEX (objfile) = hpread_record_lines (current_subfile, + SL_INDEX (objfile), + dn_bufp->dsfile.address, + objfile, offset); + } start_subfile (name, NULL); break; @@ -1830,7 +1839,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, SL_INDEX (objfile) = hpread_record_lines (current_subfile, SL_INDEX (objfile), dn_bufp->dfunc.address, - objfile); + objfile, offset); WITHIN_FUNCTION (objfile) = 1; CURRENT_FUNCTION_VALUE (objfile) = valu; @@ -1858,7 +1867,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, SL_INDEX (objfile) = hpread_record_lines (current_subfile, SL_INDEX (objfile), dn_bufp->dbegin.address, - objfile); + objfile, offset); SYMBOL_LINE (sym) = hpread_get_line (dn_bufp->dbegin.address, objfile); record_line (current_subfile, SYMBOL_LINE (sym), valu); break; @@ -1868,7 +1877,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, SL_INDEX (objfile) = hpread_record_lines (current_subfile, SL_INDEX (objfile), dn_bufp->dbegin.address, - objfile); + objfile, offset); valu = hpread_get_location (dn_bufp->dbegin.address, objfile); valu += offset; /* Relocate for dynamic loading */ desc = hpread_get_depth (dn_bufp->dbegin.address, objfile); @@ -1880,7 +1889,7 @@ hpread_process_one_debug_symbol (dn_bufp, name, section_offsets, objfile, SL_INDEX (objfile) = hpread_record_lines (current_subfile, SL_INDEX (objfile), dn_bufp->dend.address + 1, - objfile); + objfile, offset); switch (dn_bufp->dend.endkind) { case DNTT_TYPE_MODULE: |