aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog55
-rw-r--r--gdb/dbxread.c137
-rw-r--r--gdb/dwarf-index-write.c8
-rw-r--r--gdb/dwarf2read.c111
-rw-r--r--gdb/mdebugread.c107
-rw-r--r--gdb/objfiles.c11
-rw-r--r--gdb/psympriv.h27
-rw-r--r--gdb/psymtab.c129
-rw-r--r--gdb/symfile-debug.c18
-rw-r--r--gdb/symfile.h6
-rw-r--r--gdb/xcoffread.c27
11 files changed, 280 insertions, 356 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b4ab4ff..6e80efd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,58 @@
+2018-07-26 Tom Tromey <tom@tromey.com>
+
+ * dwarf-index-write.c (add_address_entry): Don't add objfile
+ offsets.
+ * dbxread.c (find_stab_function): Rename from
+ find_stab_function_addr. Return a bound_minimal_symbol.
+ (read_dbx_symtab): Use raw_text_low, raw_text_high.
+ Don't add objfile offsets.
+ (end_psymtab): Use raw_text_low, raw_text_high,
+ MSYMBOL_VALUE_RAW_ADDRESS.
+ (read_ofile_symtab): Update.
+ (process_one_symbol): Update.
+ * dwarf2read.c (create_addrmap_from_index): Don't add objfile
+ offsets.
+ (dw2_relocate): Remove.
+ (dw2_find_pc_sect_symtab): Bias PC by the text offset before
+ searching addrmap.
+ (dwarf2_gdb_index_functions, dwarf2_debug_names_functions):
+ Update.
+ (process_psymtab_comp_unit_reader, add_partial_symbol)
+ (add_partial_subprogram, dwarf2_ranges_read): Update.
+ (load_partial_dies): Update.
+ (add_address_entry): Don't add objfile offsets.
+ (dwarf2_build_include_psymtabs): Update.
+ (create_addrmap_from_aranges): Don't add objfile offsets.
+ (dw2_find_pc_sect_compunit_symtab): Update.
+ * mdebugread.c (parse_symbol): Don't add objfile offsets.
+ (parse_lines): Remove 'pst' parameter, replace with 'textlow'.
+ Update.
+ (parse_partial_symbols): Don't add objfile offsets. Use
+ raw_text_low, raw_text_high. Update.
+ (handle_psymbol_enumerators, psymtab_to_symtab_1): Update.
+ * objfiles.c (objfile_relocate1): Don't relocate psymtabs_addrmap
+ or call 'relocate' quick function. Clear psymbol_map.
+ * psympriv.h (struct partial_symbol) <address>: Add section
+ offset.
+ <set_unrelocated_address>: Rename from set_address.
+ <raw_text_low, raw_text_high>: New methods.
+ <text_low, text_high>: Add objfile parameter.
+ (add_psymbol_to_bcache): Add 'section' parameter. Call
+ set_unrelocated_address.
+ * psymtab.c (find_pc_sect_psymtab_closer, find_pc_sect_psymtab)
+ (find_pc_psymbol): Update.
+ (fixup_psymbol_section, relocate_psymtabs): Remove.
+ (dump_psymtab, psym_functions): Update.
+ (add_psymbol_to_bcache, add_psymbol_to_list): Add 'section'
+ parameter.
+ (maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
+ (start_psymtab_common): Update.
+ * symfile-debug.c (debug_qf_relocate): Remove.
+ (debug_sym_quick_functions): Update.
+ * symfile.h (struct quick_symbol_functions) <relocate>: Remove.
+ * xcoffread.c (scan_xcoff_symtab): Don't add objfile offsets.
+ Update.
+
2018-07-26 Tom Tromey <tromey@redhat.com>
* dbxread.c (end_psymtab): Use text_high_valid and
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 5409a72..e004e8c 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -902,9 +902,9 @@ set_namestring (struct objfile *objfile, const struct internal_nlist *nlist)
return namestring;
}
-static CORE_ADDR
-find_stab_function_addr (const char *namestring, const char *filename,
- struct objfile *objfile)
+static struct bound_minimal_symbol
+find_stab_function (const char *namestring, const char *filename,
+ struct objfile *objfile)
{
struct bound_minimal_symbol msym;
int n;
@@ -944,7 +944,7 @@ find_stab_function_addr (const char *namestring, const char *filename,
msym = lookup_minimal_symbol (p, NULL, objfile);
}
- return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
+ return msym;
}
static void
@@ -1137,18 +1137,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
|| (namestring[(nsl = strlen (namestring)) - 1] == 'o'
&& namestring[nsl - 2] == '.'))
{
- nlist.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
-
if (past_first_source_file && pst
/* The gould NP1 uses low values for .o and -l symbols
which are not the address. */
- && nlist.n_value >= pst->text_low ())
+ && nlist.n_value >= pst->raw_text_low ())
{
dbx_end_psymtab (objfile, pst, psymtab_include_list,
includes_used, symnum * symbol_size,
- nlist.n_value > pst->text_high ()
- ? nlist.n_value : pst->text_high (),
+ nlist.n_value > pst->raw_text_high ()
+ ? nlist.n_value : pst->raw_text_high (),
dependency_list, dependencies_used,
textlow_not_set);
pst = (struct partial_symtab *) 0;
@@ -1235,8 +1232,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
static const char *dirname_nso;
int prev_textlow_not_set;
- valu = nlist.n_value + ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
+ valu = nlist.n_value;
prev_textlow_not_set = textlow_not_set;
@@ -1263,8 +1259,8 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
{
dbx_end_psymtab (objfile, pst, psymtab_include_list,
includes_used, symnum * symbol_size,
- (valu > pst->text_high ()
- ? valu : pst->text_high ()),
+ (valu > pst->raw_text_high ()
+ ? valu : pst->raw_text_high ()),
dependency_list, dependencies_used,
prev_textlow_not_set);
pst = (struct partial_symtab *) 0;
@@ -1438,7 +1434,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
function relative stabs, or the address of the function's
end for old style stabs. */
valu = nlist.n_value + last_function_start;
- if (pst->text_high () == 0 || valu > pst->text_high ())
+ if (pst->raw_text_high () == 0 || valu > pst->raw_text_high ())
pst->set_text_high (valu);
break;
}
@@ -1478,25 +1474,22 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
switch (p[1])
{
case 'S':
- nlist.n_value += ANOFFSET (objfile->section_offsets,
- data_sect_index);
-
if (gdbarch_static_transform_name_p (gdbarch))
gdbarch_static_transform_name (gdbarch, namestring);
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_STATIC,
+ data_sect_index,
&objfile->static_psymbols,
nlist.n_value, psymtab_language, objfile);
continue;
case 'G':
- nlist.n_value += ANOFFSET (objfile->section_offsets,
- data_sect_index);
/* The addresses in these entries are reported to be
wrong. See the code that reads 'G's for symtabs. */
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_STATIC,
+ data_sect_index,
&objfile->global_psymbols,
nlist.n_value, psymtab_language, objfile);
continue;
@@ -1513,14 +1506,14 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
&& namestring[0] != ' '))
{
add_psymbol_to_list (sym_name, sym_len, 1,
- STRUCT_DOMAIN, LOC_TYPEDEF,
+ STRUCT_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
if (p[2] == 't')
{
/* Also a typedef with the same name. */
add_psymbol_to_list (sym_name, sym_len, 1,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
p += 1;
@@ -1532,7 +1525,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
if (p != namestring) /* a name is there, not just :T... */
{
add_psymbol_to_list (sym_name, sym_len, 1,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
}
@@ -1593,7 +1586,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
/* Note that the value doesn't matter for
enum constants in psymtabs, just in symtabs. */
add_psymbol_to_list (p, q - p, 1,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
&objfile->static_psymbols, 0,
psymtab_language, objfile);
/* Point past the name. */
@@ -1611,7 +1604,7 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (sym_name, sym_len, 1,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
&objfile->static_psymbols, 0,
psymtab_language, objfile);
continue;
@@ -1627,28 +1620,19 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
function_outside_compilation_unit_complaint (name);
xfree (name);
}
- nlist.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
/* Kludges for ELF/STABS with Sun ACC. */
last_function_name = namestring;
/* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
value for the bottom of the text seg in those cases. */
- if (nlist.n_value == ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile))
+ if (nlist.n_value == 0
&& gdbarch_sofun_address_maybe_missing (gdbarch))
{
- CORE_ADDR minsym_valu =
- find_stab_function_addr (namestring,
- pst ? pst->filename : NULL,
- objfile);
-
- /* find_stab_function_addr will return 0 if the minimal
- symbol wasn't found. (Unfortunately, this might also
- be a valid address.) Anyway, if it *does* return 0,
- it is likely that the value was set correctly to begin
- with... */
- if (minsym_valu != 0)
- nlist.n_value = minsym_valu;
+ struct bound_minimal_symbol minsym
+ = find_stab_function (namestring,
+ pst ? pst->filename : NULL,
+ objfile);
+ if (minsym.minsym != NULL)
+ nlist.n_value = MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym);
}
if (pst && textlow_not_set
&& gdbarch_sofun_address_maybe_missing (gdbarch))
@@ -1668,16 +1652,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
the partial symbol table. */
if (pst
&& (textlow_not_set
- || (nlist.n_value < pst->text_low ()
- && (nlist.n_value
- != ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile))))))
+ || (nlist.n_value < pst->raw_text_low ()
+ && (nlist.n_value != 0))))
{
pst->set_text_low (nlist.n_value);
textlow_not_set = 0;
}
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->static_psymbols,
nlist.n_value, psymtab_language, objfile);
continue;
@@ -1696,28 +1679,19 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
function_outside_compilation_unit_complaint (name);
xfree (name);
}
- nlist.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
/* Kludges for ELF/STABS with Sun ACC. */
last_function_name = namestring;
/* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
value for the bottom of the text seg in those cases. */
- if (nlist.n_value == ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile))
+ if (nlist.n_value == 0
&& gdbarch_sofun_address_maybe_missing (gdbarch))
{
- CORE_ADDR minsym_valu =
- find_stab_function_addr (namestring,
- pst ? pst->filename : NULL,
- objfile);
-
- /* find_stab_function_addr will return 0 if the minimal
- symbol wasn't found. (Unfortunately, this might also
- be a valid address.) Anyway, if it *does* return 0,
- it is likely that the value was set correctly to begin
- with... */
- if (minsym_valu != 0)
- nlist.n_value = minsym_valu;
+ struct bound_minimal_symbol minsym
+ = find_stab_function (namestring,
+ pst ? pst->filename : NULL,
+ objfile);
+ if (minsym.minsym != NULL)
+ nlist.n_value = MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym);
}
if (pst && textlow_not_set
&& gdbarch_sofun_address_maybe_missing (gdbarch))
@@ -1737,16 +1711,15 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
the partial symbol table. */
if (pst
&& (textlow_not_set
- || (nlist.n_value < pst->text_low ()
- && (nlist.n_value
- != ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile))))))
+ || (nlist.n_value < pst->raw_text_low ()
+ && (nlist.n_value != 0))))
{
pst->set_text_low (nlist.n_value);
textlow_not_set = 0;
}
add_psymbol_to_list (sym_name, sym_len, 1,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->global_psymbols,
nlist.n_value, psymtab_language, objfile);
continue;
@@ -1922,15 +1895,14 @@ read_dbx_symtab (minimal_symbol_reader &reader, struct objfile *objfile)
is. */
CORE_ADDR text_end =
(lowest_text_address == (CORE_ADDR) -1
- ? (text_addr + ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile)))
+ ? text_addr
: lowest_text_address)
+ text_size;
dbx_end_psymtab (objfile, pst, psymtab_include_list, includes_used,
symnum * symbol_size,
- (text_end > pst->text_high ()
- ? text_end : pst->text_high ()),
+ (text_end > pst->raw_text_high ()
+ ? text_end : pst->raw_text_high ()),
dependency_list, dependencies_used, textlow_not_set);
}
}
@@ -2029,7 +2001,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
}
if (minsym.minsym)
- pst->set_text_high (BMSYMBOL_VALUE_ADDRESS (minsym)
+ pst->set_text_high (MSYMBOL_VALUE_RAW_ADDRESS (minsym.minsym)
+ MSYMBOL_SIZE (minsym.minsym));
last_function_name = NULL;
@@ -2039,7 +2011,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
;
/* This test will be true if the last .o file is only data. */
else if (textlow_not_set)
- pst->set_text_low (pst->text_high ());
+ pst->set_text_low (pst->raw_text_high ());
else
{
struct partial_symtab *p1;
@@ -2052,7 +2024,7 @@ dbx_end_psymtab (struct objfile *objfile, struct partial_symtab *pst,
ALL_OBJFILE_PSYMTABS (objfile, p1)
{
if (!p1->text_high_valid && p1->text_low_valid && p1 != pst)
- p1->set_text_high (pst->text_low ());
+ p1->set_text_high (pst->raw_text_low ());
}
}
@@ -2238,8 +2210,8 @@ read_ofile_symtab (struct objfile *objfile, struct partial_symtab *pst)
sym_offset = LDSYMOFF (pst);
sym_size = LDSYMLEN (pst);
- text_offset = pst->text_low ();
- text_size = pst->text_high () - pst->text_low ();
+ text_offset = pst->text_low (objfile);
+ text_size = pst->text_high (objfile) - pst->text_low (objfile);
section_offsets = objfile->section_offsets;
dbxread_objfile = objfile;
@@ -2849,18 +2821,11 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
SECT_OFF_TEXT (objfile))
&& gdbarch_sofun_address_maybe_missing (gdbarch))
{
- CORE_ADDR minsym_valu =
- find_stab_function_addr (name, get_last_source_file (),
- objfile);
-
- /* The function find_stab_function_addr will return
- 0 if the minimal symbol wasn't found.
- (Unfortunately, this might also be a valid
- address.) Anyway, if it *does* return 0, it is
- likely that the value was set correctly to begin
- with... */
- if (minsym_valu != 0)
- valu = minsym_valu;
+ struct bound_minimal_symbol minsym
+ = find_stab_function (name, get_last_source_file (),
+ objfile);
+ if (minsym.minsym != NULL)
+ valu = BMSYMBOL_VALUE_ADDRESS (minsym);
}
/* These addresses are absolute. */
diff --git a/gdb/dwarf-index-write.c b/gdb/dwarf-index-write.c
index 0210d2e..fd245a0 100644
--- a/gdb/dwarf-index-write.c
+++ b/gdb/dwarf-index-write.c
@@ -427,12 +427,8 @@ static void
add_address_entry (struct objfile *objfile, data_buf &addr_vec,
CORE_ADDR start, CORE_ADDR end, unsigned int cu_index)
{
- CORE_ADDR baseaddr;
-
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
- addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start - baseaddr);
- addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end - baseaddr);
+ addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, start);
+ addr_vec.append_uint (8, BFD_ENDIAN_LITTLE, end);
addr_vec.append_data (MAYBE_SWAP (cu_index));
}
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 3b0cbd9..2c82d81 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -3177,8 +3177,8 @@ create_addrmap_from_index (struct dwarf2_per_objfile *dwarf2_per_objfile,
continue;
}
- lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr);
- hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr);
+ lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr) - baseaddr;
+ hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr) - baseaddr;
addrmap_set_empty (mutable_map, lo, hi - 1,
dwarf2_per_objfile->get_cu (cu_index));
}
@@ -3336,8 +3336,10 @@ create_addrmap_from_aranges (struct dwarf2_per_objfile *dwarf2_per_objfile,
continue;
}
ULONGEST end = start + length;
- start = gdbarch_adjust_dwarf2_addr (gdbarch, start + baseaddr);
- end = gdbarch_adjust_dwarf2_addr (gdbarch, end + baseaddr);
+ start = (gdbarch_adjust_dwarf2_addr (gdbarch, start + baseaddr)
+ - baseaddr);
+ end = (gdbarch_adjust_dwarf2_addr (gdbarch, end + baseaddr)
+ - baseaddr);
addrmap_set_empty (mutable_map, start, end - 1, per_cu);
}
}
@@ -4099,14 +4101,6 @@ dw2_dump (struct objfile *objfile)
}
static void
-dw2_relocate (struct objfile *objfile,
- const struct section_offsets *new_offsets,
- const struct section_offsets *delta)
-{
- /* There's nothing to relocate here. */
-}
-
-static void
dw2_expand_symtabs_for_function (struct objfile *objfile,
const char *func_name)
{
@@ -5237,8 +5231,10 @@ dw2_find_pc_sect_compunit_symtab (struct objfile *objfile,
if (!objfile->psymtabs_addrmap)
return NULL;
+ CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile));
data = (struct dwarf2_per_cu_data *) addrmap_find (objfile->psymtabs_addrmap,
- pc);
+ pc - baseaddr);
if (!data)
return NULL;
@@ -5336,7 +5332,6 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions =
dw2_lookup_symbol,
dw2_print_stats,
dw2_dump,
- dw2_relocate,
dw2_expand_symtabs_for_function,
dw2_expand_all_symtabs,
dw2_expand_symtabs_with_fullname,
@@ -6149,7 +6144,6 @@ const struct quick_symbol_functions dwarf2_debug_names_functions =
dw2_debug_names_lookup_symbol,
dw2_print_stats,
dw2_debug_names_dump,
- dw2_relocate,
dw2_debug_names_expand_symtabs_for_function,
dw2_expand_all_symtabs,
dw2_expand_symtabs_with_fullname,
@@ -6544,9 +6538,12 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
if (lh == NULL)
return; /* No linetable, so no includes. */
- /* NOTE: pst->dirname is DW_AT_comp_dir (if present). */
+ /* NOTE: pst->dirname is DW_AT_comp_dir (if present). Also note
+ that we pass in the raw text_low here; that is ok because we're
+ only decoding the line table to make include partial symtabs, and
+ so the addresses aren't really used. */
dwarf_decode_lines (lh.get (), pst->dirname, cu, pst,
- pst->text_low (), 1);
+ pst->raw_text_low (), 1);
}
static hashval_t
@@ -7930,14 +7927,17 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
cu_bounds_kind = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc,
&best_highpc, cu, pst);
if (cu_bounds_kind == PC_BOUNDS_HIGH_LOW && best_lowpc < best_highpc)
- /* Store the contiguous range if it is not empty; it can be empty for
- CUs with no code. */
- addrmap_set_empty (objfile->psymtabs_addrmap,
- gdbarch_adjust_dwarf2_addr (gdbarch,
- best_lowpc + baseaddr),
- gdbarch_adjust_dwarf2_addr (gdbarch,
- best_highpc + baseaddr) - 1,
- pst);
+ {
+ CORE_ADDR low
+ = (gdbarch_adjust_dwarf2_addr (gdbarch, best_lowpc + baseaddr)
+ - baseaddr);
+ CORE_ADDR high
+ = (gdbarch_adjust_dwarf2_addr (gdbarch, best_highpc + baseaddr)
+ - baseaddr - 1);
+ /* Store the contiguous range if it is not empty; it can be
+ empty for CUs with no code. */
+ addrmap_set_empty (objfile->psymtabs_addrmap, low, high, pst);
+ }
/* Check if comp unit has_children.
If so, read the rest of the partial symbols from this comp unit.
@@ -7969,9 +7969,11 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
}
}
pst->set_text_low (gdbarch_adjust_dwarf2_addr (gdbarch,
- best_lowpc + baseaddr));
+ best_lowpc + baseaddr)
+ - baseaddr);
pst->set_text_high (gdbarch_adjust_dwarf2_addr (gdbarch,
- best_highpc + baseaddr));
+ best_highpc + baseaddr)
+ - baseaddr);
end_psymtab_common (objfile, pst);
@@ -8008,8 +8010,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
", %d global, %d static syms\n",
per_cu->is_debug_types ? "type" : "comp",
sect_offset_str (per_cu->sect_off),
- paddress (gdbarch, pst->text_low ()),
- paddress (gdbarch, pst->text_high ()),
+ paddress (gdbarch, pst->text_low (objfile)),
+ paddress (gdbarch, pst->text_high (objfile)),
pst->n_global_syms, pst->n_static_syms);
}
}
@@ -8802,7 +8804,8 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
{
case DW_TAG_inlined_subroutine:
case DW_TAG_subprogram:
- addr = gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr);
+ addr = (gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr)
+ - baseaddr);
if (pdi->is_external || cu->language == language_ada)
{
/* brobecker/2007-12-26: Normally, only "external" DIEs are part
@@ -8812,14 +8815,17 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->global_psymbols,
- addr, cu->language, objfile);
+ addr,
+ cu->language, objfile);
}
else
{
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->static_psymbols,
addr, cu->language, objfile);
}
@@ -8837,7 +8843,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
list = &objfile->static_psymbols;
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC,
- list, 0, cu->language, objfile);
+ -1, list, 0, cu->language, objfile);
}
break;
case DW_TAG_variable:
@@ -8872,9 +8878,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
VAR_DOMAIN, LOC_STATIC,
+ SECT_OFF_TEXT (objfile),
&objfile->global_psymbols,
- addr + baseaddr,
- cu->language, objfile);
+ addr, cu->language, objfile);
}
else
{
@@ -8891,8 +8897,9 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
VAR_DOMAIN, LOC_STATIC,
+ SECT_OFF_TEXT (objfile),
&objfile->static_psymbols,
- has_loc ? addr + baseaddr : (CORE_ADDR) 0,
+ has_loc ? addr : 0,
cu->language, objfile);
}
break;
@@ -8901,7 +8908,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
case DW_TAG_subrange_type:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, cu->language, objfile);
break;
@@ -8909,14 +8916,14 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
case DW_TAG_namespace:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->global_psymbols,
0, cu->language, objfile);
break;
case DW_TAG_module:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
- MODULE_DOMAIN, LOC_TYPEDEF,
+ MODULE_DOMAIN, LOC_TYPEDEF, -1,
&objfile->global_psymbols,
0, cu->language, objfile);
break;
@@ -8940,7 +8947,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
static vs. global. */
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
- STRUCT_DOMAIN, LOC_TYPEDEF,
+ STRUCT_DOMAIN, LOC_TYPEDEF, -1,
cu->language == language_cplus
? &objfile->global_psymbols
: &objfile->static_psymbols,
@@ -8950,7 +8957,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
case DW_TAG_enumerator:
add_psymbol_to_list (actual_name, strlen (actual_name),
built_actual_name != NULL,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
cu->language == language_cplus
? &objfile->global_psymbols
: &objfile->static_psymbols,
@@ -9033,10 +9040,12 @@ add_partial_subprogram (struct partial_die_info *pdi,
baseaddr = ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile));
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- pdi->lowpc + baseaddr);
- highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- pdi->highpc + baseaddr);
+ lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+ pdi->lowpc + baseaddr)
+ - baseaddr);
+ highpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+ pdi->highpc + baseaddr)
+ - baseaddr);
addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
cu->per_cu->v.psymtab);
}
@@ -14489,10 +14498,12 @@ dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
CORE_ADDR lowpc;
CORE_ADDR highpc;
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- range_beginning + baseaddr);
- highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- range_end + baseaddr);
+ lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+ range_beginning + baseaddr)
+ - baseaddr);
+ highpc = (gdbarch_adjust_dwarf2_addr (gdbarch,
+ range_end + baseaddr)
+ - baseaddr);
addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
ranges_pst);
}
@@ -18253,7 +18264,7 @@ load_partial_dies (const struct die_reader_specs *reader,
{
if (building_psymtab && pdi.name != NULL)
add_psymbol_to_list (pdi.name, strlen (pdi.name), 0,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, cu->language, objfile);
info_ptr = locate_pdi_sibling (reader, &pdi, info_ptr);
@@ -18287,7 +18298,7 @@ load_partial_dies (const struct die_reader_specs *reader,
complaint (_("malformed enumerator DIE ignored"));
else if (building_psymtab)
add_psymbol_to_list (pdi.name, strlen (pdi.name), 0,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
cu->language == language_cplus
? &objfile->global_psymbols
: &objfile->static_psymbols,
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 436ef95..39276ab 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -2160,12 +2160,9 @@ parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
numbers can go back and forth, apparently we can live
with that and do not need to reorder our linetables. */
-static void parse_lines (FDR *, PDR *, struct linetable *, int,
- struct partial_symtab *, CORE_ADDR);
-
static void
parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
- struct partial_symtab *pst, CORE_ADDR lowest_pdr_addr)
+ CORE_ADDR textlow, CORE_ADDR lowest_pdr_addr)
{
unsigned char *base;
int j, k;
@@ -2196,7 +2193,7 @@ parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
halt = base + fh->cbLine;
base += pr->cbLineOffset;
- adr = pst->text_low () + pr->adr - lowest_pdr_addr;
+ adr = textlow + pr->adr - lowest_pdr_addr;
l = adr >> 2; /* in words */
for (lineno = pr->lnLow; base < halt;)
@@ -2619,12 +2616,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
/* Determine the start address for this object file from the
file header and relocate it, except for Irix 5.2 zero fh->adr. */
if (fh->cpd)
- {
- textlow = fh->adr;
- if (relocatable || textlow != 0)
- textlow += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
- }
+ textlow = fh->adr;
else
textlow = 0;
pst = start_psymtab_common (objfile,
@@ -2671,7 +2663,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
psymtab_language = prev_language;
PST_PRIVATE (pst)->pst_language = psymtab_language;
- pst->set_text_high (pst->text_low ());
+ pst->set_text_high (pst->raw_text_low ());
/* For stabs-in-ecoff files, the second symbol must be @stab.
This symbol is emitted by mips-tfile to signal that the
@@ -2717,8 +2709,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
mst_file_text, sh.sc,
objfile);
}
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
procaddr = sh.value;
isym = AUX_GET_ISYM (fh->fBigendian,
@@ -2737,9 +2727,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
/* Kludge for Irix 5.2 zero fh->adr. */
if (!relocatable
&& (!pst->text_low_valid
- || procaddr < pst->text_low ()))
+ || procaddr < pst->raw_text_low ()))
pst->set_text_low (procaddr);
- if (high > pst->text_high ())
+ if (high > pst->raw_text_high ())
pst->set_text_high (high);
}
}
@@ -2762,8 +2752,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
record_minimal_symbol (reader, namestring, sh.value,
mst_file_data, sh.sc,
objfile);
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
break;
default:
@@ -2773,8 +2761,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
record_minimal_symbol (reader, namestring, sh.value,
mst_file_bss, sh.sc,
objfile);
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
break;
}
}
@@ -2827,22 +2813,16 @@ parse_partial_symbols (minimal_symbol_reader &reader,
case N_TEXT | N_EXT:
case N_NBTEXT | N_EXT:
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
goto record_it;
case N_DATA | N_EXT:
case N_NBDATA | N_EXT:
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
goto record_it;
case N_BSS:
case N_BSS | N_EXT:
case N_NBBSS | N_EXT:
case N_SETV | N_EXT: /* FIXME, is this in BSS? */
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
goto record_it;
case N_ABS | N_EXT:
@@ -2865,8 +2845,6 @@ parse_partial_symbols (minimal_symbol_reader &reader,
continue;
case N_DATA:
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
goto record_it;
case N_UNDF | N_EXT:
@@ -3067,27 +3045,24 @@ parse_partial_symbols (minimal_symbol_reader &reader,
switch (p[1])
{
case 'S':
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
-
if (gdbarch_static_transform_name_p (gdbarch))
namestring = gdbarch_static_transform_name
(gdbarch, namestring);
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
+ SECT_OFF_DATA (objfile),
&objfile->static_psymbols,
sh.value,
psymtab_language, objfile);
continue;
case 'G':
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
/* The addresses in these entries are reported
to be wrong. See the code that reads 'G's
for symtabs. */
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
+ SECT_OFF_DATA (objfile),
&objfile->global_psymbols,
sh.value,
psymtab_language, objfile);
@@ -3106,6 +3081,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
{
add_psymbol_to_list (namestring, p - namestring, 1,
STRUCT_DOMAIN, LOC_TYPEDEF,
+ -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
if (p[2] == 't')
@@ -3114,6 +3090,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
add_psymbol_to_list (namestring,
p - namestring, 1,
VAR_DOMAIN, LOC_TYPEDEF,
+ -1,
&objfile->static_psymbols,
0, psymtab_language,
objfile);
@@ -3127,6 +3104,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
{
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_TYPEDEF,
+ -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
}
@@ -3191,6 +3169,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
symtabs. */
add_psymbol_to_list (p, q - p, 1,
VAR_DOMAIN, LOC_CONST,
+ -1,
&objfile->static_psymbols,
0, psymtab_language,
objfile);
@@ -3208,7 +3187,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (namestring, p - namestring, 1,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
continue;
@@ -3224,10 +3203,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
function_outside_compilation_unit_complaint (name);
xfree (name);
}
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->static_psymbols,
sh.value,
psymtab_language, objfile);
@@ -3248,10 +3226,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
function_outside_compilation_unit_complaint (name);
xfree (name);
}
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->global_psymbols,
sh.value,
psymtab_language, objfile);
@@ -3323,7 +3300,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
continue;
case N_RBRAC:
- if (sh.value > save_pst->text_high ())
+ if (sh.value > save_pst->raw_text_high ())
save_pst->set_text_high (sh.value);
continue;
case N_EINCL:
@@ -3379,6 +3356,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
char *name;
enum address_class theclass;
CORE_ADDR minsym_value;
+ short section = -1;
(*swap_sym_in) (cur_bfd,
((char *) debug_info->external_sym
@@ -3413,21 +3391,18 @@ parse_partial_symbols (minimal_symbol_reader &reader,
/* The value of a stEnd symbol is the displacement from the
corresponding start symbol value, do not relocate it. */
if (sh.st != stEnd)
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
+ section = SECT_OFF_TEXT (objfile);
break;
case scData:
case scSData:
case scRData:
case scPData:
case scXData:
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
+ section = SECT_OFF_DATA (objfile);
break;
case scBss:
case scSBss:
- sh.value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
+ section = SECT_OFF_BSS (objfile);
break;
}
@@ -3491,11 +3466,13 @@ parse_partial_symbols (minimal_symbol_reader &reader,
if (sh.st == stProc)
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, LOC_BLOCK,
+ section,
&objfile->global_psymbols,
sh.value, psymtab_language, objfile);
else
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, LOC_BLOCK,
+ section,
&objfile->static_psymbols,
sh.value, psymtab_language, objfile);
@@ -3513,11 +3490,11 @@ parse_partial_symbols (minimal_symbol_reader &reader,
/* Kludge for Irix 5.2 zero fh->adr. */
if (!relocatable
&& (!pst->text_low_valid
- || procaddr < pst->text_low ()))
+ || procaddr < pst->raw_text_low ()))
pst->set_text_low (procaddr);
high = procaddr + sh.value;
- if (high > pst->text_high ())
+ if (high > pst->raw_text_high ())
pst->set_text_high (high);
continue;
@@ -3561,7 +3538,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
&& sh.index != cur_sdx + 2)
{
add_psymbol_to_list (name, strlen (name), 1,
- STRUCT_DOMAIN, LOC_TYPEDEF,
+ STRUCT_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
}
@@ -3600,7 +3577,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
}
/* Use this gdb symbol. */
add_psymbol_to_list (name, strlen (name), 1,
- VAR_DOMAIN, theclass,
+ VAR_DOMAIN, theclass, section,
&objfile->static_psymbols,
sh.value, psymtab_language, objfile);
skip:
@@ -3618,6 +3595,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
SYMR *psh;
char *name;
CORE_ADDR svalue;
+ short section;
if (ext_ptr->ifd != f_idx)
internal_error (__FILE__, __LINE__,
@@ -3631,23 +3609,21 @@ parse_partial_symbols (minimal_symbol_reader &reader,
svalue = psh->value;
switch (psh->sc)
{
+ default:
case scText:
case scRConst:
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
+ section = SECT_OFF_TEXT (objfile);
break;
case scData:
case scSData:
case scRData:
case scPData:
case scXData:
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
+ section = SECT_OFF_DATA (objfile);
break;
case scBss:
case scSBss:
- svalue += ANOFFSET (objfile->section_offsets,
- SECT_OFF_BSS (objfile));
+ section = SECT_OFF_BSS (objfile);
break;
}
@@ -3682,6 +3658,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
name = debug_info->ssext + psh->iss;
add_psymbol_to_list (name, strlen (name), 1,
VAR_DOMAIN, theclass,
+ section,
&objfile->global_psymbols,
svalue, psymtab_language, objfile);
}
@@ -3692,7 +3669,7 @@ parse_partial_symbols (minimal_symbol_reader &reader,
fdr_to_pst[f_idx].pst
= dbx_end_psymtab (objfile, save_pst,
psymtab_include_list, includes_used,
- -1, save_pst->text_high (),
+ -1, save_pst->raw_text_high (),
dependency_list, dependencies_used,
textlow_not_set);
includes_used = 0;
@@ -3717,9 +3694,9 @@ parse_partial_symbols (minimal_symbol_reader &reader,
ALL_OBJFILE_PSYMTABS (objfile, pst)
{
if (save_pst != pst
- && save_pst->text_low () >= pst->text_low ()
- && save_pst->text_low () < pst->text_high ()
- && save_pst->text_high () > pst->text_high ())
+ && save_pst->raw_text_low () >= pst->raw_text_low ()
+ && save_pst->raw_text_low () < pst->raw_text_high ()
+ && save_pst->raw_text_high () > pst->raw_text_high ())
{
objfile->flags |= OBJF_REORDERED;
break;
@@ -3842,9 +3819,9 @@ handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
/* Note that the value doesn't matter for enum constants
in psymtabs, just in symtabs. */
add_psymbol_to_list (name, strlen (name), 1,
- VAR_DOMAIN, LOC_CONST,
- &objfile->static_psymbols,
- 0, psymtab_language, objfile);
+ VAR_DOMAIN, LOC_CONST, -1,
+ &objfile->static_psymbols, 0,
+ psymtab_language, objfile);
ext_sym += external_sym_size;
}
}
@@ -4071,7 +4048,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
if (! last_symtab_ended)
{
- cust = end_symtab (pst->text_high (), SECT_OFF_TEXT (objfile));
+ cust = end_symtab (pst->raw_text_high (), SECT_OFF_TEXT (objfile));
end_stabs ();
}
@@ -4147,7 +4124,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
top_stack->cur_st = COMPUNIT_FILETABS (cust);
top_stack->cur_block
= BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), STATIC_BLOCK);
- BLOCK_START (top_stack->cur_block) = pst->text_low ();
+ BLOCK_START (top_stack->cur_block) = pst->text_low (objfile);
BLOCK_END (top_stack->cur_block) = 0;
top_stack->blocktype = stFile;
top_stack->cur_type = 0;
@@ -4208,7 +4185,7 @@ psymtab_to_symtab_1 (struct objfile *objfile,
}
parse_lines (fh, pr_block.data (), lines, maxlines,
- pst, lowest_pdr_addr);
+ pst->text_low (objfile), lowest_pdr_addr);
if (lines->nitems < fh->cline)
lines = shrink_linetable (lines);
diff --git a/gdb/objfiles.c b/gdb/objfiles.c
index 95c39cf..df28da5 100644
--- a/gdb/objfiles.c
+++ b/gdb/objfiles.c
@@ -841,6 +841,10 @@ objfile_relocate1 (struct objfile *objfile,
}
}
+ /* This stores relocated addresses and so must be cleared. This
+ will cause it to be recreated on demand. */
+ objfile->psymbol_map.clear ();
+
/* Relocate isolated symbols. */
{
struct symbol *iter;
@@ -849,13 +853,6 @@ objfile_relocate1 (struct objfile *objfile,
relocate_one_symbol (iter, objfile, delta);
}
- if (objfile->psymtabs_addrmap)
- addrmap_relocate (objfile->psymtabs_addrmap,
- ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
-
- if (objfile->sf)
- objfile->sf->qf->relocate (objfile, new_offsets, delta);
-
{
int i;
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index b3bda82..f8eade7 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -54,12 +54,12 @@ struct partial_symbol : public general_symbol_info
the offsets provided in OBJFILE. */
CORE_ADDR address (const struct objfile *objfile) const
{
- return value.address;
+ return value.address + ANOFFSET (objfile->section_offsets, section);
}
/* Set the address of this partial symbol. The address must be
unrelocated. */
- void set_address (CORE_ADDR addr)
+ void set_unrelocated_address (CORE_ADDR addr)
{
value.address = addr;
}
@@ -98,18 +98,32 @@ enum psymtab_search_status
struct partial_symtab
{
- /* Return the low text address of this partial_symtab. */
- CORE_ADDR text_low () const
+ /* Return the raw low text address of this partial_symtab. */
+ CORE_ADDR raw_text_low () const
{
return m_text_low;
}
- /* Return the high text address of this partial_symtab. */
- CORE_ADDR text_high () const
+ /* Return the raw high text address of this partial_symtab. */
+ CORE_ADDR raw_text_high () const
{
return m_text_high;
}
+ /* Return the relocated low text address of this partial_symtab. */
+ CORE_ADDR text_low (struct objfile *objfile) const
+ {
+ return m_text_low + ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile));
+ }
+
+ /* Return the relocated high text address of this partial_symtab. */
+ CORE_ADDR text_high (struct objfile *objfile) const
+ {
+ return m_text_high + ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile));
+ }
+
/* Set the low text address of this partial_symtab. */
void set_text_low (CORE_ADDR addr)
{
@@ -262,6 +276,7 @@ struct partial_symtab
extern void add_psymbol_to_list (const char *, int,
int, domain_enum,
enum address_class,
+ short /* section */,
std::vector<partial_symbol *> *,
CORE_ADDR,
enum language, struct objfile *);
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 549628c..dc35ca8 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -62,9 +62,6 @@ static struct partial_symbol *find_pc_sect_psymbol (struct objfile *,
CORE_ADDR,
struct obj_section *);
-static void fixup_psymbol_section (struct partial_symbol *psym,
- struct objfile *objfile);
-
static struct compunit_symtab *psymtab_to_symtab (struct objfile *objfile,
struct partial_symtab *pst);
@@ -232,7 +229,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
{
struct partial_symtab *tpst;
struct partial_symtab *best_pst = pst;
- CORE_ADDR best_addr = pst->text_low ();
+ CORE_ADDR best_addr = pst->text_low (objfile);
gdb_assert (!pst->psymtabs_addrmap_supported);
@@ -256,7 +253,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
that is closest and still less than the given PC. */
for (tpst = pst; tpst != NULL; tpst = tpst->next)
{
- if (pc >= tpst->text_low () && pc < tpst->text_high ())
+ if (pc >= tpst->text_low (objfile) && pc < tpst->text_high (objfile))
{
struct partial_symbol *p;
CORE_ADDR this_addr;
@@ -277,7 +274,7 @@ find_pc_sect_psymtab_closer (struct objfile *objfile,
if (p != NULL)
this_addr = p->address (objfile);
else
- this_addr = tpst->text_low ();
+ this_addr = tpst->text_low (objfile);
/* Check whether it is closer than our current
BEST_ADDR. Since this symbol address is
@@ -310,6 +307,8 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
struct bound_minimal_symbol msymbol)
{
struct partial_symtab *pst;
+ CORE_ADDR baseaddr = ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile));
/* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
than the later used TEXTLOW/TEXTHIGH one. */
@@ -317,7 +316,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
if (objfile->psymtabs_addrmap != NULL)
{
pst = ((struct partial_symtab *)
- addrmap_find (objfile->psymtabs_addrmap, pc));
+ addrmap_find (objfile->psymtabs_addrmap, pc - baseaddr));
if (pst != NULL)
{
/* FIXME: addrmaps currently do not handle overlayed sections,
@@ -361,7 +360,7 @@ find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, pst)
if (!pst->psymtabs_addrmap_supported
- && pc >= pst->text_low () && pc < pst->text_high ())
+ && pc >= pst->text_low (objfile) && pc < pst->text_high (objfile))
{
struct partial_symtab *best_pst;
@@ -411,12 +410,12 @@ find_pc_sect_psymbol (struct objfile *objfile,
{
struct partial_symbol *best = NULL;
CORE_ADDR best_pc;
+ const CORE_ADDR textlow = psymtab->text_low (objfile);
gdb_assert (psymtab != NULL);
/* Cope with programs that start at address 0. */
- best_pc = ((psymtab->text_low () != 0)
- ? psymtab->text_low () - 1 : 0);
+ best_pc = (textlow != 0) ? textlow - 1 : 0;
/* Search the global symbols as well as the static symbols, so that
find_pc_partial_function doesn't use a minimal symbol and thus
@@ -429,12 +428,11 @@ find_pc_sect_psymbol (struct objfile *objfile,
&& p->aclass == LOC_BLOCK
&& pc >= p->address (objfile)
&& (p->address (objfile) > best_pc
- || (psymtab->text_low () == 0
+ || (psymtab->text_low (objfile) == 0
&& best_pc == 0 && p->address (objfile) == 0)))
{
if (section != NULL) /* Match on a specific section. */
{
- fixup_psymbol_section (p, objfile);
if (!matching_obj_sections (p->obj_section (objfile),
section))
continue;
@@ -452,12 +450,11 @@ find_pc_sect_psymbol (struct objfile *objfile,
&& p->aclass == LOC_BLOCK
&& pc >= p->address (objfile)
&& (p->address (objfile) > best_pc
- || (psymtab->text_low () == 0
+ || (psymtab->text_low (objfile) == 0
&& best_pc == 0 && p->address (objfile) == 0)))
{
if (section != NULL) /* Match on a specific section. */
{
- fixup_psymbol_section (p, objfile);
if (!matching_obj_sections (p->obj_section (objfile),
section))
continue;
@@ -470,35 +467,6 @@ find_pc_sect_psymbol (struct objfile *objfile,
return best;
}
-static void
-fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
-{
- CORE_ADDR addr;
-
- if (psym == NULL)
- return;
-
- if (psym->section >= 0)
- return;
-
- gdb_assert (objfile);
-
- switch (psym->aclass)
- {
- case LOC_STATIC:
- case LOC_LABEL:
- case LOC_BLOCK:
- addr = psym->address (objfile);
- break;
- default:
- /* Nothing else will be listed in the minsyms -- no use looking
- it up. */
- return;
- }
-
- fixup_section (psym, addr, objfile);
-}
-
/* Psymtab version of lookup_symbol. See its definition in
the definition of quick_symbol_functions in symfile.h. */
@@ -795,42 +763,6 @@ psymtab_to_symtab (struct objfile *objfile, struct partial_symtab *pst)
return pst->compunit_symtab;
}
-/* Psymtab version of relocate. See its definition in
- the definition of quick_symbol_functions in symfile.h. */
-
-static void
-psym_relocate (struct objfile *objfile,
- const struct section_offsets *new_offsets,
- const struct section_offsets *delta)
-{
- struct partial_symtab *p;
-
- ALL_OBJFILE_PSYMTABS_REQUIRED (objfile, p)
- {
- p->set_text_low (p->text_low ()
- + ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
- p->set_text_high (p->text_high ()
- + ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
- }
-
- for (partial_symbol *psym : objfile->global_psymbols)
- {
- fixup_psymbol_section (psym, objfile);
- if (psym->section >= 0)
- psym->set_address (psym->unrelocated_address ()
- + ANOFFSET (delta, psym->section));
- }
- for (partial_symbol *psym : objfile->static_psymbols)
- {
- fixup_psymbol_section (psym, objfile);
- if (psym->section >= 0)
- psym->set_address (psym->unrelocated_address ()
- + ANOFFSET (delta, psym->section));
- }
-
- objfile->psymbol_map.clear ();
-}
-
/* Psymtab version of find_last_source_symtab. See its definition in
the definition of quick_symbol_functions in symfile.h. */
@@ -1015,9 +947,9 @@ dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
}
fprintf_filtered (outfile, " Symbols cover text addresses ");
- fputs_filtered (paddress (gdbarch, psymtab->text_low ()), outfile);
+ fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)), outfile);
fprintf_filtered (outfile, "-");
- fputs_filtered (paddress (gdbarch, psymtab->text_high ()), outfile);
+ fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)), outfile);
fprintf_filtered (outfile, "\n");
fprintf_filtered (outfile, " Address map supported - %s.\n",
psymtab->psymtabs_addrmap_supported ? "yes" : "no");
@@ -1551,7 +1483,6 @@ const struct quick_symbol_functions psym_functions =
psym_lookup_symbol,
psym_print_stats,
psym_dump,
- psym_relocate,
psym_expand_symtabs_for_function,
psym_expand_all_symtabs,
psym_expand_symtabs_with_fullname,
@@ -1598,7 +1529,7 @@ start_psymtab_common (struct objfile *objfile,
psymtab = allocate_psymtab (filename, objfile);
psymtab->set_text_low (textlow);
- psymtab->set_text_high (psymtab->text_low ()); /* default */
+ psymtab->set_text_high (psymtab->raw_text_low ()); /* default */
psymtab->globals_offset = global_psymbols.size ();
psymtab->statics_offset = static_psymbols.size ();
return psymtab;
@@ -1718,14 +1649,15 @@ static struct partial_symbol *
add_psymbol_to_bcache (const char *name, int namelength, int copy_name,
domain_enum domain,
enum address_class theclass,
+ short section,
CORE_ADDR coreaddr,
enum language language, struct objfile *objfile,
int *added)
{
struct partial_symbol psymbol;
- psymbol.set_address (coreaddr);
- psymbol.section = -1;
+ psymbol.set_unrelocated_address (coreaddr);
+ psymbol.section = section;
psymbol.domain = domain;
psymbol.aclass = theclass;
@@ -1759,6 +1691,7 @@ void
add_psymbol_to_list (const char *name, int namelength, int copy_name,
domain_enum domain,
enum address_class theclass,
+ short section,
std::vector<partial_symbol *> *list,
CORE_ADDR coreaddr,
enum language language, struct objfile *objfile)
@@ -1769,7 +1702,7 @@ add_psymbol_to_list (const char *name, int namelength, int copy_name,
/* Stash the partial symbol away in the cache. */
psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, theclass,
- coreaddr, language, objfile, &added);
+ section, coreaddr, language, objfile, &added);
/* Do not duplicate global partial symbols. */
if (list == &objfile->global_psymbols
@@ -2150,10 +2083,10 @@ maintenance_info_psymtabs (const char *regexp, int from_tty)
psymtab->fullname
? psymtab->fullname : "(null)");
printf_filtered (" text addresses ");
- fputs_filtered (paddress (gdbarch, psymtab->text_low ()),
+ fputs_filtered (paddress (gdbarch, psymtab->text_low (objfile)),
gdb_stdout);
printf_filtered (" -- ");
- fputs_filtered (paddress (gdbarch, psymtab->text_high ()),
+ fputs_filtered (paddress (gdbarch, psymtab->text_high (objfile)),
gdb_stdout);
printf_filtered ("\n");
printf_filtered (" psymtabs_addrmap_supported %s\n",
@@ -2233,14 +2166,16 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
cust = ps->compunit_symtab;
/* First do some checks that don't require the associated symtab. */
- if (ps->text_high () < ps->text_low ())
+ if (ps->text_high (objfile) < ps->text_low (objfile))
{
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers bad range ");
- fputs_filtered (paddress (gdbarch, ps->text_low ()), gdb_stdout);
+ fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
+ gdb_stdout);
printf_filtered (" - ");
- fputs_filtered (paddress (gdbarch, ps->text_high ()), gdb_stdout);
+ fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
+ gdb_stdout);
printf_filtered ("\n");
continue;
}
@@ -2285,16 +2220,18 @@ maintenance_check_psymtabs (const char *ignore, int from_tty)
}
psym++;
}
- if (ps->text_high () != 0
- && (ps->text_low () < BLOCK_START (b)
- || ps->text_high () > BLOCK_END (b)))
+ if (ps->raw_text_high () != 0
+ && (ps->text_low (objfile) < BLOCK_START (b)
+ || ps->text_high (objfile) > BLOCK_END (b)))
{
printf_filtered ("Psymtab ");
puts_filtered (ps->filename);
printf_filtered (" covers ");
- fputs_filtered (paddress (gdbarch, ps->text_low ()), gdb_stdout);
+ fputs_filtered (paddress (gdbarch, ps->text_low (objfile)),
+ gdb_stdout);
printf_filtered (" - ");
- fputs_filtered (paddress (gdbarch, ps->text_high ()), gdb_stdout);
+ fputs_filtered (paddress (gdbarch, ps->text_high (objfile)),
+ gdb_stdout);
printf_filtered (" but symtab covers only ");
fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
printf_filtered (" - ");
diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c
index 9d8007d..3aab173 100644
--- a/gdb/symfile-debug.c
+++ b/gdb/symfile-debug.c
@@ -194,23 +194,6 @@ debug_qf_dump (struct objfile *objfile)
}
static void
-debug_qf_relocate (struct objfile *objfile,
- const struct section_offsets *new_offsets,
- const struct section_offsets *delta)
-{
- const struct debug_sym_fns_data *debug_data
- = ((const struct debug_sym_fns_data *)
- objfile_data (objfile, symfile_debug_objfile_data_key));
-
- fprintf_filtered (gdb_stdlog, "qf->relocate (%s, %s, %s)\n",
- objfile_debug_name (objfile),
- host_address_to_string (new_offsets),
- host_address_to_string (delta));
-
- debug_data->real_sf->qf->relocate (objfile, new_offsets, delta);
-}
-
-static void
debug_qf_expand_symtabs_for_function (struct objfile *objfile,
const char *func_name)
{
@@ -401,7 +384,6 @@ static const struct quick_symbol_functions debug_sym_quick_functions =
debug_qf_lookup_symbol,
debug_qf_print_stats,
debug_qf_dump,
- debug_qf_relocate,
debug_qf_expand_symtabs_for_function,
debug_qf_expand_all_symtabs,
debug_qf_expand_symtabs_with_fullname,
diff --git a/gdb/symfile.h b/gdb/symfile.h
index 79c7687..5b8b781 100644
--- a/gdb/symfile.h
+++ b/gdb/symfile.h
@@ -191,12 +191,6 @@ struct quick_symbol_functions
gdb_stdout. This is used for "maint print objfiles". */
void (*dump) (struct objfile *objfile);
- /* This is called by objfile_relocate to relocate any indices loaded
- for OBJFILE. */
- void (*relocate) (struct objfile *objfile,
- const struct section_offsets *new_offsets,
- const struct section_offsets *delta);
-
/* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
the corresponding symbol tables are loaded. */
void (*expand_symtabs_for_function) (struct objfile *objfile,
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 7ca4b3e..a858ffe 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2342,10 +2342,10 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
CORE_ADDR highval =
symbol.n_value + csect_aux.x_csect.x_scnlen.l;
- if (highval > pst->text_high ())
+ if (highval > pst->raw_text_high ())
pst->set_text_high (highval);
if (!pst->text_low_valid
- || symbol.n_value < pst->text_low ())
+ || symbol.n_value < pst->raw_text_low ())
pst->set_text_low (symbol.n_value);
}
misc_func_recorded = 0;
@@ -2659,27 +2659,24 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
switch (p[1])
{
case 'S':
- symbol.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
-
if (gdbarch_static_transform_name_p (gdbarch))
namestring = gdbarch_static_transform_name
(gdbarch, namestring);
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
+ SECT_OFF_DATA (objfile),
&objfile->static_psymbols,
symbol.n_value,
psymtab_language, objfile);
continue;
case 'G':
- symbol.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_DATA (objfile));
/* The addresses in these entries are reported to be
wrong. See the code that reads 'G's for symtabs. */
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_STATIC,
+ SECT_OFF_DATA (objfile),
&objfile->global_psymbols,
symbol.n_value,
psymtab_language, objfile);
@@ -2697,14 +2694,14 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
&& namestring[0] != ' '))
{
add_psymbol_to_list (namestring, p - namestring, 1,
- STRUCT_DOMAIN, LOC_TYPEDEF,
+ STRUCT_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
if (p[2] == 't')
{
/* Also a typedef with the same name. */
add_psymbol_to_list (namestring, p - namestring, 1,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
p += 1;
@@ -2716,7 +2713,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
if (p != namestring) /* a name is there, not just :T... */
{
add_psymbol_to_list (namestring, p - namestring, 1,
- VAR_DOMAIN, LOC_TYPEDEF,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
}
@@ -2778,7 +2775,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
/* Note that the value doesn't matter for
enum constants in psymtabs, just in symtabs. */
add_psymbol_to_list (p, q - p, 1,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
/* Point past the name. */
@@ -2796,7 +2793,7 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (namestring, p - namestring, 1,
- VAR_DOMAIN, LOC_CONST,
+ VAR_DOMAIN, LOC_CONST, -1,
&objfile->static_psymbols,
0, psymtab_language, objfile);
continue;
@@ -2812,10 +2809,9 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
function_outside_compilation_unit_complaint (name);
xfree (name);
}
- symbol.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->static_psymbols,
symbol.n_value,
psymtab_language, objfile);
@@ -2843,10 +2839,9 @@ scan_xcoff_symtab (minimal_symbol_reader &reader,
if (startswith (namestring, "@FIX"))
continue;
- symbol.n_value += ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
add_psymbol_to_list (namestring, p - namestring, 1,
VAR_DOMAIN, LOC_BLOCK,
+ SECT_OFF_TEXT (objfile),
&objfile->global_psymbols,
symbol.n_value,
psymtab_language, objfile);