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:
parent
0df3d27f98
commit
c8cd9f6c4c
5 changed files with 37 additions and 96 deletions
|
@ -1,3 +1,12 @@
|
|||
2004-09-01 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.
|
||||
|
||||
2004-08-31 Jim Blandy <jimb@redhat.com>
|
||||
|
||||
* dwarf2read.c (is_vtable_name): New function, based on logic from
|
||||
|
|
|
@ -1885,7 +1885,7 @@ frame.o: frame.c $(defs_h) $(frame_h) $(target_h) $(value_h) $(inferior_h) \
|
|||
$(regcache_h) $(gdb_assert_h) $(gdb_string_h) $(user_regs_h) \
|
||||
$(gdb_obstack_h) $(dummy_frame_h) $(sentinel_frame_h) $(gdbcore_h) \
|
||||
$(annotate_h) $(language_h) $(frame_unwind_h) $(frame_base_h) \
|
||||
$(command_h) $(gdbcmd_h) $(observer_h)
|
||||
$(command_h) $(gdbcmd_h) $(observer_h) $(objfiles_h)
|
||||
frame-unwind.o: frame-unwind.c $(defs_h) $(frame_h) $(frame_unwind_h) \
|
||||
$(gdb_assert_h) $(dummy_frame_h) $(gdb_obstack_h)
|
||||
frv-linux-tdep.o: frv-linux-tdep.c $(defs_h) $(target_h) $(frame_h) \
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -340,8 +340,6 @@ struct frame_info;
|
|||
|
||||
extern int inside_entry_func (struct frame_info *this_frame);
|
||||
|
||||
extern int inside_main_func (CORE_ADDR pc);
|
||||
|
||||
/* From utils.c */
|
||||
|
||||
extern void initialize_utils (void);
|
||||
|
|
36
gdb/frame.c
36
gdb/frame.c
|
@ -40,6 +40,7 @@
|
|||
#include "command.h"
|
||||
#include "gdbcmd.h"
|
||||
#include "observer.h"
|
||||
#include "objfiles.h"
|
||||
|
||||
static struct frame_info *get_prev_frame_1 (struct frame_info *this_frame);
|
||||
|
||||
|
@ -1108,6 +1109,27 @@ frame_debug_got_null_frame (struct ui_file *file,
|
|||
}
|
||||
}
|
||||
|
||||
/* Is this (non-sentinel) frame in the "main"() function? */
|
||||
|
||||
static int
|
||||
inside_main_func (struct frame_info *this_frame)
|
||||
{
|
||||
struct minimal_symbol *msymbol;
|
||||
CORE_ADDR maddr;
|
||||
|
||||
if (symfile_objfile == 0)
|
||||
return 0;
|
||||
msymbol = lookup_minimal_symbol (main_name (), NULL, symfile_objfile);
|
||||
if (msymbol == NULL)
|
||||
return 0;
|
||||
/* Make certain that the code, and not descriptor, address is
|
||||
returned. */
|
||||
maddr = gdbarch_convert_from_func_ptr_addr (current_gdbarch,
|
||||
SYMBOL_VALUE_ADDRESS (msymbol),
|
||||
¤t_target);
|
||||
return maddr == get_frame_func (this_frame);
|
||||
}
|
||||
|
||||
/* Return a structure containing various interesting information about
|
||||
the frame that called THIS_FRAME. Returns NULL if there is entier
|
||||
no such frame or the frame fails any of a set of target-independent
|
||||
|
@ -1163,17 +1185,13 @@ get_prev_frame (struct frame_info *this_frame)
|
|||
get_current_frame(). */
|
||||
gdb_assert (this_frame != NULL);
|
||||
|
||||
/* Make sure we pass an address within THIS_FRAME's code block to
|
||||
inside_main_func(). Otherwise, we might stop unwinding at a
|
||||
function which has a call instruction as its last instruction if
|
||||
that function immediately precedes main(). */
|
||||
if (this_frame->level >= 0
|
||||
&& !backtrace_past_main
|
||||
&& inside_main_func (get_frame_address_in_block (this_frame)))
|
||||
/* Don't unwind past main(), but always unwind the sentinel frame.
|
||||
Note, this is done _before_ the frame has been marked as
|
||||
previously unwound. That way if the user later decides to
|
||||
allow unwinds past main(), that just happens. */
|
||||
&& inside_main_func (this_frame))
|
||||
/* Don't unwind past main(). Note, this is done _before_ the
|
||||
frame has been marked as previously unwound. That way if the
|
||||
user later decides to enable unwinds past main(), that will
|
||||
automatically happen. */
|
||||
{
|
||||
frame_debug_got_null_frame (gdb_stdlog, this_frame, "inside main func");
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in a new issue