* inline-frame.c (find_inline_frame_state): Check for changed PC
here... (inline_frame_sniffer): ... not here.
This commit is contained in:
parent
910713fdce
commit
4e48512954
|
@ -1,3 +1,9 @@
|
||||||
|
2009-11-13 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
|
* inline-frame.c (find_inline_frame_state): Check for changed PC
|
||||||
|
here...
|
||||||
|
(inline_frame_sniffer): ... not here.
|
||||||
|
|
||||||
2009-11-13 Daniel Jacobowitz <dan@codesourcery.com>
|
2009-11-13 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
* ui-file.c (stdio_file_read): Call gdb_select before read.
|
* ui-file.c (stdio_file_read): Call gdb_select before read.
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "block.h"
|
#include "block.h"
|
||||||
#include "frame-unwind.h"
|
#include "frame-unwind.h"
|
||||||
#include "inferior.h"
|
#include "inferior.h"
|
||||||
|
#include "regcache.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "vec.h"
|
#include "vec.h"
|
||||||
|
|
||||||
|
@ -59,7 +60,8 @@ DEF_VEC_O(inline_state_s);
|
||||||
|
|
||||||
static VEC(inline_state_s) *inline_states;
|
static VEC(inline_state_s) *inline_states;
|
||||||
|
|
||||||
/* Locate saved inlined frame state for PTID, if it exists. */
|
/* Locate saved inlined frame state for PTID, if it exists
|
||||||
|
and is valid. */
|
||||||
|
|
||||||
static struct inline_state *
|
static struct inline_state *
|
||||||
find_inline_frame_state (ptid_t ptid)
|
find_inline_frame_state (ptid_t ptid)
|
||||||
|
@ -70,7 +72,19 @@ find_inline_frame_state (ptid_t ptid)
|
||||||
for (ix = 0; VEC_iterate (inline_state_s, inline_states, ix, state); ix++)
|
for (ix = 0; VEC_iterate (inline_state_s, inline_states, ix, state); ix++)
|
||||||
{
|
{
|
||||||
if (ptid_equal (state->ptid, ptid))
|
if (ptid_equal (state->ptid, ptid))
|
||||||
return state;
|
{
|
||||||
|
struct regcache *regcache = get_thread_regcache (ptid);
|
||||||
|
CORE_ADDR current_pc = regcache_read_pc (regcache);
|
||||||
|
if (current_pc != state->saved_pc)
|
||||||
|
{
|
||||||
|
/* PC has changed - this context is invalid. Use the
|
||||||
|
default behavior. */
|
||||||
|
VEC_unordered_remove (inline_state_s, inline_states, ix);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return state;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -225,13 +239,8 @@ inline_frame_sniffer (const struct frame_unwind *self,
|
||||||
can be stepped into later). */
|
can be stepped into later). */
|
||||||
if (state != NULL && state->skipped_frames > 0 && next_frame == NULL)
|
if (state != NULL && state->skipped_frames > 0 && next_frame == NULL)
|
||||||
{
|
{
|
||||||
if (this_pc != state->saved_pc)
|
gdb_assert (depth >= state->skipped_frames);
|
||||||
state->skipped_frames = 0;
|
depth -= state->skipped_frames;
|
||||||
else
|
|
||||||
{
|
|
||||||
gdb_assert (depth >= state->skipped_frames);
|
|
||||||
depth -= state->skipped_frames;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If all the inlined functions here already have frames, then pass
|
/* If all the inlined functions here already have frames, then pass
|
||||||
|
|
Loading…
Reference in New Issue