aboutsummaryrefslogtreecommitdiff
path: root/gdb/tramp-frame.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/tramp-frame.c')
-rw-r--r--gdb/tramp-frame.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/gdb/tramp-frame.c b/gdb/tramp-frame.c
index 3c7e9e6..feb0055 100644
--- a/gdb/tramp-frame.c
+++ b/gdb/tramp-frame.c
@@ -45,6 +45,7 @@ tramp_frame_cache (struct frame_info *this_frame,
void **this_cache)
{
struct tramp_frame_cache *tramp_cache = (*this_cache);
+
if (tramp_cache->trad_cache == NULL)
{
tramp_cache->trad_cache = trad_frame_cache_zalloc (this_frame);
@@ -63,6 +64,7 @@ tramp_frame_this_id (struct frame_info *this_frame,
{
struct trad_frame_cache *trad_cache
= tramp_frame_cache (this_frame, this_cache);
+
trad_frame_get_id (trad_cache, this_id);
}
@@ -73,6 +75,7 @@ tramp_frame_prev_register (struct frame_info *this_frame,
{
struct trad_frame_cache *trad_cache
= tramp_frame_cache (this_frame, this_cache);
+
return trad_frame_get_register (trad_cache, this_frame, prev_regnum);
}
@@ -83,16 +86,19 @@ tramp_frame_start (const struct tramp_frame *tramp,
struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
int ti;
+
/* Search through the trampoline for one that matches the
instruction sequence around PC. */
for (ti = 0; tramp->insn[ti].bytes != TRAMP_SENTINEL_INSN; ti++)
{
CORE_ADDR func = pc - tramp->insn_size * ti;
int i;
+
for (i = 0; 1; i++)
{
gdb_byte buf[sizeof (tramp->insn[0])];
ULONGEST insn;
+
if (tramp->insn[i].bytes == TRAMP_SENTINEL_INSN)
return func;
if (!safe_frame_unwind_memory (this_frame,