2003-07-15 Andrew Cagney <cagney@redhat.com>
* 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 <cagney@redhat.com> * gdb.asm/asm-source.exp: Do not allow "start" in the backtrace.
This commit is contained in:
parent
98a23b3f74
commit
0714963c79
@ -1,3 +1,13 @@
|
||||
2003-07-15 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* 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 <cagney@redhat.com>
|
||||
|
||||
* complaints.c (struct explanation): Define.
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
58
gdb/frame.c
58
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))
|
||||
|
@ -1,3 +1,7 @@
|
||||
2003-07-15 Andrew Cagney <cagney@redhat.com>
|
||||
|
||||
* gdb.asm/asm-source.exp: Do not allow "start" in the backtrace.
|
||||
|
||||
2003-07-15 Michael Chastain <mec@shout.net>
|
||||
|
||||
* gdb.base/gdb1250.exp: New file.
|
||||
|
@ -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.
|
||||
|
Loading…
x
Reference in New Issue
Block a user