From c8cd9f6c4cdd895e65e4feb4b2402a2dfdbc3822 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Wed, 1 Sep 2004 14:13:33 +0000 Subject: [PATCH] 2004-08-31 Andrew Cagney * 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. --- gdb/ChangeLog | 9 ++++++ gdb/Makefile.in | 2 +- gdb/blockframe.c | 84 ------------------------------------------------ gdb/defs.h | 2 -- gdb/frame.c | 36 +++++++++++++++------ 5 files changed, 37 insertions(+), 96 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 45c3cc1a9fe..22ab390991d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2004-09-01 Andrew Cagney + + * 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 * dwarf2read.c (is_vtable_name): New function, based on logic from diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 9aa6ff3f756..d2d7348600a 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -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) \ diff --git a/gdb/blockframe.c b/gdb/blockframe.c index 7d9618fc59f..d752c8dd27f 100644 --- a/gdb/blockframe.c +++ b/gdb/blockframe.c @@ -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 diff --git a/gdb/defs.h b/gdb/defs.h index 69d96856158..7474b3da3d8 100644 --- a/gdb/defs.h +++ b/gdb/defs.h @@ -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); diff --git a/gdb/frame.c b/gdb/frame.c index a723b32111e..0d0e2c9094d 100644 --- a/gdb/frame.c +++ b/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; -- 2.30.2