2004-08-31 Andrew Cagney <cagney@gnu.org>

* frame.c: Include "objfiles.h".
	(inside_main_func): New function.
	(get_prev_frame): Use new inside_main_func.
	* Makefile.in (frame.o): Update dependencies.
	* defs.h (inside_main_func): Delete declaration.
	* blockframe.c (inside_main_func): Delete function.
This commit is contained in:
Andrew Cagney
2004-09-01 14:13:33 +00:00
parent 0df3d27f98
commit c8cd9f6c4c
5 changed files with 37 additions and 96 deletions

View File

@@ -43,90 +43,6 @@
void _initialize_blockframe (void);
/* Test whether PC is in the range of addresses that corresponds to
the "main" function. */
int
inside_main_func (CORE_ADDR pc)
{
struct minimal_symbol *msymbol;
if (symfile_objfile == 0)
return 0;
msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
/* If the address range hasn't been set up at symbol reading time,
set it up now. */
if (msymbol != NULL
&& symfile_objfile->ei.main_func_lowpc == INVALID_ENTRY_LOWPC
&& symfile_objfile->ei.main_func_highpc == INVALID_ENTRY_HIGHPC)
{
/* brobecker/2003-10-10: We used to rely on lookup_symbol() to
search the symbol associated to the "main" function.
Unfortunately, lookup_symbol() uses the current-language
la_lookup_symbol_nonlocal function to do the global symbol
search. Depending on the language, this can introduce
certain side-effects, because certain languages, for instance
Ada, may find more than one match. Therefore we prefer to
search the "main" function symbol using its address rather
than its name. */
struct symbol *mainsym =
find_pc_function (SYMBOL_VALUE_ADDRESS (msymbol));
if (mainsym && SYMBOL_CLASS (mainsym) == LOC_BLOCK)
{
symfile_objfile->ei.main_func_lowpc =
BLOCK_START (SYMBOL_BLOCK_VALUE (mainsym));
symfile_objfile->ei.main_func_highpc =
BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym));
}
}
/* Not in the normal symbol tables, see if "main" is in the partial
symbol table. If it's not, then give up. */
if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_text)
{
CORE_ADDR maddr = SYMBOL_VALUE_ADDRESS (msymbol);
asection *msect = SYMBOL_BFD_SECTION (msymbol);
struct obj_section *osect = find_pc_sect_section (maddr, msect);
if (osect != NULL)
{
int i;
/* Step over other symbols at this same address, and symbols
in other sections, to find the next symbol in this
section with a different address. */
for (i = 1; SYMBOL_LINKAGE_NAME (msymbol + i) != NULL; i++)
{
if (SYMBOL_VALUE_ADDRESS (msymbol + i) != maddr
&& SYMBOL_BFD_SECTION (msymbol + i) == msect)
break;
}
symfile_objfile->ei.main_func_lowpc = maddr;
/* Use the lesser of the next minimal symbol in the same
section, or the end of the section, as the end of the
function. */
if (SYMBOL_LINKAGE_NAME (msymbol + i) != NULL
&& SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr)
symfile_objfile->ei.main_func_highpc =
SYMBOL_VALUE_ADDRESS (msymbol + i);
else
/* We got the start address from the last msymbol in the
objfile. So the end address is the end of the
section. */
symfile_objfile->ei.main_func_highpc = osect->endaddr;
}
}
return (symfile_objfile->ei.main_func_lowpc <= pc
&& symfile_objfile->ei.main_func_highpc > pc);
}
/* Test whether THIS_FRAME is inside the process entry point function. */
int