From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2339 invoked by alias); 12 Dec 2013 09:15:56 -0000 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 Received: (qmail 2210 invoked by uid 89); 12 Dec 2013 09:15:55 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mga03.intel.com Received: from mga03.intel.com (HELO mga03.intel.com) (143.182.124.21) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 12 Dec 2013 09:15:52 +0000 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by azsmga101.ch.intel.com with ESMTP; 12 Dec 2013 01:15:50 -0800 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga001.fm.intel.com with ESMTP; 12 Dec 2013 01:15:48 -0800 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id rBC9FlFc022967; Thu, 12 Dec 2013 09:15:48 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id rBC9FlkO009159; Thu, 12 Dec 2013 10:15:47 +0100 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with œ id rBC9Fl5d009155; Thu, 12 Dec 2013 10:15:47 +0100 From: Markus Metzger To: jan.kratochvil@redhat.com Cc: gdb-patches@sourceware.org Subject: [patch v8 04/24] frame: add frame_is_tailcall function Date: Thu, 12 Dec 2013 09:16:00 -0000 Message-Id: <1386839747-8860-5-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1386839747-8860-1-git-send-email-markus.t.metzger@intel.com> References: <1386839747-8860-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes X-SW-Source: 2013-12/txt/msg00475.txt.bz2 Currently, gdb is looking at the frame type when trying to identify tailcall frames. This requires touching several places when adding a new tailcall frame type. Add a predicate for tailcall frames. 2013-12-12 Markus Metzger * frame.h (frame_is_tailcall): New. * frame.c (frame_is_tailcall): New. (skip_artificial_frames, frame_pop, get_frame_address_in_block): Call frame_is_tailcall. * infcmd.c (construct_inferior_arguments): Call frame_is_tailcall. * stack.h (frame_info): Call frame_is_tailcall. * dwarf2-frame-tailcall.c (frame_is_tailcall): Rename to .. (frame_is_dwarf2_tailcall): ... this. (cache_find): Update. --- gdb/dwarf2-frame-tailcall.c | 4 ++-- gdb/frame.c | 23 +++++++++++++++++------ gdb/frame.h | 7 ++++++- gdb/infcmd.c | 6 +++--- gdb/stack.c | 2 +- 5 files changed, 29 insertions(+), 13 deletions(-) diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c index b82a051..35de19d 100644 --- a/gdb/dwarf2-frame-tailcall.c +++ b/gdb/dwarf2-frame-tailcall.c @@ -140,7 +140,7 @@ cache_unref (struct tailcall_cache *cache) return 0. */ static int -frame_is_tailcall (struct frame_info *fi) +frame_is_dwarf2_tailcall (struct frame_info *fi) { return frame_unwinder_is (fi, &dwarf2_tailcall_frame_unwind); } @@ -154,7 +154,7 @@ cache_find (struct frame_info *fi) struct tailcall_cache *cache; void **slot; - while (frame_is_tailcall (fi)) + while (frame_is_dwarf2_tailcall (fi)) { fi = get_next_frame (fi); gdb_assert (fi != NULL); diff --git a/gdb/frame.c b/gdb/frame.c index 6a8b5ae..ddd5e70 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -415,7 +415,7 @@ static struct frame_info * skip_artificial_frames (struct frame_info *frame) { while (get_frame_type (frame) == INLINE_FRAME - || get_frame_type (frame) == TAILCALL_FRAME) + || frame_is_tailcall (frame)) frame = get_prev_frame (frame); return frame; @@ -919,9 +919,9 @@ frame_pop (struct frame_info *this_frame) if (!prev_frame) error (_("Cannot pop the initial frame.")); - /* Ignore TAILCALL_FRAME type frames, they were executed already before - entering THISFRAME. */ - while (get_frame_type (prev_frame) == TAILCALL_FRAME) + /* Ignore tailcall frames, they were executed already before entering + THISFRAME. */ + while (frame_is_tailcall (prev_frame)) prev_frame = get_prev_frame (prev_frame); /* Make a copy of all the register values unwound from this frame. @@ -2180,9 +2180,9 @@ get_frame_address_in_block (struct frame_info *this_frame) next_frame = next_frame->next; if ((get_frame_type (next_frame) == NORMAL_FRAME - || get_frame_type (next_frame) == TAILCALL_FRAME) + || frame_is_tailcall (next_frame)) && (get_frame_type (this_frame) == NORMAL_FRAME - || get_frame_type (this_frame) == TAILCALL_FRAME + || frame_is_tailcall (this_frame) || get_frame_type (this_frame) == INLINE_FRAME)) return pc - 1; @@ -2330,6 +2330,17 @@ frame_unwinder_is (struct frame_info *fi, const struct frame_unwind *unwinder) return fi->unwind == unwinder; } +/* See frame.h. */ + +int +frame_is_tailcall (struct frame_info *fi) +{ + enum frame_type type; + + type = get_frame_type (fi); + return type == TAILCALL_FRAME; +} + /* Level of the selected frame: 0 for innermost, 1 for its caller, ... or -1 for a NULL frame. */ diff --git a/gdb/frame.h b/gdb/frame.h index f8d5bc1..e4e6b25 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -181,7 +181,7 @@ extern int frame_id_p (struct frame_id l); /* Returns non-zero when L is a valid frame representing a frame made up by GDB without stack data representation in inferior, such as INLINE_FRAME or - TAILCALL_FRAME. */ + tailcall frames. */ extern int frame_id_artificial_p (struct frame_id l); /* Returns non-zero when L and R identify the same frame, or, if @@ -765,4 +765,9 @@ extern struct frame_info *create_new_frame (CORE_ADDR base, CORE_ADDR pc); extern int frame_unwinder_is (struct frame_info *fi, const struct frame_unwind *unwinder); +/* Return true if frame FI is a tailcall frame. */ + +extern int frame_is_tailcall (struct frame_info *fi); + + #endif /* !defined (FRAME_H) */ diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 19f720b..dd8d06a 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1776,9 +1776,9 @@ finish_command (char *arg, int from_tty) return; } - /* Ignore TAILCALL_FRAME type frames, they were executed already before - entering THISFRAME. */ - while (get_frame_type (frame) == TAILCALL_FRAME) + /* Ignore tailcall frames, they were executed already before entering + THISFRAME. */ + while (frame_is_tailcall (frame)) frame = get_prev_frame (frame); /* Find the function we will return from. */ diff --git a/gdb/stack.c b/gdb/stack.c index f45bb80..8007819 100644 --- a/gdb/stack.c +++ b/gdb/stack.c @@ -1529,7 +1529,7 @@ frame_info (char *addr_exp, int from_tty) printf_filtered (_(" Outermost frame: %s\n"), frame_stop_reason_string (reason)); } - else if (get_frame_type (fi) == TAILCALL_FRAME) + else if (frame_is_tailcall (fi)) puts_filtered (" tail call frame"); else if (get_frame_type (fi) == INLINE_FRAME) printf_filtered (" inlined into frame %d", -- 1.8.3.1