/* Read dbx symbol tables and convert to internal format, for GDB.
- Copyright (C) 1986-2018 Free Software Foundation, Inc.
+ Copyright (C) 1986-2019 Free Software Foundation, Inc.
This file is part of GDB.
static void add_this_object_header_file (int);
static struct partial_symtab *start_psymtab (struct objfile *, const char *,
- CORE_ADDR, int,
- std::vector<partial_symbol *> &,
- std::vector<partial_symbol *> &);
+ CORE_ADDR, int);
/* Free up old header file tables. */
perror_with_name (objfile_name (objfile));
/* Size the symbol table. */
- if (objfile->global_psymbols.capacity () == 0
- && objfile->static_psymbols.capacity () == 0)
- init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
+ init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
symbol_size = DBX_SYMBOL_SIZE (objfile);
symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
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;
msym = lookup_minimal_symbol (p, NULL, objfile);
}
- return msym.minsym == NULL ? 0 : BMSYMBOL_VALUE_ADDRESS (msym);
+ return msym;
}
static void
|| (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;
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;
{
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;
{
pst = start_psymtab (objfile,
namestring, valu,
- first_so_symnum * symbol_size,
- objfile->global_psymbols,
- objfile->static_psymbols);
+ first_so_symnum * symbol_size);
pst->dirname = dirname_nso;
dirname_nso = NULL;
}
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;
}
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,
- &objfile->static_psymbols,
+ data_sect_index,
+ psymbol_placement::STATIC,
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,
- &objfile->global_psymbols,
+ data_sect_index,
+ psymbol_placement::GLOBAL,
nlist.n_value, psymtab_language, objfile);
continue;
&& namestring[0] != ' '))
{
add_psymbol_to_list (sym_name, sym_len, 1,
- STRUCT_DOMAIN, LOC_TYPEDEF,
- &objfile->static_psymbols,
+ STRUCT_DOMAIN, LOC_TYPEDEF, -1,
+ psymbol_placement::STATIC,
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,
- &objfile->static_psymbols,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
+ psymbol_placement::STATIC,
0, psymtab_language, objfile);
p += 1;
}
if (p != namestring) /* a name is there, not just :T... */
{
add_psymbol_to_list (sym_name, sym_len, 1,
- VAR_DOMAIN, LOC_TYPEDEF,
- &objfile->static_psymbols,
+ VAR_DOMAIN, LOC_TYPEDEF, -1,
+ psymbol_placement::STATIC,
0, psymtab_language, objfile);
}
check_enum:
/* 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,
- &objfile->static_psymbols, 0,
+ VAR_DOMAIN, LOC_CONST, -1,
+ psymbol_placement::STATIC, 0,
psymtab_language, objfile);
/* Point past the name. */
p = q;
case 'c':
/* Constant, e.g. from "const" in Pascal. */
add_psymbol_to_list (sym_name, sym_len, 1,
- VAR_DOMAIN, LOC_CONST,
- &objfile->static_psymbols, 0,
+ VAR_DOMAIN, LOC_CONST, -1,
+ psymbol_placement::STATIC, 0,
psymtab_language, objfile);
continue;
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))
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,
- &objfile->static_psymbols,
+ SECT_OFF_TEXT (objfile),
+ psymbol_placement::STATIC,
nlist.n_value, psymtab_language, objfile);
continue;
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))
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,
- &objfile->global_psymbols,
+ SECT_OFF_TEXT (objfile),
+ psymbol_placement::GLOBAL,
nlist.n_value, psymtab_language, objfile);
continue;
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);
}
}
static struct partial_symtab *
start_psymtab (struct objfile *objfile, const char *filename, CORE_ADDR textlow,
- int ldsymoff, std::vector<partial_symbol *> &global_psymbols,
- std::vector<partial_symbol *> &static_psymbols)
+ int ldsymoff)
{
struct partial_symtab *result =
- start_psymtab_common (objfile, filename, textlow,
- global_psymbols, static_psymbols);
+ start_psymtab_common (objfile, filename, textlow);
result->read_symtab_private =
XOBNEW (&objfile->objfile_obstack, struct symloc);
}
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;
;
/* 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;
-
/* If we know our own starting text address, then walk through all other
psymtabs for this objfile, and if any didn't know their ending text
address, set it to our starting address. Take care to not set our
own ending address to our starting address. */
- ALL_OBJFILE_PSYMTABS (objfile, p1)
- {
+ for (partial_symtab *p1 : objfile_psymtabs (objfile))
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 ());
}
/* End of kludge for patching Solaris textlow and texthigh. */
subpst->dependencies[0] = pst;
subpst->number_of_dependencies = 1;
- subpst->globals_offset =
- subpst->n_global_syms =
- subpst->statics_offset =
- subpst->n_static_syms = 0;
-
- subpst->readin = 0;
- subpst->compunit_symtab = 0;
subpst->read_symtab = pst->read_symtab;
}
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;
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. */