From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18865 invoked by alias); 19 Dec 2013 16:45:13 -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 18759 invoked by uid 89); 19 Dec 2013 16:45:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.4 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mga02.intel.com Received: from mga02.intel.com (HELO mga02.intel.com) (134.134.136.20) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 19 Dec 2013 16:45:11 +0000 Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP; 19 Dec 2013 08:45:08 -0800 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga001.jf.intel.com with ESMTP; 19 Dec 2013 08:45:00 -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 rBJGj0kt025988; Thu, 19 Dec 2013 16:45:00 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id rBJGj0mP029753; Thu, 19 Dec 2013 17:45:00 +0100 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with œ id rBJGj0EV029749; Thu, 19 Dec 2013 17:45:00 +0100 From: Markus Metzger To: jan.kratochvil@redhat.com, palves@redhat.com Cc: gdb-patches@sourceware.org Subject: [PATCH v9 05/29] frame: add frame_is_tailcall function Date: Thu, 19 Dec 2013 16:45:00 -0000 Message-Id: <1387471499-29444-6-git-send-email-markus.t.metzger@intel.com> In-Reply-To: <1387471499-29444-1-git-send-email-markus.t.metzger@intel.com> References: <1387471499-29444-1-git-send-email-markus.t.metzger@intel.com> X-IsSubscribed: yes X-SW-Source: 2013-12/txt/msg00762.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. This patch is no longer needed for the btrace series. I leave it in since it might help someone in the future. I'd also be OK to remove it. 2013-12-19 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 ed31c9e..99c2309 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -426,7 +426,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; @@ -945,9 +945,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. @@ -2206,9 +2206,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; @@ -2356,6 +2356,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 b03f212..8b6755e 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -205,7 +205,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 @@ -789,4 +789,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