From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1955 invoked by alias); 12 Dec 2013 09:15:54 -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 1759 invoked by uid 89); 12 Dec 2013 09:15:53 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.3 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, 12 Dec 2013 09:15:52 +0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP; 12 Dec 2013 01:15:51 -0800 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by orsmga002.jf.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 rBC9FmrN022970; 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 rBC9Flj2009166; Thu, 12 Dec 2013 10:15:47 +0100 Received: (from mmetzger@localhost) by ulvlx001.iul.intel.com with œ id rBC9Flmb009162; Thu, 12 Dec 2013 10:15:47 +0100 From: Markus Metzger To: jan.kratochvil@redhat.com Cc: gdb-patches@sourceware.org, Pedro Alves Subject: [patch v8 05/24] frame: artificial frame id's Date: Thu, 12 Dec 2013 09:16:00 -0000 Message-Id: <1386839747-8860-6-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/msg00479.txt.bz2 At the moment, a frame must have a stack - except for the outer frame. When we analyze the recorded execution for "record btrace" to detect function calls and compute a back trace at some point in the recorded execution history, we will end up with frames without a stack. To prepare for this, support frame_id's without a stack component. CC: Pedro Alves 2013-12-12 Markus Metzger * frame.h (frame_id_build_artificial): New. * frame.c (frame_id_build_artificial): New. (frame_id_p): An artificial frame is valid. (frame_id_eq): A frame is equal to itself. --- gdb/frame.c | 30 +++++++++++++++++++++++------- gdb/frame.h | 6 ++++++ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gdb/frame.c b/gdb/frame.c index ddd5e70..37d780e 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -526,6 +526,21 @@ frame_id_build_wild (CORE_ADDR stack_addr) return id; } +/* See frame.h. */ + +struct frame_id +frame_id_build_artificial (CORE_ADDR code_addr, + CORE_ADDR special_addr) +{ + struct frame_id id = null_frame_id; + + id.code_addr = code_addr; + id.code_addr_p = 1; + id.special_addr = special_addr; + id.special_addr_p = 1; + return id; +} + int frame_id_p (struct frame_id l) { @@ -536,6 +551,9 @@ frame_id_p (struct frame_id l) /* outer_frame_id is also valid. */ if (!p && memcmp (&l, &outer_frame_id, sizeof (l)) == 0) p = 1; + /* An artificial frame is also valid. */ + if (!p && l.code_addr_p && l.special_addr_p) + p = 1; if (frame_debug) { fprintf_unfiltered (gdb_stdlog, "{ frame_id_p (l="); @@ -559,13 +577,11 @@ frame_id_eq (struct frame_id l, struct frame_id r) { int eq; - if (!l.stack_addr_p && l.special_addr_p - && !r.stack_addr_p && r.special_addr_p) - /* The outermost frame marker is equal to itself. This is the - dodgy thing about outer_frame_id, since between execution steps - we might step into another function - from which we can't - unwind either. More thought required to get rid of - outer_frame_id. */ + if (memcmp (&l, &r, sizeof (l)) == 0) + /* Every frame is equal to itself. + This is the dodgy thing about outer_frame_id, since between execution + steps we might step into another function - from which we can't unwind + either. More thought required to get rid of outer_frame_id. */ eq = 1; else if (!l.stack_addr_p || !r.stack_addr_p) /* Like a NaN, if either ID is invalid, the result is false. diff --git a/gdb/frame.h b/gdb/frame.h index e4e6b25..71f07dd 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -174,6 +174,12 @@ extern struct frame_id frame_id_build_special (CORE_ADDR stack_addr, as the special identifier address are set to indicate wild cards. */ extern struct frame_id frame_id_build_wild (CORE_ADDR stack_addr); +/* Construct an artificial frame ID. The first parameter is the frame's + constant code address (typically the function entry point), and the + second the frame's special identifier address. */ +extern struct frame_id frame_id_build_artificial (CORE_ADDR code_addr, + CORE_ADDR special_addr); + /* Returns non-zero when L is a valid frame (a valid frame has a non-zero .base). The outermost frame is valid even without an ID. */ -- 1.8.3.1