From patchwork Tue Dec 10 19:16:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Marek Pikula X-Patchwork-Id: 102779 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 E8CA53857C7B for ; Tue, 10 Dec 2024 19:27:48 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E8CA53857C7B Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=samsung.com header.i=@samsung.com header.a=rsa-sha256 header.s=mail20170921 header.b=Fo4/ebaU X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by sourceware.org (Postfix) with ESMTPS id E22C1385842C for ; Tue, 10 Dec 2024 19:25:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E22C1385842C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=partner.samsung.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=partner.samsung.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org E22C1385842C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=210.118.77.11 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733858717; cv=none; b=O+iNAfRd1We3ZyDIdALkceCh1WuEqU2mX0adypTsMx9qlH2hu6mwRrcfRMEcOzRIqOHqYZ8sYNMmqGDbsG5KFUjJGxwZgRm/+dBm1lMwKXpqA1G5ACIPAJ4vn823fWRpjQ4RQC0B3rqdIcjlZQ9Ii4v+gi9aBT7IP94KU0pESgw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733858717; c=relaxed/simple; bh=+Adf4H+S2PGaKuMX7KbE5dfhO9bohO102cKgzAzE9IY=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=JNLHpK8px69w+wTtsfDGGLB4sR12jZrGOVxf8i5JGseEjEVQBx2rtA2mTVLEu5CPU9TrQzWObni9r0ccnf8TV4rWbk0sXqlAF6t5jniSD6eg4E5QwL7Ij7Y3u15fEXhNHHEX2XDvYIoj8MFcFSlnZUqk2FzAknarkDdDVLoaKzw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org E22C1385842C Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20241210192515euoutp01659d95a9ab5026086e365a366119bc47~P51DWgb2U2207222072euoutp01S for ; Tue, 10 Dec 2024 19:25:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20241210192515euoutp01659d95a9ab5026086e365a366119bc47~P51DWgb2U2207222072euoutp01S DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1733858715; bh=kOH4ehtgPatXg6kVKXGX7rivXoji2rKw8aOxIMHNp0U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Fo4/ebaUyI7zXKzDPO/87oFksC7qVWoRT/Zx31klhnDi30cqbDx21z2DOPKcMu+Ts IA5z5YHYOypxkCkS+PcGLNkJgUdORmCR5rwv7L2qLdM2E0Ns8Z3BoO7i7DWQzXzlu3 CQDCjhWr/3bvshm5tAG3jgC2k34SVw0bOAPDPXH4= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20241210192515eucas1p26b79c793d21ac5439e32e4c6abdf0416~P51DMES1Q2936529365eucas1p2E; Tue, 10 Dec 2024 19:25:15 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 52.14.20821.B9598576; Tue, 10 Dec 2024 19:25:15 +0000 (GMT) Received: from eusmtrp1.samsung.com (unknown [182.198.249.138]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20241210192515eucas1p2419ae7d1383f8fabf222aacbc473093a~P51C6EwZN2932529325eucas1p2E; Tue, 10 Dec 2024 19:25:15 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp1.samsung.com (KnoxPortal) with ESMTP id 20241210192515eusmtrp12f7d6cb66efdb7814eb6d1d13abdf6e2~P51C5iIOe0720607206eusmtrp1i; Tue, 10 Dec 2024 19:25:15 +0000 (GMT) X-AuditID: cbfec7f2-b11c470000005155-c2-6758959bdfdb Received: from eusmtip1.samsung.com ( [203.254.199.221]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 44.04.19920.B9598576; Tue, 10 Dec 2024 19:25:15 +0000 (GMT) Received: from localhost.localdomain (unknown [106.210.135.145]) by eusmtip1.samsung.com (KnoxPortal) with ESMTPA id 20241210192515eusmtip1ddf151bfc2f51ed068027a9a35564832~P51CejAj00334203342eusmtip1H; Tue, 10 Dec 2024 19:25:14 +0000 (GMT) From: =?utf-8?q?Marek_Piku=C5=82a?= To: gdb-patches@sourceware.org Cc: k.lewandowsk@samsung.com, s.rutka@samsung.com, =?utf-8?q?Marek_Piku?= =?utf-8?q?=C5=82a?= Subject: [PATCH 3/3] RISC-V: Support setting arch in disassembler Date: Tue, 10 Dec 2024 20:16:21 +0100 Message-ID: <20241210192434.336880-4-m.pikula@partner.samsung.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241210192434.336880-1-m.pikula@partner.samsung.com> MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrBIsWRmVeSWpSXmKPExsWy7djPc7qzp0akG7zu07Touf2F2aLx01xm i7/zprJZvOpezObA4nHw3R4mj74tqxg9tv92C2CO4rJJSc3JLEst0rdL4MpYtf8aW0GXScWV R+eZGxjXaXYxcnJICJhIrJjwiLWLkYtDSGAFo0RbTxMbhPOFUeLx0XXMEM5nRokla++ywrSc uXSFBSKxnFFixrE7jBDOV0aJbQueMIJUsQm4SBzafpQNxBYRkJOY1DUXzGYWKJaYNHE12CRh AUeJR8tOMIPYLAKqEv/vrWQCsXkFnCRWzzjFBLFNXuL8m/9gvZwCzhILVvRB1QhKnJz5hAVi prxE89bZYKdKCMzlkJh49iILRLOLxLnLHxkhbGGJV8e3sEPYMhKnJ/dA1WRLTP30DOq1EokJ bTOhaqwl7pz7BbSYA2iBpsT6XfoQYUeJA41bGUHCEgJ8EjfeCkKcwCcxadt0Zogwr0RHmxBE tZbElec/oBZJSHz//RrqGA+JX/3nWScwKs5C8swsJM/MQti7gJF5FaN4amlxbnpqsWFearle cWJucWleul5yfu4mRmDiOP3v+KcdjHNffdQ7xMjEwXiIUYKDWUmEl8M7NF2INyWxsiq1KD++ qDQntfgQozQHi5I4r2qKfKqQQHpiSWp2ampBahFMlomDU6qBKfLimq1VTHMFtIT7174VnWd+ fgaP7pHtK7VXhe0JdrP8ukdjSYL8VnWeeXL/+1a6+x0Ve5mj2P7ixX2Zl0y84V9+JN+w3TJj 344rPjHpBSnxr1/+r1hwsZ8hK2vBpnPfNm1xDovJ456y6ozswR0ff643O2fSdifizT81x7ca 5UHfq0/pzVxSf3nJ0ZCC7cq/3zHNq5q67U/6zilyocHKZy8qd/DrFZyUKV9bxvdpdqnGtM7J No+m3L1+6N57DVWrRXGN30Tt5Z62JHzr0JwSN2f/BhkFSaHV6RFuH57bnqufwnDGg7Fs4SPd B3OFo3d264h6Nt+bt+W7VJHaCScNua2T1J82aG0oFKnc1MsrravEUpyRaKjFXFScCAAWvRFL iwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRmVeSWpSXmKPExsVy+t/xu7qzp0akG8xeKmHRc/sLs0Xjp7nM Fn/nTWWzeNW9mM2BxePguz1MHn1bVjF6bP/tFsAcpWdTlF9akqqQkV9cYqsUbWhhpGdoaaFn ZGKpZ2hsHmtlZKqkb2eTkpqTWZZapG+XoJexav81toIuk4orj84zNzCu0+xi5OSQEDCROHPp CguILSSwlFHi8RVFiLiExLdvL9ghbGGJP9e62CBqPjNKXHgJ1ssm4CJxaPtRsLiIgJzEpK65 YDazQKnEirmbGEFsYQFHiUfLTjCD2CwCqhL/761kArF5BZwkVs84xQQxX17i/Jv/YL2cAs4S C1b0MUHscpL49f0sM0S9oMTJmU+A7uQAmq8usX6eEMQqeYnmrbOZJzAKzkJSNQuhahaSqgWM zKsYRVJLi3PTc4sN9YoTc4tL89L1kvNzNzECY2HbsZ+bdzDOe/VR7xAjEwfjIUYJDmYlEV4O 79B0Id6UxMqq1KL8+KLSnNTiQ4ymQN9MZJYSTc4HRmNeSbyhmYGpoYmZpYGppZmxkjiv2+Xz aUIC6YklqdmpqQWpRTB9TBycUg1MbDtdQs8dTX7y2l6Em830UNjhm1tvxre+nPCmSY/T8knm 3tlP+4om1MzxWx3j1zu/Q/Wq6s+pYZ/+fAg+97V/+1unDA+Zqp2OenazHj0Vcv9cyftoTbNU rUT1lhviofc/8R8q4zlss3P51CNSZfZTLsxly1gnwfDWKIxTe9tDnryV8VlXIt9PX3SwzndW UM+Em+qRf+4m8x0Te1D73tlwTgHbrAkVs74wezJ93ZXpf+rfg49xKmluq21V+/zu1T4wWr57 o3TEB1atzIfu7FNifnf+mrknapvBzN1S16/sXCk4c69Su6JaZDhvlwxzTMm1opWbOdNvbf6y PsbtVKTGganckzyZY46uss3Zk+rMocRSnJFoqMVcVJwIAADKgKIOAwAA X-CMS-MailID: 20241210192515eucas1p2419ae7d1383f8fabf222aacbc473093a X-Msg-Generator: CA X-RootMTR: 20241210192515eucas1p2419ae7d1383f8fabf222aacbc473093a X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20241210192515eucas1p2419ae7d1383f8fabf222aacbc473093a References: <20241210192434.336880-1-m.pikula@partner.samsung.com> X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org It is now possible to set a default ISA subset for disassembler with `default-arch` option. This value is used if it's not possible to deduce the ISA subset from the ELF file. To force usage of `default-arch` (i.e., disable ELF discovery), it's now possible to set `default-arch-force` flag. Signed-off-by: Marek PikuĊ‚a --- opcodes/riscv-dis.c | 89 +++++++++++++++++++++++++++++++++------------ 1 file changed, 65 insertions(+), 24 deletions(-) diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index f5c2329cd8b..b4da5472e15 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -84,6 +84,12 @@ static bool no_aliases = false; we did at the beginning. */ static bool all_ext = false; +/* Default ISA subset if not possible to deduce from ELF. */ +static const char *default_arch; + +/* Force usage of default-arch instead of taking it from ELF. */ +static bool default_arch_force = false; + /* Set default RISC-V disassembler options. */ static void @@ -92,6 +98,8 @@ set_default_riscv_dis_options (void) riscv_gpr_names = riscv_gpr_names_abi; riscv_fpr_names = riscv_fpr_names_abi; no_aliases = false; + default_arch = "rv64gc"; + default_arch_force = false; } /* Parse RISC-V disassembler option (without arguments). */ @@ -108,6 +116,8 @@ parse_riscv_dis_option_without_args (const char *option) } else if (strcmp (option, "max") == 0) all_ext = true; + else if (strcmp (option, "default-arch-force") == 0) + default_arch_force = true; else return false; return true; @@ -118,7 +128,9 @@ parse_riscv_dis_option_without_args (const char *option) static void parse_riscv_dis_option (const char *option) { - char *equal, *value; + const char *equal, *value; + size_t name_len; + static riscv_parse_subset_t riscv_rps_dis_check; if (parse_riscv_dis_option_without_args (option)) return; @@ -140,9 +152,9 @@ parse_riscv_dis_option (const char *option) return; } - *equal = '\0'; + name_len = equal - option; value = equal + 1; - if (strcmp (option, "priv-spec") == 0) + if (strncmp (option, "priv-spec", name_len) == 0) { enum riscv_spec_class priv_spec = PRIV_SPEC_CLASS_NONE; const char *name = NULL; @@ -161,6 +173,18 @@ parse_riscv_dis_option (const char *option) option, value, name); } } + else if (strncmp (option, "default-arch", name_len) == 0) + { + memcpy (&riscv_rps_dis_check, &riscv_rps_dis, + sizeof (riscv_parse_subset_t)); + riscv_release_subset_list (&riscv_subsets); + if (riscv_parse_subset (&riscv_rps_dis_check, value)) + default_arch = value; + else + opcodes_error_handler ( + _("unrecognized ISA subset: %s; using default: %s"), value, + default_arch); + } else { /* xgettext:c-format */ @@ -1360,6 +1384,32 @@ riscv_init_disasm_info (struct disassemble_info *info) return true; } +static const char * +get_isa_subset (bfd_vma memaddr, struct disassemble_info *info) +{ + bfd *obfd; + const char *sec_name; + + if (default_arch_force) + return default_arch; + + obfd = info->get_obfd_for_addr_func (memaddr, info); + if (!obfd || bfd_get_flavour (obfd) != bfd_target_elf_flavour) + return default_arch; + + sec_name = get_elf_backend_data (obfd)->obj_attrs_section; + if (bfd_get_section_by_name (obfd, sec_name) == NULL) + return default_arch; + + obj_attribute *attr = elf_known_obj_attributes_proc (obfd); + unsigned int Tag_a = Tag_RISCV_priv_spec; + unsigned int Tag_b = Tag_RISCV_priv_spec_minor; + unsigned int Tag_c = Tag_RISCV_priv_spec_revision; + riscv_get_priv_spec_class_from_numbers (attr[Tag_a].i, attr[Tag_b].i, + attr[Tag_c].i, &default_priv_spec); + return attr[Tag_RISCV_arch].s; +} + int print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) { @@ -1370,8 +1420,6 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) enum riscv_seg_mstate mstate; int (*riscv_disassembler) (bfd_vma, insn_t, const bfd_byte *, struct disassemble_info *); - const char *default_arch = "rv64gc"; - bfd *obfd = info->get_obfd_for_addr_func(memaddr, info); if (info->disassembler_options != NULL) { @@ -1382,25 +1430,8 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) else if (riscv_gpr_names == NULL) set_default_riscv_dis_options (); - if (obfd && bfd_get_flavour (obfd) == bfd_target_elf_flavour) - { - const char *sec_name = get_elf_backend_data (obfd)->obj_attrs_section; - if (bfd_get_section_by_name (obfd, sec_name) != NULL) - { - obj_attribute *attr = elf_known_obj_attributes_proc (obfd); - unsigned int Tag_a = Tag_RISCV_priv_spec; - unsigned int Tag_b = Tag_RISCV_priv_spec_minor; - unsigned int Tag_c = Tag_RISCV_priv_spec_revision; - riscv_get_priv_spec_class_from_numbers (attr[Tag_a].i, - attr[Tag_b].i, - attr[Tag_c].i, - &default_priv_spec); - default_arch = attr[Tag_RISCV_arch].s; - } - } - riscv_release_subset_list (&riscv_subsets); - riscv_parse_subset (&riscv_rps_dis, default_arch); + riscv_parse_subset (&riscv_rps_dis, get_isa_subset(memaddr, info)); if (info->private_data == NULL && !riscv_init_disasm_info (info)) return -1; @@ -1469,6 +1500,7 @@ typedef enum { RISCV_OPTION_ARG_NONE = -1, RISCV_OPTION_ARG_PRIV_SPEC, + RISCV_OPTION_ARG_DEFAULT_ARCH, RISCV_OPTION_ARG_COUNT } riscv_option_arg_t; @@ -1490,7 +1522,13 @@ static struct RISCV_OPTION_ARG_NONE }, { "priv-spec=", N_("Print the CSR according to the chosen privilege spec."), - RISCV_OPTION_ARG_PRIV_SPEC } + RISCV_OPTION_ARG_PRIV_SPEC }, + { "default-arch=", + N_("Set a default ISA subset if not possible to deduce from ELF."), + RISCV_OPTION_ARG_DEFAULT_ARCH }, + { "default-arch-force", + N_("Force usage of default-arch instead of taking it from ELF."), + RISCV_OPTION_ARG_NONE } }; /* Build the structure representing valid RISCV disassembler options. @@ -1522,6 +1560,9 @@ disassembler_options_riscv (void) /* The array we return must be NULL terminated. */ args[RISCV_OPTION_ARG_PRIV_SPEC].values[i] = NULL; + args[RISCV_OPTION_ARG_DEFAULT_ARCH].name = "ARCH"; + args[RISCV_OPTION_ARG_DEFAULT_ARCH].values = NULL; + /* The array we return must be NULL terminated. */ args[num_args].name = NULL; args[num_args].values = NULL;