From 0714963c79d71c6a88e14cfb855043566ec149bf Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Tue, 15 Jul 2003 17:23:32 +0000 Subject: [PATCH] 2003-07-15 Andrew Cagney * frame.c (get_prev_frame): Move disabled inside_entry_func to before code inhibiting repeated unwind attempts. Add to commentary on that test's problems. * blockframe.c (inside_main_func): Look for "main" in the minimal symbol table. * d10v-tdep.c (d10v_frame_this_id): Delete check that frames are identical. Index: testsuite/ChangeLog 2003-07-15 Andrew Cagney * gdb.asm/asm-source.exp: Do not allow "start" in the backtrace. --- gdb/ChangeLog | 10 +++++ gdb/blockframe.c | 41 ++++++++++++++++++++ gdb/d10v-tdep.c | 9 ----- gdb/frame.c | 58 ++++++++++++++++++---------- gdb/testsuite/ChangeLog | 4 ++ gdb/testsuite/gdb.asm/asm-source.exp | 2 +- 6 files changed, 94 insertions(+), 30 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 32921f7616..89730536a8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2003-07-15 Andrew Cagney + + * frame.c (get_prev_frame): Move disabled inside_entry_func to + before code inhibiting repeated unwind attempts. Add to + commentary on that test's problems. + * blockframe.c (inside_main_func): Look for "main" in the minimal + symbol table. + * d10v-tdep.c (d10v_frame_this_id): Delete check that frames are + identical. + 2003-07-15 Andrew Cagney * complaints.c (struct explanation): Define. diff --git a/gdb/blockframe.c b/gdb/blockframe.c index 23ee66c360..9a11c90057 100644 --- a/gdb/blockframe.c +++ b/gdb/blockframe.c @@ -106,6 +106,47 @@ inside_main_func (CORE_ADDR pc) 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. */ + { + 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); } diff --git a/gdb/d10v-tdep.c b/gdb/d10v-tdep.c index 135a0dd401..eafe0ccc9b 100644 --- a/gdb/d10v-tdep.c +++ b/gdb/d10v-tdep.c @@ -1417,15 +1417,6 @@ d10v_frame_this_id (struct frame_info *next_frame, id = frame_id_build (base, func); - /* Check that we're not going round in circles with the same frame - ID (but avoid applying the test to sentinel frames which do go - round in circles). Can't use frame_id_eq() as that doesn't yet - compare the frame's PC value. */ - if (frame_relative_level (next_frame) >= 0 - && get_frame_type (next_frame) != DUMMY_FRAME - && frame_id_eq (get_frame_id (next_frame), id)) - return; - (*this_id) = id; } diff --git a/gdb/frame.c b/gdb/frame.c index 1e364bdcb7..73895e2463 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -1816,6 +1816,44 @@ get_prev_frame (struct frame_info *this_frame) return NULL; } + /* If we're already inside the entry function for the main objfile, + then it isn't valid. Don't apply this test to a dummy frame - + dummy frame PC's typically land in the entry func. Don't apply + this test to the sentinel frame. Sentinel frames should always + be allowed to unwind. */ + /* NOTE: cagney/2003-02-25: Don't enable until someone has found + hard evidence that this is needed. */ + /* NOTE: cagney/2003-07-07: Fixed a bug in inside_main_func - wasn't + checking for "main" in the minimal symbols. With that fixed + asm-source tests now stop in "main" instead of halting the + backtrace in wierd and wonderful ways somewhere inside the entry + file. Suspect that inside_entry_file and inside_entry_func tests + were added to work around that (now fixed) case. */ + /* NOTE: cagney/2003-07-15: danielj (if I'm reading it right) + suggested having the inside_entry_func test use the + inside_main_func msymbol trick (along with entry_point_address I + guess) to determine the address range of the start function. + That should provide a far better stopper than the current + heuristics. */ + /* NOTE: cagney/2003-07-15: Need to add a "set backtrace + beyond-entry-func" command so that this can be selectively + disabled. */ + if (0 +#if 0 + && backtrace_beyond_entry_func +#endif + && this_frame->type != DUMMY_FRAME && this_frame->level >= 0 + && inside_entry_func (get_frame_pc (this_frame))) + { + if (frame_debug) + { + fprintf_unfiltered (gdb_stdlog, "-> "); + fprint_frame (gdb_stdlog, NULL); + fprintf_unfiltered (gdb_stdlog, "// inside entry func }\n"); + } + return NULL; + } + /* Only try to do the unwind once. */ if (this_frame->prev_p) { @@ -1863,26 +1901,6 @@ get_prev_frame (struct frame_info *this_frame) } #endif - /* If we're already inside the entry function for the main objfile, - then it isn't valid. Don't apply this test to a dummy frame - - dummy frame PC's typically land in the entry func. Don't apply - this test to the sentinel frame. Sentinel frames should always - be allowed to unwind. */ - /* NOTE: cagney/2003-02-25: Don't enable until someone has found - hard evidence that this is needed. */ - if (0 - && this_frame->type != DUMMY_FRAME && this_frame->level >= 0 - && inside_entry_func (get_frame_pc (this_frame))) - { - if (frame_debug) - { - fprintf_unfiltered (gdb_stdlog, "-> "); - fprint_frame (gdb_stdlog, NULL); - fprintf_unfiltered (gdb_stdlog, "// inside entry func }\n"); - } - return NULL; - } - /* If any of the old frame initialization methods are around, use the legacy get_prev_frame method. */ if (legacy_frame_p (current_gdbarch)) diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 60d1a6e988..2e123135ee 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-07-15 Andrew Cagney + + * gdb.asm/asm-source.exp: Do not allow "start" in the backtrace. + 2003-07-15 Michael Chastain * gdb.base/gdb1250.exp: New file. diff --git a/gdb/testsuite/gdb.asm/asm-source.exp b/gdb/testsuite/gdb.asm/asm-source.exp index e482dd100d..3745e6062d 100644 --- a/gdb/testsuite/gdb.asm/asm-source.exp +++ b/gdb/testsuite/gdb.asm/asm-source.exp @@ -244,7 +244,7 @@ gdb_test "n" "12\[ \]*.*foo3" "n in foo2" # doesn't fall off the stack. gdb_test "bt 10" \ - "\#0.*foo2.*asmsrc2\[.\]s:12.*\#1.*main.*asmsrc1\[.\]s:33(.*\#2.*start\[^\r\n\]*)?" \ + "\#0.*foo2.*asmsrc2\[.\]s:12.*\#1.*main.*asmsrc1\[.\]s:33" \ "bt ALL in foo2" # See if a capped `bt' prints the right source files.