From patchwork Thu May 4 08:14:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nelson Chu X-Patchwork-Id: 89976 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp138556vqo; Thu, 4 May 2023 01:15:06 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ7Li/yy0XIjHlGRx7X77xbknYIaVyCE340EvxJ1TVXwtmLMowMWA2VLl+FlGzXCRqMgMMLx X-Received: by 2002:a17:907:7e86:b0:94f:a8fd:b69f with SMTP id qb6-20020a1709077e8600b0094fa8fdb69fmr5500779ejc.18.1683188106683; Thu, 04 May 2023 01:15:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1683188106; cv=none; d=google.com; s=arc-20160816; b=N5SmT6s/o4AbaxHspoLfRAKuy32kTwcOcH937duuP26Kzvj7vbDnvD0w3j7EwA9i9M +TcbvUGSVyKbmXQgZB/C2H5NMWx0+fXUGZAAUrohT47EI2owV2kv+lTiLFmFde1VGDjA WfCBNMd9ffeAW4vw8uLWVD78vFBB/M4Jd7mbQkslhuIxIKHArx699ZOTnwZF+s8XIc4N cMIWLEroFNAYGKBoYdbZAYKZeNzUlD+9gdUK4aJE+Xi7iU+y9/dfWJX2oPoQh9WeN9x4 tGlR0Eb8jU46k3JKOErTS78w9fY7HVYGnKcN7wLFW7dyGzyhSk/ncA/q3HSxMIDLH4G6 zhUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:message-id:date:subject:cc:to:from:dmarc-filter :delivered-to; bh=xDtFS3ouUp8EvvJphiYjIbjJsMlZRVaunX49Er7JQxU=; b=vOn5PkEdLbhe450uMmICgZ59wipAJxmET/dCLRTRDdgfkouGjC03wvlMX/+lzOU6ng uMaZuZ2OnI/xRBDOxY+jlu3ulwksAyFLVvbFdqAxXWayNZD/H90XWPOujdaF8LjzFVxs K7NSXJ2G8M3YJm7e2HZgfKWmWPaF/kc2nyiSJ76UO7eWpDJ38PaNMl3wJ2dvTCyMNCl6 w//feeVpugoiRUCQpKVjMIFFPGruZK1umdnRekxljNTSOGcVOLNOrgfa0khnGJUYz7c0 c2a9Jy/30gJWgzK27u7xmti0bmYkJ5sJly+D2RlQbDb693FNTfvRm4BLbK0JfHkDSJdG l8CQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id bq5-20020a170906d0c500b009659e77ef5dsi1105180ejb.481.2023.05.04.01.15.06 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 May 2023 01:15:06 -0700 (PDT) Received-SPF: pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; spf=pass (google.com: domain of binutils-bounces+ouuuleilei=gmail.com@sourceware.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="binutils-bounces+ouuuleilei=gmail.com@sourceware.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9C74A385773B for ; Thu, 4 May 2023 08:15:04 +0000 (GMT) X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from NelsondeMBP.localdomain (114-25-63-225.dynamic-ip.hinet.net [114.25.63.225]) by sourceware.org (Postfix) with ESMTP id 6BCA53858D28 for ; Thu, 4 May 2023 08:14:58 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6BCA53858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: sourceware.org; spf=none smtp.mailfrom=NelsondeMBP.localdomain Received: by NelsondeMBP.localdomain (Postfix, from userid 501) id 52994C6B8D3; Thu, 4 May 2023 16:14:54 +0800 (CST) From: Nelson Chu To: binutils@sourceware.org, jim.wilson.gcc@gmail.com, palmer@dabbelt.com, andrew@sifive.com Cc: nelson@rivosinc.com Subject: [PATCH] RISC-V: Minor improvements for dis-assembler. Date: Thu, 4 May 2023 16:14:52 +0800 Message-Id: <20230504081452.50748-1-nelson@rivosinc.com> X-Mailer: git-send-email 2.39.2 (Apple Git-143) MIME-Version: 1.0 X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, KHOP_HELO_FCRDNS, NO_DNS_FOR_FROM, RCVD_IN_PBL, RCVD_IN_SORBS_DUL, RDNS_DYNAMIC, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces+ouuuleilei=gmail.com@sourceware.org Sender: "Binutils" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764950651942408969?= X-GMAIL-MSGID: =?utf-8?q?1764950651942408969?= * Extract all private_data initializations into riscv_init_disasm_info, which called from print_insn_riscv rather than riscv_disassemble_insn. * The disassemble_free_target seems like the right place to release all target private_data, also including the internal data structures, like riscv_subsets. Therefore, add a new function, disassemble_free_riscv, to release them for safe. opcodes/ * disassemble.c (disassemble_free_target): Called disassemble_free_riscv for riscv to release private_data and internal data structures. * disassemble.h: Added extern disassemble_free_riscv. * riscv-dis.c (riscv_init_disasm_info): New function, used to init riscv_private_data. (riscv_disassemble_insn): Moved riscv_private_data initializations into riscv_init_disasm_info. (print_insn_riscv): Called riscv_init_disasm_info to init riscv_private_data once time. (disassemble_free_riscv): New function, used to free the internal data structures, like riscv_subsets. --- opcodes/disassemble.c | 1 + opcodes/disassemble.h | 2 ++ opcodes/riscv-dis.c | 58 +++++++++++++++++++++++++++---------------- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index 93052e75088..03cfccc562e 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -800,6 +800,7 @@ disassemble_free_target (struct disassemble_info *info) #endif #ifdef ARCH_riscv case bfd_arch_riscv: + disassemble_free_riscv (info); break; #endif #ifdef ARCH_rs6000 diff --git a/opcodes/disassemble.h b/opcodes/disassemble.h index d9ea70ac949..b7474a85e5d 100644 --- a/opcodes/disassemble.h +++ b/opcodes/disassemble.h @@ -105,6 +105,8 @@ extern disassembler_ftype csky_get_disassembler (bfd *); extern disassembler_ftype rl78_get_disassembler (bfd *); extern disassembler_ftype riscv_get_disassembler (bfd *); +extern void disassemble_free_riscv (disassemble_info *); + extern void ATTRIBUTE_NORETURN opcodes_assert (const char *, int); #define OPCODES_ASSERT(x) \ diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index f25993d1e45..108baeb32ef 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -668,7 +668,7 @@ riscv_disassemble_insn (bfd_vma memaddr, const struct riscv_opcode *op; static bool init = false; static const struct riscv_opcode *riscv_hash[OP_MASK_OP + 1]; - struct riscv_private_data *pd; + struct riscv_private_data *pd = info->private_data; int insnlen, i; bool printed; @@ -684,26 +684,6 @@ riscv_disassemble_insn (bfd_vma memaddr, init = true; } - if (info->private_data == NULL) - { - pd = info->private_data = xcalloc (1, sizeof (struct riscv_private_data)); - pd->gp = 0; - pd->print_addr = 0; - for (i = 0; i < (int)ARRAY_SIZE (pd->hi_addr); i++) - pd->hi_addr[i] = -1; - pd->to_print_addr = false; - pd->has_gp = false; - - for (i = 0; i < info->symtab_size; i++) - if (strcmp (bfd_asymbol_name (info->symtab[i]), RISCV_GP_SYMBOL) == 0) - { - pd->gp = bfd_asymbol_value (info->symtab[i]); - pd->has_gp = true; - } - } - else - pd = info->private_data; - insnlen = riscv_insn_length (word); /* RISC-V instructions are always little-endian. */ @@ -1079,6 +1059,34 @@ riscv_disassemble_data (bfd_vma memaddr ATTRIBUTE_UNUSED, return info->bytes_per_chunk; } +static bool +riscv_init_disasm_info (struct disassemble_info *info) +{ + int i; + + struct riscv_private_data *pd = + xcalloc (1, sizeof (struct riscv_private_data)); + pd->gp = 0; + pd->print_addr = 0; + for (i = 0; i < (int) ARRAY_SIZE (pd->hi_addr); i++) + pd->hi_addr[i] = -1; + pd->to_print_addr = false; + pd->has_gp = false; + + for (i = 0; i < info->symtab_size; i++) + { + asymbol *sym = info->symtab[i]; + if (strcmp (bfd_asymbol_name (sym), RISCV_GP_SYMBOL) == 0) + { + pd->gp = bfd_asymbol_value (sym); + pd->has_gp = true; + } + } + + info->private_data = pd; + return true; +} + int print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) { @@ -1099,6 +1107,9 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) else if (riscv_gpr_names == NULL) set_default_riscv_dis_options (); + if (info->private_data == NULL && !riscv_init_disasm_info (info)) + return -1; + mstate = riscv_search_mapping_symbol (memaddr, info); /* Save the last mapping state. */ last_map_state = mstate; @@ -1333,3 +1344,8 @@ with the -M switch (multiple options should be separated by commas):\n")); fprintf (stream, _("\n")); } + +void disassemble_free_riscv (struct disassemble_info *info ATTRIBUTE_UNUSED) +{ + riscv_release_subset_list (&riscv_subsets); +}