From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 36066 invoked by alias); 8 May 2017 08:13:35 -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 36031 invoked by uid 89); 8 May 2017 08:13:33 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=19611 X-HELO: mga14.intel.com Received: from mga14.intel.com (HELO mga14.intel.com) (192.55.52.115) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 08 May 2017 08:13:32 +0000 Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 May 2017 01:13:33 -0700 X-ExtLoop1: 1 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by FMSMGA003.fm.intel.com with ESMTP; 08 May 2017 01:13:32 -0700 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 v488DVXb018484; Mon, 8 May 2017 09:13:32 +0100 Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id v488DVaG004992; Mon, 8 May 2017 10:13:31 +0200 Received: (from twiederh@localhost) by ulvlx001.iul.intel.com with œ id v488DVYa004988; Mon, 8 May 2017 10:13:31 +0200 From: Tim Wiederhake To: gdb-patches@sourceware.org Cc: markus.t.metzger@intel.com Subject: [PATCH v2 04/11] btrace: Use function segment index in insn iterator. Date: Mon, 08 May 2017 08:13:00 -0000 Message-Id: <1494231185-4709-5-git-send-email-tim.wiederhake@intel.com> In-Reply-To: <1494231185-4709-1-git-send-email-tim.wiederhake@intel.com> References: <1494231185-4709-1-git-send-email-tim.wiederhake@intel.com> X-IsSubscribed: yes X-SW-Source: 2017-05/txt/msg00175.txt.bz2 Remove FUNCTION pointer in struct btrace_insn_iterator and use an index into the list of function segments instead. 2017-05-08 Tim Wiederhake gdb/ChangeLog: * btrace.c: (btrace_insn_get, btrace_insn_get_error, btrace_insn_number, btrace_insn_begin, btrace_insn_end, btrace_insn_next, btrace_insn_prev, btrace_find_insn_by_number): Replace function segment pointer with index. (btrace_insn_cmp): Simplify. * btrace.h: (struct btrace_insn_iterator) Rename index to insn_index. Replace function segment pointer with index into function segment vector. * record-btrace.c (record_btrace_call_history): Replace function segment pointer use with index. (record_btrace_frame_sniffer): Retrieve function call segment through vector. (record_btrace_set_replay): Remove defunc't safety check. --- gdb/btrace.c | 59 +++++++++++++++++++++++++++++++++-------------------- gdb/btrace.h | 7 +++---- gdb/record-btrace.c | 7 ++++--- 3 files changed, 44 insertions(+), 29 deletions(-) diff --git a/gdb/btrace.c b/gdb/btrace.c index 3fd3ad6..18044ac 100644 --- a/gdb/btrace.c +++ b/gdb/btrace.c @@ -2252,8 +2252,8 @@ btrace_insn_get (const struct btrace_insn_iterator *it) const struct btrace_function *bfun; unsigned int index, end; - index = it->index; - bfun = it->function; + index = it->insn_index; + bfun = VEC_index (btrace_fun_p, it->btinfo->functions, it->call_index); /* Check if the iterator points to a gap in the trace. */ if (bfun->errcode != 0) @@ -2272,7 +2272,10 @@ btrace_insn_get (const struct btrace_insn_iterator *it) int btrace_insn_get_error (const struct btrace_insn_iterator *it) { - return it->function->errcode; + const struct btrace_function *bfun; + + bfun = VEC_index (btrace_fun_p, it->btinfo->functions, it->call_index); + return bfun->errcode; } /* See btrace.h. */ @@ -2280,7 +2283,10 @@ btrace_insn_get_error (const struct btrace_insn_iterator *it) unsigned int btrace_insn_number (const struct btrace_insn_iterator *it) { - return it->function->insn_offset + it->index; + const struct btrace_function *bfun; + + bfun = VEC_index (btrace_fun_p, it->btinfo->functions, it->call_index); + return bfun->insn_offset + it->insn_index; } /* See btrace.h. */ @@ -2296,8 +2302,8 @@ btrace_insn_begin (struct btrace_insn_iterator *it, error (_("No trace.")); it->btinfo = btinfo; - it->function = bfun; - it->index = 0; + it->call_index = 0; + it->insn_index = 0; } /* See btrace.h. */ @@ -2322,8 +2328,8 @@ btrace_insn_end (struct btrace_insn_iterator *it, length -= 1; it->btinfo = btinfo; - it->function = bfun; - it->index = length; + it->call_index = bfun->number - 1; + it->insn_index = length; } /* See btrace.h. */ @@ -2334,9 +2340,9 @@ btrace_insn_next (struct btrace_insn_iterator *it, unsigned int stride) const struct btrace_function *bfun; unsigned int index, steps; - bfun = it->function; + bfun = VEC_index (btrace_fun_p, it->btinfo->functions, it->call_index); steps = 0; - index = it->index; + index = it->insn_index; while (stride != 0) { @@ -2402,8 +2408,8 @@ btrace_insn_next (struct btrace_insn_iterator *it, unsigned int stride) } /* Update the iterator. */ - it->function = bfun; - it->index = index; + it->call_index = bfun->number - 1; + it->insn_index = index; return steps; } @@ -2416,9 +2422,9 @@ btrace_insn_prev (struct btrace_insn_iterator *it, unsigned int stride) const struct btrace_function *bfun; unsigned int index, steps; - bfun = it->function; + bfun = VEC_index (btrace_fun_p, it->btinfo->functions, it->call_index); steps = 0; - index = it->index; + index = it->insn_index; while (stride != 0) { @@ -2460,8 +2466,8 @@ btrace_insn_prev (struct btrace_insn_iterator *it, unsigned int stride) } /* Update the iterator. */ - it->function = bfun; - it->index = index; + it->call_index = bfun->number - 1; + it->insn_index = index; return steps; } @@ -2472,12 +2478,21 @@ int btrace_insn_cmp (const struct btrace_insn_iterator *lhs, const struct btrace_insn_iterator *rhs) { - unsigned int lnum, rnum; + gdb_assert (lhs->btinfo == rhs->btinfo); - lnum = btrace_insn_number (lhs); - rnum = btrace_insn_number (rhs); + if (lhs->call_index > rhs->call_index) + return 1; + + if (lhs->call_index < rhs->call_index) + return -1; + + if (lhs->insn_index > rhs->insn_index) + return 1; + + if (lhs->insn_index < rhs->insn_index) + return -1; - return (int) (lnum - rnum); + return 0; } /* See btrace.h. */ @@ -2526,8 +2541,8 @@ btrace_find_insn_by_number (struct btrace_insn_iterator *it, } it->btinfo = btinfo; - it->function = bfun; - it->index = number - bfun->insn_offset; + it->call_index = bfun->number - 1; + it->insn_index = number - bfun->insn_offset; return 1; } diff --git a/gdb/btrace.h b/gdb/btrace.h index 64ce9bd..8901a66 100644 --- a/gdb/btrace.h +++ b/gdb/btrace.h @@ -196,12 +196,11 @@ struct btrace_insn_iterator /* The branch trace information for this thread. Will never be NULL. */ const struct btrace_thread_info *btinfo; - /* The branch trace function segment containing the instruction. - Will never be NULL. */ - const struct btrace_function *function; + /* The index of the function segment in BTINFO->FUNCTIONS. */ + unsigned int call_index; /* The index into the function segment's instruction vector. */ - unsigned int index; + unsigned int insn_index; }; /* A branch trace function call iterator. */ diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 86a4b1e..2f595ae 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -1102,7 +1102,7 @@ record_btrace_call_history (struct target_ops *self, int size, int int_flags) if (replay != NULL) { begin.btinfo = btinfo; - begin.index = replay->function->number - 1; + begin.index = replay->call_index; } else btrace_call_end (&begin, btinfo); @@ -1678,7 +1678,8 @@ record_btrace_frame_sniffer (const struct frame_unwind *self, replay = tp->btrace.replay; if (replay != NULL) - bfun = replay->function; + bfun = VEC_index (btrace_fun_p, replay->btinfo->functions, + replay->call_index); } else { @@ -2691,7 +2692,7 @@ record_btrace_set_replay (struct thread_info *tp, btinfo = &tp->btrace; - if (it == NULL || it->function == NULL) + if (it == NULL) record_btrace_stop_replaying (tp); else { -- 2.7.4