functions and pc values.
Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
- 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
- Foundation, Inc.
+ 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ Free Software Foundation, Inc.
This file is part of GDB.
A PC of zero is always considered to be the bottom of the stack. */
int
-inside_entry_file (CORE_ADDR addr)
+deprecated_inside_entry_file (CORE_ADDR addr)
{
if (addr == 0)
return 1;
if (symfile_objfile == 0)
return 0;
- if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
+ if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT
+ || CALL_DUMMY_LOCATION == AT_SYMBOL)
{
/* Do not stop backtracing if the pc is in the call dummy
at the entry point. */
if (DEPRECATED_PC_IN_CALL_DUMMY (addr, 0, 0))
return 0;
}
- return (addr >= symfile_objfile->ei.entry_file_lowpc &&
- addr < symfile_objfile->ei.entry_file_highpc);
+ return (addr >= symfile_objfile->ei.deprecated_entry_file_lowpc &&
+ addr < symfile_objfile->ei.deprecated_entry_file_highpc);
}
-/* Test a specified PC value to see if it is in the range of addresses
- that correspond to the main() function. See comments above for why
- we might want to do this.
-
- Typically called from DEPRECATED_FRAME_CHAIN_VALID.
-
- A PC of zero is always considered to be the bottom of the stack. */
+/* Test whether PC is in the range of addresses that corresponds to
+ the "main" function. */
int
inside_main_func (CORE_ADDR pc)
{
- if (pc == 0)
- return 1;
+ struct minimal_symbol *msymbol;
+
if (symfile_objfile == 0)
return 0;
- /* If the addr range is not set up at symbol reading time, set it up
- now. This is for DEPRECATED_FRAME_CHAIN_VALID_ALTERNATE. I do
- this for coff, because it is unable to set it up and symbol
- reading time. */
+ msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
- if (symfile_objfile->ei.main_func_lowpc == INVALID_ENTRY_LOWPC &&
- symfile_objfile->ei.main_func_highpc == INVALID_ENTRY_HIGHPC)
+ /* 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)
{
- struct symbol *mainsym;
+ /* 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));
- mainsym = lookup_symbol (main_name (), NULL, VAR_DOMAIN, NULL, NULL);
if (mainsym && SYMBOL_CLASS (mainsym) == LOC_BLOCK)
{
symfile_objfile->ei.main_func_lowpc =
/* Not in the normal symbol tables, see if "main" is in the partial
symbol table. If it's not, then give up. */
- {
- struct minimal_symbol *msymbol
- = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
- if (msymbol != NULL && MSYMBOL_TYPE (msymbol) == mst_text)
- {
- struct obj_section *osect
- = find_pc_sect_section (SYMBOL_VALUE_ADDRESS (msymbol),
- msymbol->ginfo.bfd_section);
- 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) != SYMBOL_VALUE_ADDRESS (msymbol)
- && SYMBOL_BFD_SECTION (msymbol + i) == SYMBOL_BFD_SECTION (msymbol))
- break;
- }
-
- symfile_objfile->ei.main_func_lowpc = SYMBOL_VALUE_ADDRESS (msymbol);
-
- /* 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);
-}
+ 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);
-/* Test a specified PC value to see if it is in the range of addresses
- that correspond to the process entry point function. See comments
- in objfiles.h for why we might want to do this.
+ if (osect != NULL)
+ {
+ int i;
- Typically called from DEPRECATED_FRAME_CHAIN_VALID.
+ /* 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;
+ }
- A PC of zero is always considered to be the bottom of the stack. */
+ 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 PC is inside the range of addresses that corresponds
+ to the process entry point function. */
int
inside_entry_func (CORE_ADDR pc)
{
- if (pc == 0)
- return 1;
if (symfile_objfile == 0)
return 0;
+
if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
{
- /* Do not stop backtracing if the pc is in the call dummy
- at the entry point. */
- /* FIXME: Won't always work with zeros for the last two arguments */
+ /* Do not stop backtracing if the program counter is in the call
+ dummy at the entry point. */
+ /* FIXME: This won't always work with zeros for the last two
+ arguments. */
if (DEPRECATED_PC_IN_CALL_DUMMY (pc, 0, 0))
return 0;
}
- return (symfile_objfile->ei.entry_func_lowpc <= pc &&
- symfile_objfile->ei.entry_func_highpc > pc);
+
+ return (symfile_objfile->ei.entry_func_lowpc <= pc
+ && symfile_objfile->ei.entry_func_highpc > pc);
}
/* Return nonzero if the function for this frame lacks a prologue. Many
struct symbol *
get_frame_function (struct frame_info *frame)
{
- register struct block *bl = get_frame_block (frame, 0);
+ struct block *bl = get_frame_block (frame, 0);
if (bl == 0)
return 0;
return block_function (bl);
Returns 0 if function is not known. */
struct symbol *
-find_pc_sect_function (CORE_ADDR pc, struct sec *section)
+find_pc_sect_function (CORE_ADDR pc, struct bfd_section *section)
{
- register struct block *b = block_for_pc_sect (pc, section);
+ struct block *b = block_for_pc_sect (pc, section);
if (b == 0)
return 0;
return block_function (b);
static CORE_ADDR cache_pc_function_low = 0;
static CORE_ADDR cache_pc_function_high = 0;
static char *cache_pc_function_name = 0;
-static struct sec *cache_pc_function_section = NULL;
+static struct bfd_section *cache_pc_function_section = NULL;
/* Clear cache, e.g. when symbol table is discarded. */
block_innermost_frame (struct block *block)
{
struct frame_info *frame;
- register CORE_ADDR start;
- register CORE_ADDR end;
+ CORE_ADDR start;
+ CORE_ADDR end;
CORE_ADDR calling_pc;
if (block == NULL)
deprecated_pc_in_call_dummy_at_entry_point (CORE_ADDR pc, CORE_ADDR sp,
CORE_ADDR frame_address)
{
- return ((pc) >= CALL_DUMMY_ADDRESS ()
- && (pc) <= (CALL_DUMMY_ADDRESS () + DECR_PC_AFTER_BREAK));
+ CORE_ADDR addr = entry_point_address ();
+ if (DEPRECATED_CALL_DUMMY_ADDRESS_P ())
+ addr = DEPRECATED_CALL_DUMMY_ADDRESS ();
+ return ((pc) >= addr && (pc) <= (addr + DECR_PC_AFTER_BREAK));
}
/* Returns true for a user frame or a call_function_by_hand dummy
/* NOTE/drow 2002-12-25: should there be a way to disable this check? It
assumes a single small entry file, and the way some debug readers (e.g.
dbxread) figure out which object is the entry file is somewhat hokey. */
- if (inside_entry_file (frame_pc_unwind (fi)))
+ if (deprecated_inside_entry_file (frame_pc_unwind (fi)))
return 0;
return 1;