From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by sourceware.org (Postfix) with ESMTPS id 73EF33988006 for ; Wed, 16 Jun 2021 07:46:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 73EF33988006 IronPort-SDR: M3Na1UBwIzCg3hpZ8H6xFwr4Sjff8ITm9WTHhSymnNLK6ghKs6vW5YYjkjA9umUgHpg6b5YjJ/ qdtSlPhfHl3Q== X-IronPort-AV: E=McAfee;i="6200,9189,10016"; a="185824635" X-IronPort-AV: E=Sophos;i="5.83,277,1616482800"; d="scan'208";a="185824635" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2021 00:46:17 -0700 IronPort-SDR: B81YuYVoAD+4ME7eVHAmF9ZXmU5cHGARLIvxlrUlKQ7yqlMPWnk4p1/eVpsQoph8UkQTyulMhG n3R6zB9hDopw== X-IronPort-AV: E=Sophos;i="5.83,277,1616482800"; d="scan'208";a="442800668" Received: from mulvlfelix.iul.intel.com (HELO localhost) ([172.28.48.31]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jun 2021 00:46:16 -0700 From: Felix Willgerodt To: markus.t.metzger@intel.com, gdb-patches@sourceware.org Subject: [PATCH v3 04/12] btrace: Handle stepping and goto for auxiliary instructions. Date: Wed, 16 Jun 2021 09:41:57 +0200 Message-Id: <20210616074205.1129553-5-felix.willgerodt@intel.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20210616074205.1129553-1-felix.willgerodt@intel.com> References: <20210616074205.1129553-1-felix.willgerodt@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Jun 2021 07:46:21 -0000 Print the auxiliary data when stepping. Don't allow to goto an auxiliary instruction. This patch is in preparation for the new ptwrite feature, which is based on auxiliary instructions. gdb/ChangeLog: 2021-06-14 Felix Willgerodt * record-btrace.c: (record_btrace_single_step_forward): Handle BTRACE_INSN_AUX. (record_btrace_single_step_backward): Likewise. (record_btrace_goto): Likewise. --- gdb/record-btrace.c | 66 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c index 2fc273ca229..3d0c344e8e6 100644 --- a/gdb/record-btrace.c +++ b/gdb/record-btrace.c @@ -2377,6 +2377,7 @@ record_btrace_single_step_forward (struct thread_info *tp) { struct btrace_insn_iterator *replay, end, start; struct btrace_thread_info *btinfo; + struct btrace_insn next_insn; btinfo = &tp->btrace; replay = btinfo->replay; @@ -2390,9 +2391,13 @@ record_btrace_single_step_forward (struct thread_info *tp) return btrace_step_stopped (); /* Skip gaps during replay. If we end up at a gap (at the end of the trace), - jump back to the instruction at which we started. */ + jump back to the instruction at which we started. If we're stepping a + BTRACE_INSN_AUX instruction, print the auxiliary data and skip the + instruction. */ + start = *replay; - do + + for (;;) { unsigned int steps; @@ -2400,12 +2405,25 @@ record_btrace_single_step_forward (struct thread_info *tp) of the execution history. */ steps = btrace_insn_next (replay, 1); if (steps == 0) + { + *replay = start; + return btrace_step_no_history (); + } + + const struct btrace_insn *insn = btrace_insn_get (replay); + + /* If we're stepping a BTRACE_INSN_AUX instruction, print the auxiliary + data and skip the instruction. */ + if (insn->iclass == BTRACE_INSN_AUX) { - *replay = start; - return btrace_step_no_history (); + printf_unfiltered ("[%s]\n", + btinfo->aux_data[insn->aux_data_index].c_str ()); + continue; } + + if (insn != NULL) + break; } - while (btrace_insn_get (replay) == NULL); /* Determine the end of the instruction trace. */ btrace_insn_end (&end, btinfo); @@ -2426,6 +2444,7 @@ record_btrace_single_step_backward (struct thread_info *tp) { struct btrace_insn_iterator *replay, start; struct btrace_thread_info *btinfo; + struct btrace_insn prev_insn; btinfo = &tp->btrace; replay = btinfo->replay; @@ -2436,9 +2455,12 @@ record_btrace_single_step_backward (struct thread_info *tp) /* If we can't step any further, we reached the end of the history. Skip gaps during replay. If we end up at a gap (at the beginning of - the trace), jump back to the instruction at which we started. */ + the trace), jump back to the instruction at which we started. + If we're stepping a BTRACE_INSN_AUX instruction, print the auxiliary + data and skip the instruction. */ start = *replay; - do + + for (;;) { unsigned int steps; @@ -2448,8 +2470,20 @@ record_btrace_single_step_backward (struct thread_info *tp) *replay = start; return btrace_step_no_history (); } + + const struct btrace_insn *insn = btrace_insn_get (replay); + + /* Check if we're stepping a BTRACE_INSN_AUX instruction and skip it. */ + if (insn->iclass == BTRACE_INSN_AUX) + { + printf_unfiltered ("[%s]\n", + btinfo->aux_data[insn->aux_data_index].c_str ()); + continue; + } + + if (insn != NULL) + break; } - while (btrace_insn_get (replay) == NULL); /* Check if we're stepping a breakpoint. @@ -2872,25 +2906,31 @@ record_btrace_target::goto_record_end () /* The goto_record method of target record-btrace. */ void -record_btrace_target::goto_record (ULONGEST insn) +record_btrace_target::goto_record (ULONGEST insn_number) { struct thread_info *tp; struct btrace_insn_iterator it; unsigned int number; int found; - number = insn; + number = insn_number; /* Check for wrap-arounds. */ - if (number != insn) + if (number != insn_number) error (_("Instruction number out of range.")); tp = require_btrace_thread (); found = btrace_find_insn_by_number (&it, &tp->btrace, number); - /* Check if the instruction could not be found or is a gap. */ - if (found == 0 || btrace_insn_get (&it) == NULL) + /* Check if the instruction could not be found or is a gap or an + auxilliary instruction. */ + if (found == 0) + error (_("No such instruction.")); + + const struct btrace_insn *insn = btrace_insn_get (&it); + + if ((insn == NULL) || (insn->iclass == BTRACE_INSN_AUX)) error (_("No such instruction.")); record_btrace_set_replay (tp, &it); -- 2.25.4 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928