summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jacobowitz <dan@debian.org>2008-07-15 18:58:32 +0000
committerDaniel Jacobowitz <dan@debian.org>2008-07-15 18:58:32 +0000
commit39cfa69e72d29101a012f7d3bc23b2da77c3cbcf (patch)
tree7c438aadbaf900e39330b88fff076631dee6f9ea
parentd09ae1452d5fc874ac7b275a7663a462d59ba0e8 (diff)
downloadgdb-39cfa69e72d29101a012f7d3bc23b2da77c3cbcf.tar.gz
* frame.c (frame_unwind_id): Renamed to ...
(frame_unwind_caller_id): ... this. All callers updated. (frame_pc_unwind): Renamed to ... (frame_unwind_caller_pc): ... this. All callers updated. * frame.h: Document frame_unwind_caller_WHAT functions. (frame_unwind_id): Renamed to ... (frame_unwind_caller_id): ... this. (frame_pc_unwind): Renamed to ... (frame_unwind_caller_pc): ... this. * hppa-tdep.c (hppa_find_unwind_entry_in_block): Correct comment. * stack.c (parse_frame_specification_1): Do not rely on frame_unwind_id.
-rw-r--r--gdb/ChangeLog15
-rw-r--r--gdb/frame.c8
-rw-r--r--gdb/frame.h9
-rw-r--r--gdb/glibc-tdep.c2
-rw-r--r--gdb/hppa-tdep.c2
-rw-r--r--gdb/infrun.c14
-rw-r--r--gdb/mips-linux-tdep.c2
-rw-r--r--gdb/obsd-tdep.c2
-rw-r--r--gdb/sol2-tdep.c2
-rw-r--r--gdb/stack.c14
10 files changed, 50 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 21ae33586ee..5c43fb6ca26 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,20 @@
2008-07-15 Daniel Jacobowitz <dan@codesourcery.com>
+ * frame.c (frame_unwind_id): Renamed to ...
+ (frame_unwind_caller_id): ... this. All callers updated.
+ (frame_pc_unwind): Renamed to ...
+ (frame_unwind_caller_pc): ... this. All callers updated.
+ * frame.h: Document frame_unwind_caller_WHAT functions.
+ (frame_unwind_id): Renamed to ...
+ (frame_unwind_caller_id): ... this.
+ (frame_pc_unwind): Renamed to ...
+ (frame_unwind_caller_pc): ... this.
+ * hppa-tdep.c (hppa_find_unwind_entry_in_block): Correct comment.
+ * stack.c (parse_frame_specification_1): Do not rely on
+ frame_unwind_id.
+
+2008-07-15 Daniel Jacobowitz <dan@codesourcery.com>
+
* mn10300-tdep.c (set_reg_offsets): Use get_frame_register_unsigned.
2008-07-15 Daniel Jacobowitz <dan@codesourcery.com>
diff --git a/gdb/frame.c b/gdb/frame.c
index f5e0fad427b..5900e22d184 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -271,7 +271,7 @@ get_frame_id (struct frame_info *fi)
}
struct frame_id
-frame_unwind_id (struct frame_info *next_frame)
+frame_unwind_caller_id (struct frame_info *next_frame)
{
/* Use prev_frame, and not get_prev_frame. The latter will truncate
the frame chain, leading to this function unintentionally
@@ -422,7 +422,7 @@ frame_find_by_id (struct frame_id id)
}
CORE_ADDR
-frame_pc_unwind (struct frame_info *this_frame)
+frame_unwind_caller_pc (struct frame_info *this_frame)
{
if (!this_frame->prev_pc.p)
{
@@ -453,7 +453,7 @@ frame_pc_unwind (struct frame_info *this_frame)
this_frame->prev_pc.p = 1;
if (frame_debug)
fprintf_unfiltered (gdb_stdlog,
- "{ frame_pc_unwind (this_frame=%d) -> 0x%s }\n",
+ "{ frame_unwind_caller_pc (this_frame=%d) -> 0x%s }\n",
this_frame->level,
paddr_nz (this_frame->prev_pc.value));
}
@@ -1533,7 +1533,7 @@ CORE_ADDR
get_frame_pc (struct frame_info *frame)
{
gdb_assert (frame->next != NULL);
- return frame_pc_unwind (frame->next);
+ return frame_unwind_caller_pc (frame->next);
}
/* Return an address that falls within THIS_FRAME's code block. */
diff --git a/gdb/frame.h b/gdb/frame.h
index 3e8f023109e..b7ccd300e39 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -34,6 +34,11 @@
frame_unwind_WHAT...(): Unwind THIS frame's WHAT from the NEXT
frame.
+ frame_unwind_caller_WHAT...(): Unwind WHAT for NEXT stack frame's
+ real caller. Any inlined functions in NEXT's stack frame are
+ skipped. Use these to ignore any potentially inlined functions,
+ e.g. inlined into the first instruction of a library trampoline.
+
put_frame_WHAT...(): Put a value into this frame (unsafe, need to
invalidate the frame / regcache afterwards) (better name more
strongly hinting at its unsafeness)
@@ -361,7 +366,7 @@ extern CORE_ADDR get_frame_base (struct frame_info *);
instead, since that avoids the bug. */
extern struct frame_id get_frame_id (struct frame_info *fi);
-extern struct frame_id frame_unwind_id (struct frame_info *next_frame);
+extern struct frame_id frame_unwind_caller_id (struct frame_info *next_frame);
/* Assuming that a frame is `normal', return its base-address, or 0 if
the information isn't available. NOTE: This address is really only
@@ -515,7 +520,7 @@ extern const char *frame_map_regnum_to_name (struct frame_info *frame,
calling frame. For GDB, `pc' is the resume address and not a
specific register. */
-extern CORE_ADDR frame_pc_unwind (struct frame_info *frame);
+extern CORE_ADDR frame_unwind_caller_pc (struct frame_info *frame);
/* Discard the specified frame. Restoring the registers to the state
of the caller. */
diff --git a/gdb/glibc-tdep.c b/gdb/glibc-tdep.c
index 0ae303b78be..86046a091f3 100644
--- a/gdb/glibc-tdep.c
+++ b/gdb/glibc-tdep.c
@@ -97,7 +97,7 @@ glibc_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
fixup = lookup_minimal_symbol ("fixup", NULL, objfile);
if (fixup && SYMBOL_VALUE_ADDRESS (fixup) == pc)
- return frame_pc_unwind (get_current_frame ());
+ return frame_unwind_caller_pc (get_current_frame ());
}
return 0;
diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c
index ace04a3d93d..17a0909b90f 100644
--- a/gdb/hppa-tdep.c
+++ b/gdb/hppa-tdep.c
@@ -1794,7 +1794,7 @@ hppa_find_unwind_entry_in_block (struct frame_info *this_frame)
/* FIXME drow/20070101: Calling gdbarch_addr_bits_remove on the
result of get_frame_address_in_block implies a problem.
The bits should have been removed earlier, before the return
- value of frame_pc_unwind. That might be happening already;
+ value of gdbarch_unwind_pc. That might be happening already;
if it isn't, it should be fixed. Then this call can be
removed. */
pc = gdbarch_addr_bits_remove (get_frame_arch (this_frame), pc);
diff --git a/gdb/infrun.c b/gdb/infrun.c
index 2f32a82b5ba..f7ce888c397 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -3067,7 +3067,8 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
being equal, so to get into this block, both the current and
previous frame must have valid frame IDs. */
if (!frame_id_eq (get_frame_id (get_current_frame ()), step_frame_id)
- && frame_id_eq (frame_unwind_id (get_current_frame ()), step_frame_id))
+ && frame_id_eq (frame_unwind_caller_id (get_current_frame ()),
+ step_frame_id))
{
CORE_ADDR real_stop_pc;
@@ -3220,7 +3221,7 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n");
set step-mode) or we no longer know how to get back
to the call site. */
if (step_stop_if_no_debug
- || !frame_id_p (frame_unwind_id (get_current_frame ())))
+ || !frame_id_p (frame_unwind_caller_id (get_current_frame ())))
{
/* If we have no line number and the step-stop-if-no-debug
is set, we stop the step so that the user has a chance to
@@ -3469,7 +3470,7 @@ insert_step_resume_breakpoint_at_frame (struct frame_info *return_frame)
This is a separate function rather than reusing
insert_step_resume_breakpoint_at_frame in order to avoid
get_prev_frame, which may stop prematurely (see the implementation
- of frame_unwind_id for an example). */
+ of frame_unwind_caller_id for an example). */
static void
insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
@@ -3478,15 +3479,16 @@ insert_step_resume_breakpoint_at_caller (struct frame_info *next_frame)
/* We shouldn't have gotten here if we don't know where the call site
is. */
- gdb_assert (frame_id_p (frame_unwind_id (next_frame)));
+ gdb_assert (frame_id_p (frame_unwind_caller_id (next_frame)));
init_sal (&sr_sal); /* initialize to zeros */
sr_sal.pc = gdbarch_addr_bits_remove
- (current_gdbarch, frame_pc_unwind (next_frame));
+ (current_gdbarch, frame_unwind_caller_pc (next_frame));
sr_sal.section = find_pc_overlay (sr_sal.pc);
- insert_step_resume_breakpoint_at_sal (sr_sal, frame_unwind_id (next_frame));
+ insert_step_resume_breakpoint_at_sal (sr_sal,
+ frame_unwind_caller_id (next_frame));
}
/* Insert a "longjmp-resume" breakpoint at PC. This is used to set a
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
index d631a7b3c32..af643ac58dc 100644
--- a/gdb/mips-linux-tdep.c
+++ b/gdb/mips-linux-tdep.c
@@ -701,7 +701,7 @@ mips_linux_skip_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
resolver = lookup_minimal_symbol ("__dl_runtime_resolve", NULL, NULL);
if (resolver && SYMBOL_VALUE_ADDRESS (resolver) == pc)
- return frame_pc_unwind (get_current_frame ());
+ return frame_unwind_caller_pc (get_current_frame ());
return 0;
}
diff --git a/gdb/obsd-tdep.c b/gdb/obsd-tdep.c
index cb941fbc8aa..7667bac48a2 100644
--- a/gdb/obsd-tdep.c
+++ b/gdb/obsd-tdep.c
@@ -30,7 +30,7 @@ obsd_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
msym = lookup_minimal_symbol("_dl_bind", NULL, NULL);
if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
- return frame_pc_unwind (get_current_frame ());
+ return frame_unwind_caller_pc (get_current_frame ());
else
return find_solib_trampoline_target (get_current_frame (), pc);
}
diff --git a/gdb/sol2-tdep.c b/gdb/sol2-tdep.c
index 9e9358950f3..f5d3bc8675e 100644
--- a/gdb/sol2-tdep.c
+++ b/gdb/sol2-tdep.c
@@ -30,7 +30,7 @@ sol2_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
msym = lookup_minimal_symbol("elf_bndr", NULL, NULL);
if (msym && SYMBOL_VALUE_ADDRESS (msym) == pc)
- return frame_pc_unwind (get_current_frame ());
+ return frame_unwind_caller_pc (get_current_frame ());
return 0;
}
diff --git a/gdb/stack.c b/gdb/stack.c
index 18c4298ed7f..7465fbfa39d 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -855,8 +855,16 @@ parse_frame_specification_1 (const char *frame_exp, const char *message,
{
if (frame_id_eq (id, get_frame_id (fid)))
{
- while (frame_id_eq (id, frame_unwind_id (fid)))
- fid = get_prev_frame (fid);
+ struct frame_info *prev_frame;
+
+ while (1)
+ {
+ prev_frame = get_prev_frame (fid);
+ if (!prev_frame
+ || !frame_id_eq (id, get_frame_id (prev_frame)))
+ break;
+ fid = prev_frame;
+ }
return fid;
}
}
@@ -985,7 +993,7 @@ frame_info (char *addr_exp, int from_tty)
puts_filtered ("; ");
wrap_here (" ");
printf_filtered ("saved %s ", pc_regname);
- fputs_filtered (paddress (frame_pc_unwind (fi)), gdb_stdout);
+ fputs_filtered (paddress (frame_unwind_caller_pc (fi)), gdb_stdout);
printf_filtered ("\n");
if (calling_frame_info == NULL)