From patchwork Sun Oct 9 03:59:03 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tsukasa OI X-Patchwork-Id: 58558 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 884AB3858413 for ; Sun, 9 Oct 2022 03:59:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 884AB3858413 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1665287980; bh=XGaa+ZrytgDhRe1VuCfoTDnoKaDLT7fR3VkS2cXxONw=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=BTyqJ8owPtBPco4fgb3rQ+qTazW9kWdueT9Ye6whA8DCh1bfyb+MFHSxC8p6BPs/9 XcrSLTYBgIPOUBpVRKc3YQw7uKAl9si8ASPRiBKlSnbJOWkdDfP3vgPeryXMZ44jCP oJxtwONcgJT58DaKwBnjItTcvbZsE8Gijy3sgn5Y= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mail-sender-0.a4lg.com (mail-sender.a4lg.com [153.120.152.154]) by sourceware.org (Postfix) with ESMTPS id 85EC23857345 for ; Sun, 9 Oct 2022 03:59:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 85EC23857345 Received: from [127.0.0.1] (localhost [127.0.0.1]) by mail-sender-0.a4lg.com (Postfix) with ESMTPSA id E366B300089; Sun, 9 Oct 2022 03:59:15 +0000 (UTC) To: Tsukasa OI , Andrew Burgess , Palmer Dabbelt Subject: [RFC PATCH 1/1] gdb/riscv: Cache per-BFD disassembler Date: Sun, 9 Oct 2022 03:59:03 +0000 Message-Id: <760e2c443b1244b2a0a64f7f865e905b9ef90a72.1665287884.git.research_trasio@irq.a4lg.com> In-Reply-To: References: Mime-Version: 1.0 X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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-Patchwork-Original-From: Tsukasa OI via Gdb-patches From: Tsukasa OI Reply-To: Tsukasa OI Cc: gdb-patches@sourceware.org Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" On RISC-V, calling the disassembler function (libopcodes) is not a small cost. This is because riscv_get_disassembler function sets the default architecture from given BFD's .riscv.attributes section. However, by default, GDB calls this function for every instruction. This commit replaces RISC-V's disassembler function and stop calling riscv_get_disassembler function if current BFD has not changed. It expects around 30-80% improvements on disassembling relatively large chunk of RISC-V code but most of them will be obscured by a RISC-V disassembler optimization the author is currently working on. Still, 3-5% of performance improvements will remain (due to reduced BFD section reads). --- gdb/riscv-tdep.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/gdb/riscv-tdep.c b/gdb/riscv-tdep.c index feca17d9141..ed68a52df4c 100644 --- a/gdb/riscv-tdep.c +++ b/gdb/riscv-tdep.c @@ -55,6 +55,7 @@ #include "cli/cli-decode.h" #include "observable.h" #include "prologue-value.h" +#include "progspace.h" #include "arch/riscv.h" #include "riscv-ravenscar-thread.h" @@ -1308,6 +1309,27 @@ riscv_print_one_register_info (struct gdbarch *gdbarch, gdb_printf (file, "\n"); } +/* Calling disassembler function on RISC-V is not fast as others. + We cache the disassembler function as long as current BFD is the same. */ + +static int +riscv_print_insn (bfd_vma memaddr, disassemble_info *info) +{ + static disassembler_ftype disassemble_fn = NULL; + static bfd *abfd = NULL; + bfd *ebfd = current_program_space->exec_bfd (); + + if (disassemble_fn == NULL || abfd != ebfd) + { + disassemble_fn = disassembler ( + info->arch, info->endian == BFD_ENDIAN_BIG, info->mach, ebfd); + abfd = ebfd; + } + + gdb_assert (disassemble_fn != NULL); + return (*disassemble_fn) (memaddr, info); +} + /* Return true if REGNUM is a valid CSR register. The CSR register space is sparsely populated, so not every number is a named CSR. */ @@ -3926,6 +3948,7 @@ riscv_gdbarch_init (struct gdbarch_info info, set_gdbarch_pc_regnum (gdbarch, RISCV_PC_REGNUM); set_gdbarch_print_registers_info (gdbarch, riscv_print_registers_info); + set_gdbarch_print_insn (gdbarch, riscv_print_insn); set_tdesc_pseudo_register_name (gdbarch, riscv_pseudo_register_name); set_tdesc_pseudo_register_type (gdbarch, riscv_pseudo_register_type);