From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1268 invoked by alias); 15 Jul 2008 19:01:57 -0000 Received: (qmail 1244 invoked by uid 22791); 15 Jul 2008 19:01:55 -0000 X-Spam-Check-By: sourceware.org Received: from NaN.false.org (HELO nan.false.org) (208.75.86.248) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 15 Jul 2008 19:01:28 +0000 Received: from nan.false.org (localhost [127.0.0.1]) by nan.false.org (Postfix) with ESMTP id CA96A9842C for ; Tue, 15 Jul 2008 19:01:26 +0000 (GMT) Received: from caradoc.them.org (22.svnf5.xdsl.nauticom.net [209.195.183.55]) by nan.false.org (Postfix) with ESMTP id 7A0269813B for ; Tue, 15 Jul 2008 19:01:26 +0000 (GMT) Received: from drow by caradoc.them.org with local (Exim 4.69) (envelope-from ) id 1KIpm9-0000ei-Lq for gdb-patches@sourceware.org; Tue, 15 Jul 2008 15:01:25 -0400 Date: Tue, 15 Jul 2008 19:01:00 -0000 From: Daniel Jacobowitz To: gdb-patches@sourceware.org Subject: [commit] Rename frame_pc_unwind and frame_unwind_id Message-ID: <20080715190125.GC32644@caradoc.them.org> Mail-Followup-To: gdb-patches@sourceware.org MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.17 (2008-05-11) X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-07/txt/msg00317.txt.bz2 This patch is the first non-trivial change in inlining support, and readily separable. The users of frame_unwind_id and frame_pc_unwind are all either inferior control, trying to find the caller / return address of a new function, or trampoline handling. I audited all of the uses, and the right behavior in every one of them is to ignore any inlined functions at the current location. A future patch, the one adding inlined frames, will make the corresponding change to frame_unwind_caller_id and frame_unwind_caller_pc. For now, I've just renamed them to indicate the correct expectations. Tested on x86_64-linux and committed. -- Daniel Jacobowitz CodeSourcery 2008-07-15 Daniel Jacobowitz * 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. --- gdb/frame.c | 8 ++++---- gdb/frame.h | 9 +++++++-- gdb/glibc-tdep.c | 2 +- gdb/hppa-tdep.c | 2 +- gdb/infrun.c | 14 ++++++++------ gdb/mips-linux-tdep.c | 2 +- gdb/obsd-tdep.c | 2 +- gdb/sol2-tdep.c | 2 +- gdb/stack.c | 14 +++++++++++--- 9 files changed, 35 insertions(+), 20 deletions(-) Index: src/gdb/frame.c =================================================================== --- src.orig/gdb/frame.c 2008-07-02 15:27:52.000000000 -0400 +++ src/gdb/frame.c 2008-07-02 15:44:32.000000000 -0400 @@ -270,7 +270,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 @@ -421,7 +421,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) { @@ -452,7 +452,7 @@ frame_pc_unwind (struct frame_info *this 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)); } @@ -1517,7 +1517,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. */ Index: src/gdb/frame.h =================================================================== --- src.orig/gdb/frame.h 2008-07-02 15:27:52.000000000 -0400 +++ src/gdb/frame.h 2008-07-02 15:42:01.000000000 -0400 @@ -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 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_n 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. */ Index: src/gdb/glibc-tdep.c =================================================================== --- src.orig/gdb/glibc-tdep.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/glibc-tdep.c 2008-07-02 15:44:14.000000000 -0400 @@ -97,7 +97,7 @@ glibc_skip_solib_resolver (struct gdbarc 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; Index: src/gdb/hppa-tdep.c =================================================================== --- src.orig/gdb/hppa-tdep.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/hppa-tdep.c 2008-07-02 15:44:08.000000000 -0400 @@ -1794,7 +1794,7 @@ hppa_find_unwind_entry_in_block (struct /* 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); Index: src/gdb/infrun.c =================================================================== --- src.orig/gdb/infrun.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/infrun.c 2008-07-02 15:43:37.000000000 -0400 @@ -2917,7 +2917,8 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( 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; @@ -3070,7 +3071,7 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME ( 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 @@ -3319,7 +3320,7 @@ insert_step_resume_breakpoint_at_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) @@ -3328,15 +3329,16 @@ insert_step_resume_breakpoint_at_caller /* 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 Index: src/gdb/mips-linux-tdep.c =================================================================== --- src.orig/gdb/mips-linux-tdep.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/mips-linux-tdep.c 2008-07-02 15:43:24.000000000 -0400 @@ -701,7 +701,7 @@ mips_linux_skip_resolver (struct gdbarch 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; } Index: src/gdb/obsd-tdep.c =================================================================== --- src.orig/gdb/obsd-tdep.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/obsd-tdep.c 2008-07-02 15:43:07.000000000 -0400 @@ -30,7 +30,7 @@ obsd_skip_solib_resolver (struct gdbarch 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); } Index: src/gdb/sol2-tdep.c =================================================================== --- src.orig/gdb/sol2-tdep.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/sol2-tdep.c 2008-07-02 15:43:01.000000000 -0400 @@ -30,7 +30,7 @@ sol2_skip_solib_resolver (struct gdbarch 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; } Index: src/gdb/stack.c =================================================================== --- src.orig/gdb/stack.c 2008-07-02 15:27:53.000000000 -0400 +++ src/gdb/stack.c 2008-07-02 15:43:14.000000000 -0400 @@ -854,8 +854,16 @@ parse_frame_specification_1 (const char { 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; } } @@ -984,7 +992,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)