From patchwork Fri Dec 13 17:25:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Marek Pikula X-Patchwork-Id: 103094 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 EEE413858C54 for ; Fri, 13 Dec 2024 17:29:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org EEE413858C54 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=PkX54ZHL X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mailout2.w1.samsung.com (mailout2.w1.samsung.com [210.118.77.12]) by sourceware.org (Postfix) with ESMTPS id C01E73858C39 for ; Fri, 13 Dec 2024 17:26:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C01E73858C39 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 C01E73858C39 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=210.118.77.12 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734110810; cv=none; b=EDsTirEuf8x2+vY/ZwsmsZ5hmh3d719Qtmt1z9YwI+H1wJkYec8Hx0D3APsGMi/18eUHOwxAZGt4RM2r1WhWWZAx/WxtYkRnS4vNxl/nb69y01rTRKzorWLxZv1YHcGc5XzRPk+xmsXUB7XoUgwziKI6QBjA0JLo2KGUrqqKL1k= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734110810; c=relaxed/simple; bh=XbQEHhAbj18Qd7YsNu0Ba1959965d4mS+Z1BBNaUIYg=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=qWCtC9tluZiEyohhh1KjDxXKHUg2p8RqBb3fOxSp8TcELMxOg/LHKK6r1zyG3v0UayKTq8bvOeNHhsY+pNp/fckl3H/HMGFLei2meoRB8AkoaO2IlBR1Y/Jt2tKPXDntlH7ApE8N8ULc9WKlU7AWL1kelOJtzv9MAYbjUsV4dpE= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C01E73858C39 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout2.w1.samsung.com (KnoxPortal) with ESMTP id 20241213172650euoutp02de177f36871b5e4b27bcb9e6f1d60045~QzJgQ8b2y1458114581euoutp02u for ; Fri, 13 Dec 2024 17:26:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout2.w1.samsung.com 20241213172650euoutp02de177f36871b5e4b27bcb9e6f1d60045~QzJgQ8b2y1458114581euoutp02u DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1734110810; bh=AnbqrZl2X5pH4PYgpHfwyhQ2jcBwakGZICvhqsuz7vo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PkX54ZHLOzFboW1xd/XpCQwPasPTPzBCwjaotxRQCnFFGaf42r4VjxOhb0eTQ5U7P Rpd6AvSr9/7Pj46NjUB7AxiDR3yVzDZ2E9oDTDwsHJAQiawRCSZEV4PqbeVX9ZIqDw IVrFS2DMc7OSGBr19H+aKD5YgtZNoAJaYwCZCdaE= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20241213172649eucas1p29dde38513305948481530cc024f60661~QzJftZA0c0449904499eucas1p2P; Fri, 13 Dec 2024 17:26:49 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 88.8E.20821.95E6C576; Fri, 13 Dec 2024 17:26:49 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p2.samsung.com (KnoxPortal) with ESMTPA id 20241213172648eucas1p26a0f0906b86e9dcad05b4442858b154f~QzJfSi8vl0838608386eucas1p2b; Fri, 13 Dec 2024 17:26:48 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20241213172648eusmtrp209dc666adc91ca5423ac0396cef2e893~QzJfR72sr2209822098eusmtrp2n; Fri, 13 Dec 2024 17:26:48 +0000 (GMT) X-AuditID: cbfec7f2-b11c470000005155-bb-675c6e599e91 Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 24.82.19920.85E6C576; Fri, 13 Dec 2024 17:26:48 +0000 (GMT) Received: from localhost.localdomain (unknown [106.210.135.145]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20241213172648eusmtip25dfa687ee82fed9e67dece35a5c7a1c1~QzJefcTix0765307653eusmtip2b; Fri, 13 Dec 2024 17:26:48 +0000 (GMT) From: =?utf-8?q?Marek_Piku=C5=82a?= To: binutils@sourceware.org Cc: gdb-patches@sourceware.org, k.lewandowsk@samsung.com, s.rutka@samsung.com, cgen@sourceware.org, =?utf-8?q?Marek_Piku=C5=82a?= Subject: [PATCH 1/2] opcodes: Add bfd handles to disassemble_info Date: Fri, 13 Dec 2024 18:25:43 +0100 Message-ID: <20241213172637.1191157-2-m.pikula@partner.samsung.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241213172637.1191157-1-m.pikula@partner.samsung.com> MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmphleLIzCtJLcpLzFFi42LZduzned3IvJh0g613hSw+TtvDaLFsPpDo uf2F2aLx01xmi7/zprJZvOpezObA5nHw3R4mj74tqxg9tv92C2CO4rJJSc3JLEst0rdL4MqY e2wvc8HPe4wVzz49YmtgnLSJsYuRk0NCwERi75OrYLaQwApGiY8TIrsYuYDsL4wSX3vuskA4 nxklDr74yQzTMeXhHWaIxHJGiQ9PeqGcr4wSW6+9BJvFJuAicWj7UTYQW0RAWqJpRh/YKGaB ZYwSzV//gBUJCzhKzO3ewwpiswioSqz5c5sFxOYVcJZYvv8V1Dp5ifNv/oMN4gQa+vJ5IxNE jaDEyZlPwOqZgWqat84Gu0JCYAeHxJuZT6CaXSS+th9lhbCFJV4d38IOYctI/N85nwnCzpaY +ukZVE2JxIS2mVA11hJ3zv0CWswBtEBTYv0ufYiwo8SSP2fAwhICfBI33gpCnMAnMWnbdGaI MK9ER5sQRLWWxJXnP1ggbAmJ779fQ4PdQ6Jlz0bGCYyKs5A8MwvJM7MQ9i5gZF7FKJ5aWpyb nlpsmJdarlecmFtcmpeul5yfu4kRmFBO/zv+aQfj3Fcf9Q4xMnEwHmKU4GBWEuG9YR+ZLsSb klhZlVqUH19UmpNafIhRmoNFSZxXNUU+VUggPbEkNTs1tSC1CCbLxMEp1cBUc0f6OJ9lwP1D T5cp8Zys+dN/ys+CebmF2rpQw4cPLXcv5U8/Lacw684ntuvCHoua+hOY7E6/7QjeFixyUJ/l hNgbZ2HtyCj7Kc+bjhtW33P8P32G+VdrUTnG5gbZt4/rUvVe3Jq0ekHR+zli6cGRH8x3Rt3U 8tzHrlD2fbOmv+eLKIXcB9o3ZaWM7KS4mA8JWxi0X9O5EsR9PrfSSZKZa6sc441V1REHParS nlf0z53/7zf7bGfR+TNWh0YILLsko+qvOjs9wuvbJ8GO7xu2zb27eJXNZL3PFv9kwxzYI+cp fsvxm7X/71NP4+oFnS/VXi48+eTDScaZWxfklTqfXyxkVLHEV2leo5ay7TIlluKMREMt5qLi RAC4F0HelwMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupikeLIzCtJLcpLzFFi42I5/e/4Pd2IvJh0g1U7DC0+TtvDaLFsPpDo uf2F2aLx01xmi7/zprJZvOpezObA5nHw3R4mj74tqxg9tv92C2CO0rMpyi8tSVXIyC8usVWK NrQw0jO0tNAzMrHUMzQ2j7UyMlXSt7NJSc3JLEst0rdL0MuYe2wvc8HPe4wVzz49YmtgnLSJ sYuRk0NCwERiysM7zF2MXBxCAksZJab/6YdKSEh8+/aCHcIWlvhzrYsNougzo8TbC8+YQBJs Ai4Sh7YfZQOxRQSkJZpm9LGAFDELrGKU2PG2CaxIWMBRYm73HlYQm0VAVWLNn9ssIDavgLPE 8v2vmCE2yEucf/MfbBAn0NCXzxvBeoWAatr6PzJB1AtKnJz5BKiXA2iBusT6eUIgYWag1uat s5knMArOQlI1C6FqFpKqBYzMqxhFUkuLc9Nziw31ihNzi0vz0vWS83M3MQIjZduxn5t3MM57 9VHvECMTB+MhRgkOZiUR3hv2kelCvCmJlVWpRfnxRaU5qcWHGE2BvpnILCWanA+M1bySeEMz A1NDEzNLA1NLM2MlcV63y+fThATSE0tSs1NTC1KLYPqYODilGpgS8otms5+o2jqJcX7KBIG/ P+dznzvVnLT/iljAxA852xe937nS/uLOnm2BQltu6m/8bNlnoLmifn+N1e/TrOUSYn2PQnyd Nhr+YuD7uf/Q/ZUsi0OeC/88uE5creF5bbFwnGzrasOJEqeY/E8lRfxXLZ3NtZqlWMd9rnB2 f3fi4c/+LpPUec/saJ/zQd1W4fH/qvJ69dMebg3sqxcu+HzkwdafrvsZJSq3rRDYHvF4stNM LQeGevMjd0suLZS6uXCuGpd8m1C+9pGL1TlTtrYbLvnxXkvlbbaZ1eG1TwV+FquXZbj9t524 8kGKALeBVKDwR+tTZ89PjjbT0g17/EbjZ+pLN7f/jEmh9yTt5p1SYinOSDTUYi4qTgQAYAwg RR0DAAA= X-CMS-MailID: 20241213172648eucas1p26a0f0906b86e9dcad05b4442858b154f X-Msg-Generator: CA X-RootMTR: 20241213172648eucas1p26a0f0906b86e9dcad05b4442858b154f X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20241213172648eucas1p26a0f0906b86e9dcad05b4442858b154f References: <20241213172637.1191157-1-m.pikula@partner.samsung.com> X-Spam-Status: No, score=-11.7 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: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org As `abfd` and `obfd` handles are useful in multiple places, it's reasonable to add them in `struct disassemble_info`. The current bfd metadata stays as is, as bfd handles are not available in all contexts (and don't need to be). This change enables more unified disassembler function derivation, moving the optional `abfd` handling to `print_insn_*` functions. The `obfd` handle is a function (`get_obfd_for_addr`), which resolves the object file bfd depending on the disassembled address. This enables more granular information for the disassemblers, especially if the ELF contains arch-specific information which can be used to provide better disassembly output. A notable example is RISC-V, which can use shared libraries built for a different subset of ISA extensions. Signed-off-by: Marek Pikuła --- binutils/objdump.c | 3 +- gdb/arch-utils.c | 2 +- gdb/disasm.c | 14 +++++++++ gprofng/libcollector/unwind.c | 9 ++++++ gprofng/src/Disasm.cc | 12 ++++++-- include/dis-asm.h | 20 +++++++------ opcodes/arc-dis.c | 31 ++++++++------------ opcodes/cris-dis.c | 9 +++++- opcodes/csky-dis.c | 54 +++++++++++++++++------------------ opcodes/dis-init.c | 11 ++++++- opcodes/disassemble.c | 13 ++++----- opcodes/disassemble.h | 7 ++--- opcodes/riscv-dis.c | 48 ++++++++++++++----------------- opcodes/rl78-dis.c | 12 ++++++-- sim/arm/wrapper.c | 3 +- sim/common/sim-trace.c | 4 +-- sim/cris/sim-if.c | 9 +++--- sim/m32c/trace.c | 1 + sim/rl78/trace.c | 3 +- sim/rx/trace.c | 1 + 20 files changed, 155 insertions(+), 111 deletions(-) diff --git a/binutils/objdump.c b/binutils/objdump.c index 5e68324f9c5..aad39fd1ecb 100644 --- a/binutils/objdump.c +++ b/binutils/objdump.c @@ -4204,7 +4204,7 @@ disassemble_data (bfd *abfd) /* Use libopcodes to locate a suitable disassembler. */ aux.disassemble_fn = disassembler (bfd_get_arch (abfd), bfd_big_endian (abfd), - bfd_get_mach (abfd), abfd); + bfd_get_mach (abfd)); if (!aux.disassemble_fn) { non_fatal (_("can't disassemble for architecture %s\n"), @@ -4217,6 +4217,7 @@ disassemble_data (bfd *abfd) disasm_info.flavour = bfd_get_flavour (abfd); disasm_info.arch = bfd_get_arch (abfd); disasm_info.mach = bfd_get_mach (abfd); + disasm_info.abfd = abfd; disasm_info.disassembler_options = disassembler_options; disasm_info.octets_per_byte = bfd_octets_per_byte (abfd, NULL); disasm_info.skip_zeroes = DEFAULT_SKIP_ZEROES; diff --git a/gdb/arch-utils.c b/gdb/arch-utils.c index a2ed2a2c011..e28c89b864f 100644 --- a/gdb/arch-utils.c +++ b/gdb/arch-utils.c @@ -1039,7 +1039,7 @@ default_print_insn (bfd_vma memaddr, disassemble_info *info) disassembler_ftype disassemble_fn; disassemble_fn = disassembler (info->arch, info->endian == BFD_ENDIAN_BIG, - info->mach, current_program_space->exec_bfd ()); + info->mach); gdb_assert (disassemble_fn != NULL); int res = (*disassemble_fn) (memaddr, info); diff --git a/gdb/disasm.c b/gdb/disasm.c index 11d6efd923a..2b8a4c209ae 100644 --- a/gdb/disasm.c +++ b/gdb/disasm.c @@ -944,6 +944,18 @@ get_all_disassembler_options (struct gdbarch *gdbarch) return string_printf ("%s%s%s", implicit, comma, options); } +/* Get obfd for a given address. If not available, fallback to abfd. Mind + that depending on context, abfd might also be undefined (NULL). */ + +static bfd * +get_obfd_for_address(bfd_vma memaddr, struct disassemble_info* info) { + struct objfile *ofile = current_program_space->objfile_for_address (memaddr); + if (ofile) + return ofile->obfd.get (); + + return info->abfd; +} + gdb_disassembler::gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file, read_memory_ftype func) @@ -1024,6 +1036,8 @@ gdb_disassemble_info::gdb_disassemble_info m_di.mach = gdbarch_bfd_arch_info (gdbarch)->mach; m_di.endian = gdbarch_byte_order (gdbarch); m_di.endian_code = gdbarch_byte_order_for_code (gdbarch); + m_di.abfd = current_program_space->exec_bfd (); + m_di.get_obfd_for_addr_func = get_obfd_for_address; m_di.application_data = this; m_disassembler_options_holder = get_all_disassembler_options (gdbarch); if (!m_disassembler_options_holder.empty ()) diff --git a/gprofng/libcollector/unwind.c b/gprofng/libcollector/unwind.c index d101044bc9b..f6a07104404 100644 --- a/gprofng/libcollector/unwind.c +++ b/gprofng/libcollector/unwind.c @@ -122,6 +122,13 @@ fprintf_styled_func (void *arg ATTRIBUTE_UNUSED, return 0; } +static bfd * +get_obfd_for_addr_func (bfd_vma memaddr ATTRIBUTE_UNUSED, + struct disassemble_info* info ATTRIBUTE_UNUSED) +{ + return NULL; +} + /* Get LENGTH bytes from info's buffer, at target address memaddr. Transfer them to myaddr. */ static int @@ -4363,6 +4370,8 @@ parse_x86_AVX_instruction (unsigned char *pc) dis_info.flavour = bfd_target_unknown_flavour; dis_info.endian = BFD_ENDIAN_UNKNOWN; dis_info.endian_code = dis_info.endian; + dis_info.abfd = NULL; + dis_info.get_obfd_for_addr_func = get_obfd_for_addr_func; dis_info.octets_per_byte = 1; dis_info.disassembler_needs_relocs = FALSE; dis_info.fprintf_func = fprintf_func; diff --git a/gprofng/src/Disasm.cc b/gprofng/src/Disasm.cc index 19f2174d536..e2df8ad1198 100644 --- a/gprofng/src/Disasm.cc +++ b/gprofng/src/Disasm.cc @@ -103,6 +103,14 @@ fprintf_styled_func (void *arg, enum disassembler_style st ATTRIBUTE_UNUSED, return cnt; } +static bfd * +get_obfd_for_addr_func (bfd_vma memaddr ATTRIBUTE_UNUSED, + struct disassemble_info* info ATTRIBUTE_UNUSED) +{ + /* Not applicable in this context. */ + return NULL; +} + /* Get LENGTH bytes from info's buffer, at target address memaddr. Transfer them to myaddr. */ static int @@ -220,6 +228,7 @@ Disasm::disasm_open () dis_info.flavour = bfd_target_unknown_flavour; dis_info.endian = BFD_ENDIAN_UNKNOWN; dis_info.endian_code = dis_info.endian; + dis_info.get_obfd_for_addr_func = get_obfd_for_addr_func; dis_info.octets_per_byte = 1; dis_info.disassembler_needs_relocs = FALSE; dis_info.fprintf_func = fprintf_func; @@ -319,9 +328,8 @@ Disasm::get_disasm (uint64_t inst_address, uint64_t end_address, dis_info.buffer_length, dis_info.buffer); dis_str->setLength (0); - bfd abfd; disassembler_ftype disassemble = disassembler (dis_info.arch, dis_info.endian, - dis_info.mach, &abfd); + dis_info.mach); if (disassemble == NULL) { printf ("ERROR: unsupported disassemble\n"); diff --git a/include/dis-asm.h b/include/dis-asm.h index 3bdecd37a81..43db1abd865 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -141,9 +141,8 @@ typedef struct disassemble_info void *stream; void *application_data; - /* Target description. We could replace this with a pointer to the bfd, - but that would require one. There currently isn't any such requirement - so to avoid introducing one we record these explicitly. */ + /* Target description. Not all contexts have abfd pointer defined, so we + record these explicitly. */ /* The bfd_flavour. This can be bfd_target_unknown_flavour. */ enum bfd_flavour flavour; /* The bfd_arch value. */ @@ -155,6 +154,12 @@ typedef struct disassemble_info /* Endianness of code, for mixed-endian situations such as ARM BE8. */ enum bfd_endian endian_code; + /* Optional abfd pointer. In some contexts it might be undefined (NULL). */ + bfd *abfd; + /* Get object bfd for given address. In some contexts obfd might be + undefined (NULL). */ + bfd *(*get_obfd_for_addr_func) (bfd_vma, struct disassemble_info*); + /* Some targets need information about the current section to accurately display insns. If this is NULL, the target disassembler function will have to make its best guess. */ @@ -363,6 +368,8 @@ typedef struct typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *); /* Disassemblers used out side of opcodes library. */ +extern int print_insn_arc (bfd_vma, disassemble_info *); +extern int print_insn_cris (bfd_vma, disassemble_info *); extern int print_insn_m32c (bfd_vma, disassemble_info *); extern int print_insn_mep (bfd_vma, disassemble_info *); extern int print_insn_s12z (bfd_vma, disassemble_info *); @@ -370,13 +377,11 @@ extern int print_insn_sh (bfd_vma, disassemble_info *); extern int print_insn_sparc (bfd_vma, disassemble_info *); extern int print_insn_rx (bfd_vma, disassemble_info *); extern int print_insn_rl78 (bfd_vma, disassemble_info *); +extern int print_insn_rl78_default (bfd_vma, disassemble_info *); extern int print_insn_rl78_g10 (bfd_vma, disassemble_info *); extern int print_insn_rl78_g13 (bfd_vma, disassemble_info *); extern int print_insn_rl78_g14 (bfd_vma, disassemble_info *); -extern disassembler_ftype arc_get_disassembler (bfd *); -extern disassembler_ftype cris_get_disassembler (bfd *); - extern void print_aarch64_disassembler_options (FILE *); extern void print_i386_disassembler_options (FILE *); extern void print_mips_disassembler_options (FILE *); @@ -409,8 +414,7 @@ extern const disasm_options_and_args_t *disassembler_options_s390 (void); endian if BIG is true), bfd_mach value MACH, and ABFD, if that support is available. ABFD may be NULL. */ extern disassembler_ftype disassembler (enum bfd_architecture arc, - bool big, unsigned long mach, - bfd *abfd); + bool big, unsigned long mach); /* Amend the disassemble_info structure as necessary for the target architecture. Should only be called after initialising the info->arch field. */ diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c index 16fbc8ab007..0c8b13bcc63 100644 --- a/opcodes/arc-dis.c +++ b/opcodes/arc-dis.c @@ -936,7 +936,7 @@ arc_opcode_to_insn_type (const struct arc_opcode *opcode) /* Disassemble ARC instructions. */ -static int +int print_insn_arc (bfd_vma memaddr, struct disassemble_info *info) { @@ -956,6 +956,17 @@ print_insn_arc (bfd_vma memaddr, struct arc_disassemble_info *arc_infop; bool rpcl = false, rset = false; + /* BFD my be absent, if opcodes is invoked from the debugger that + has connected to remote target and doesn't have an ELF file. */ + if (info->abfd != NULL) + { + /* Read the extension insns and registers, if any. */ + build_ARC_extmap (info->abfd); +#ifdef DEBUG + dump_ARC_extmap (); +#endif + } + if (info->disassembler_options) { parse_disassembler_options (info->disassembler_options); @@ -1451,24 +1462,6 @@ print_insn_arc (bfd_vma memaddr, return insn_len; } - -disassembler_ftype -arc_get_disassembler (bfd *abfd) -{ - /* BFD my be absent, if opcodes is invoked from the debugger that - has connected to remote target and doesn't have an ELF file. */ - if (abfd != NULL) - { - /* Read the extension insns and registers, if any. */ - build_ARC_extmap (abfd); -#ifdef DEBUG - dump_ARC_extmap (); -#endif - } - - return print_insn_arc; -} - /* Indices into option argument vector for options that do require an argument. Use ARC_OPTION_ARG_NONE for options that don't expect an argument. */ diff --git a/opcodes/cris-dis.c b/opcodes/cris-dis.c index ef7e7a65882..52e2eee59bb 100644 --- a/opcodes/cris-dis.c +++ b/opcodes/cris-dis.c @@ -1637,7 +1637,7 @@ print_insn_crisv10_v32_without_register_prefix (bfd_vma vma, FIXME: We should improve the solution to avoid the multitude of functions seen above. */ -disassembler_ftype +static disassembler_ftype cris_get_disassembler (bfd *abfd) { /* If there's no bfd in sight, we return what is valid as input in all @@ -1665,6 +1665,13 @@ cris_get_disassembler (bfd *abfd) return print_insn_cris_without_register_prefix; } + +int +print_insn_cris (bfd_vma vma, disassemble_info *info) +{ + return cris_get_disassembler(info->abfd)(vma, info); +} + /* Local variables: eval: (c-set-style "gnu") indent-tabs-mode: t diff --git a/opcodes/csky-dis.c b/opcodes/csky-dis.c index e9635bcf4be..ea7f7ab4537 100644 --- a/opcodes/csky-dis.c +++ b/opcodes/csky-dis.c @@ -234,34 +234,6 @@ csky_symbol_is_valid (asymbol *sym, return name && *name != '$'; } -disassembler_ftype -csky_get_disassembler (bfd *abfd) -{ - obj_attribute *attr; - const char *sec_name = NULL; - if (!abfd || bfd_get_flavour (abfd) != bfd_target_elf_flavour) - dis_info.isa = CSKY_DEFAULT_ISA; - else - { - mach_flag = elf_elfheader (abfd)->e_flags; - - sec_name = get_elf_backend_data (abfd)->obj_attrs_section; - /* Skip any input that hasn't attribute section. - This enables to link object files without attribute section with - any others. */ - if (bfd_get_section_by_name (abfd, sec_name) != NULL) - { - attr = elf_known_obj_attributes_proc (abfd); - dis_info.isa = attr[Tag_CSKY_ISA_EXT_FLAGS].i; - dis_info.isa <<= 32; - dis_info.isa |= attr[Tag_CSKY_ISA_FLAGS].i; - } - else - dis_info.isa = CSKY_DEFAULT_ISA; - } - - return print_insn_csky; -} /* Parse the string of disassembler options. */ static void @@ -1048,6 +1020,8 @@ print_insn_csky (bfd_vma memaddr, struct disassemble_info *info) int is_data = false; void (*printer) (bfd_vma, struct disassemble_info *, long); unsigned int size = 4; + obj_attribute *attr; + const char *sec_name = NULL; memset (str, 0, sizeof (str)); info->bytes_per_chunk = 0; @@ -1056,6 +1030,30 @@ print_insn_csky (bfd_vma memaddr, struct disassemble_info *info) dis_info.info = info; dis_info.need_output_symbol = 0; + /* TODO: Evaluate if it would be better to use + info->get_obfd_for_addr_func() to detect extensions in disassembled + object file and not in abfd. */ + if (!info->abfd || bfd_get_flavour (info->abfd) != bfd_target_elf_flavour) + dis_info.isa = CSKY_DEFAULT_ISA; + else + { + mach_flag = elf_elfheader (info->abfd)->e_flags; + + sec_name = get_elf_backend_data (info->abfd)->obj_attrs_section; + /* Skip any input that hasn't attribute section. + This enables to link object files without attribute section with + any others. */ + if (bfd_get_section_by_name (info->abfd, sec_name) != NULL) + { + attr = elf_known_obj_attributes_proc (info->abfd); + dis_info.isa = attr[Tag_CSKY_ISA_EXT_FLAGS].i; + dis_info.isa <<= 32; + dis_info.isa |= attr[Tag_CSKY_ISA_FLAGS].i; + } + else + dis_info.isa = CSKY_DEFAULT_ISA; + } + if (info->disassembler_options) { parse_csky_dis_options (info->disassembler_options); diff --git a/opcodes/dis-init.c b/opcodes/dis-init.c index 66c4cac5b6a..d531ab1c33c 100644 --- a/opcodes/dis-init.c +++ b/opcodes/dis-init.c @@ -23,6 +23,14 @@ #include "dis-asm.h" #include "bfd.h" +static bfd *get_obfd_for_addr_default(bfd_vma memaddr ATTRIBUTE_UNUSED, + struct disassemble_info* info) +{ + /* By default use abfd. Mind that depending on the context, it might be + undefined (NULL). */ + return info->abfd; +} + void init_disassemble_info (struct disassemble_info *info, void *stream, fprintf_ftype fprintf_func, @@ -34,6 +42,8 @@ init_disassemble_info (struct disassemble_info *info, void *stream, info->arch = bfd_arch_unknown; info->endian = BFD_ENDIAN_UNKNOWN; info->endian_code = info->endian; + info->abfd = NULL; + info->get_obfd_for_addr_func = get_obfd_for_addr_default; info->octets_per_byte = 1; info->fprintf_func = fprintf_func; info->fprintf_styled_func = fprintf_styled_func; @@ -46,4 +56,3 @@ init_disassemble_info (struct disassemble_info *info, void *stream, info->display_endian = BFD_ENDIAN_UNKNOWN; info->created_styled_output = false; } - diff --git a/opcodes/disassemble.c b/opcodes/disassemble.c index 733a0c07aa6..2c1f011c9bb 100644 --- a/opcodes/disassemble.c +++ b/opcodes/disassemble.c @@ -111,8 +111,7 @@ disassembler_ftype disassembler (enum bfd_architecture a, bool big ATTRIBUTE_UNUSED, - unsigned long mach ATTRIBUTE_UNUSED, - bfd *abfd ATTRIBUTE_UNUSED) + unsigned long mach ATTRIBUTE_UNUSED) { disassembler_ftype disassemble; @@ -132,7 +131,7 @@ disassembler (enum bfd_architecture a, #endif #ifdef ARCH_arc case bfd_arch_arc: - disassemble = arc_get_disassembler (abfd); + disassemble = print_insn_arc; break; #endif #ifdef ARCH_arm @@ -160,7 +159,7 @@ disassembler (enum bfd_architecture a, #endif #ifdef ARCH_cris case bfd_arch_cris: - disassemble = cris_get_disassembler (abfd); + disassemble = print_insn_cris; break; #endif #ifdef ARCH_crx @@ -170,7 +169,7 @@ disassembler (enum bfd_architecture a, #endif #ifdef ARCH_csky case bfd_arch_csky: - disassemble = csky_get_disassembler (abfd); + disassemble = print_insn_csky; break; #endif @@ -382,12 +381,12 @@ disassembler (enum bfd_architecture a, #endif #ifdef ARCH_riscv case bfd_arch_riscv: - disassemble = riscv_get_disassembler (abfd); + disassemble = print_insn_riscv; break; #endif #ifdef ARCH_rl78 case bfd_arch_rl78: - disassemble = rl78_get_disassembler (abfd); + disassemble = print_insn_rl78; break; #endif #ifdef ARCH_rx diff --git a/opcodes/disassemble.h b/opcodes/disassemble.h index 24a2a65ce7d..1963b04374a 100644 --- a/opcodes/disassemble.h +++ b/opcodes/disassemble.h @@ -23,6 +23,7 @@ extern int print_insn_aarch64 (bfd_vma, disassemble_info *); extern int print_insn_alpha (bfd_vma, disassemble_info *); +extern int print_insn_arc (bfd_vma, disassemble_info *); extern int print_insn_avr (bfd_vma, disassemble_info *); extern int print_insn_bfin (bfd_vma, disassemble_info *); extern int print_insn_big_arm (bfd_vma, disassemble_info *); @@ -30,6 +31,7 @@ extern int print_insn_big_mips (bfd_vma, disassemble_info *); extern int print_insn_big_powerpc (bfd_vma, disassemble_info *); extern int print_insn_big_score (bfd_vma, disassemble_info *); extern int print_insn_cr16 (bfd_vma, disassemble_info *); +extern int print_insn_cris (bfd_vma, disassemble_info *); extern int print_insn_crx (bfd_vma, disassemble_info *); extern int print_insn_csky (bfd_vma, disassemble_info *); extern int print_insn_d10v (bfd_vma, disassemble_info *); @@ -51,6 +53,7 @@ extern int print_insn_ia64 (bfd_vma, disassemble_info *); extern int print_insn_ip2k (bfd_vma, disassemble_info *); extern int print_insn_iq2000 (bfd_vma, disassemble_info *); extern int print_insn_riscv (bfd_vma, disassemble_info *); +extern int print_insn_rl78 (bfd_vma, disassemble_info *); extern int print_insn_kvx (bfd_vma, disassemble_info *); extern int print_insn_little_arm (bfd_vma, disassemble_info *); extern int print_insn_little_mips (bfd_vma, disassemble_info *); @@ -100,10 +103,6 @@ extern int print_insn_z8001 (bfd_vma, disassemble_info *); extern int print_insn_z8002 (bfd_vma, disassemble_info *); extern int print_insn_loongarch (bfd_vma, disassemble_info *); -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); diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index c1212b14a05..f9cf9c5eed0 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -1370,6 +1370,7 @@ 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"; if (info->disassembler_options != NULL) { @@ -1380,6 +1381,26 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) else if (riscv_gpr_names == NULL) set_default_riscv_dis_options (); + if (info->abfd && bfd_get_flavour (info->abfd) == bfd_target_elf_flavour) + { + const char *sec_name = get_elf_backend_data (info->abfd)->obj_attrs_section; + if (bfd_get_section_by_name (info->abfd, sec_name) != NULL) + { + obj_attribute *attr = elf_known_obj_attributes_proc (info->abfd); + 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); + if (info->private_data == NULL && !riscv_init_disasm_info (info)) return -1; @@ -1421,33 +1442,6 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) return (*riscv_disassembler) (memaddr, insn, packet, info); } -disassembler_ftype -riscv_get_disassembler (bfd *abfd) -{ - const char *default_arch = "rv64gc"; - - if (abfd && bfd_get_flavour (abfd) == bfd_target_elf_flavour) - { - const char *sec_name = get_elf_backend_data (abfd)->obj_attrs_section; - if (bfd_get_section_by_name (abfd, sec_name) != NULL) - { - obj_attribute *attr = elf_known_obj_attributes_proc (abfd); - 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); - return print_insn_riscv; -} - /* Prevent use of the fake labels that are generated as part of the DWARF and for relaxable relocations in the assembler. */ diff --git a/opcodes/rl78-dis.c b/opcodes/rl78-dis.c index a0afe6cd6fe..d2bba6690b3 100644 --- a/opcodes/rl78-dis.c +++ b/opcodes/rl78-dis.c @@ -380,7 +380,7 @@ print_insn_rl78_common (bfd_vma addr, disassemble_info * dis, RL78_Dis_Isa isa) } int -print_insn_rl78 (bfd_vma addr, disassemble_info * dis) +print_insn_rl78_default (bfd_vma addr, disassemble_info * dis) { return print_insn_rl78_common (addr, dis, RL78_ISA_DEFAULT); } @@ -403,7 +403,7 @@ print_insn_rl78_g14 (bfd_vma addr, disassemble_info * dis) return print_insn_rl78_common (addr, dis, RL78_ISA_G14); } -disassembler_ftype +static disassembler_ftype rl78_get_disassembler (bfd *abfd) { int cpu = E_FLAG_RL78_ANY_CPU; @@ -420,6 +420,12 @@ rl78_get_disassembler (bfd *abfd) case E_FLAG_RL78_G14: return print_insn_rl78_g14; default: - return print_insn_rl78; + return print_insn_rl78_default; } } + +int +print_insn_rl78 (bfd_vma addr, disassemble_info * dis) +{ + return rl78_get_disassembler(dis->abfd)(addr, dis); +} diff --git a/sim/arm/wrapper.c b/sim/arm/wrapper.c index 0a9986d9785..8f0def9326b 100644 --- a/sim/arm/wrapper.c +++ b/sim/arm/wrapper.c @@ -114,7 +114,7 @@ print_insn (ARMword instr) opbuf[0] = 0; info.application_data = & instr; - disassemble_fn = disassembler (bfd_arch_arm, 0, 0, NULL); + disassemble_fn = disassembler (bfd_arch_arm, 0, 0); size = disassemble_fn (0, & info); fprintf (stderr, " %*s\n", size, opbuf); } @@ -344,6 +344,7 @@ sim_create_inferior (SIM_DESC sd ATTRIBUTE_UNUSED, info.endian_code = BFD_ENDIAN_LITTLE; if (info.mach == 0) info.arch = bfd_arch_arm; + info.abfd = abfd; disassemble_init_for_target (& info); if (argv != NULL) diff --git a/sim/common/sim-trace.c b/sim/common/sim-trace.c index f5a8234adf3..737c5779b1c 100644 --- a/sim/common/sim-trace.c +++ b/sim/common/sim-trace.c @@ -932,12 +932,12 @@ trace_disasm (SIM_DESC sd, sim_cpu *cpu, address_word addr) trace_data->disassembler = disassembler (bfd_get_arch (trace_data->dis_bfd), bfd_big_endian (trace_data->dis_bfd), - bfd_get_mach (trace_data->dis_bfd), - trace_data->dis_bfd); + bfd_get_mach (trace_data->dis_bfd)); INIT_DISASSEMBLE_INFO (*info, cpu, dis_printf, dis_styled_printf); info->read_memory_func = dis_read; info->arch = bfd_get_arch (bfd); info->mach = bfd_get_mach (bfd); + info->abfd = bfd; disassemble_init_for_target (info); } diff --git a/sim/cris/sim-if.c b/sim/cris/sim-if.c index f3a12e136c2..2b24653a30d 100644 --- a/sim/cris/sim-if.c +++ b/sim/cris/sim-if.c @@ -321,7 +321,7 @@ cris_set_section_offset_iterator (bfd *abfd, asection *s, void *vp) if ((bfd_section_flags (s) & SEC_ALLOC)) { bfd_vma vma = bfd_section_vma (s); - + bfd_set_section_vma (s, vma + offset); } @@ -429,7 +429,7 @@ cris_get_progbounds (struct bfd *abfd, struct progbounds *pbp) if (phdr[i].p_memsz > phdr[i].p_filesz && phdr[i].p_paddr + phdr[i].p_filesz < pbp->start_nonloadmem) pbp->start_nonloadmem = phdr[i].p_paddr + phdr[i].p_filesz; - } + } } /* Parameter communication by static variables, hmm... Oh well, for @@ -1012,7 +1012,6 @@ cris_disassemble_insn (SIM_CPU *cpu, const ARGBUF *abuf ATTRIBUTE_UNUSED, IADDR pc, char *buf) { - disassembler_ftype pinsn; struct disassemble_info disasm_info; SFILE sfile; SIM_DESC sd = CPU_STATE (cpu); @@ -1022,9 +1021,9 @@ cris_disassemble_insn (SIM_CPU *cpu, (fprintf_ftype) sim_disasm_sprintf, (fprintf_styled_ftype) sim_disasm_styled_sprintf); disasm_info.endian = BFD_ENDIAN_LITTLE; + disasm_info.abfd = STATE_PROG_BFD (sd); disasm_info.read_memory_func = sim_disasm_read_memory; disasm_info.memory_error_func = sim_disasm_perror_memory; disasm_info.application_data = cpu; - pinsn = cris_get_disassembler (STATE_PROG_BFD (sd)); - (*pinsn) (pc, &disasm_info); + print_insn_cris (pc, &disasm_info); } diff --git a/sim/m32c/trace.c b/sim/m32c/trace.c index b7725e45712..aee89354474 100644 --- a/sim/m32c/trace.c +++ b/sim/m32c/trace.c @@ -231,6 +231,7 @@ sim_disasm_one (void) info.arch = bfd_arch_m32c; info.mach = default_machine; } + info.abfd = current_bfd; disassemble_init_for_target (&info); storage = bfd_get_symtab_upper_bound (current_bfd); diff --git a/sim/rl78/trace.c b/sim/rl78/trace.c index 592d1d69601..e303c0dbac6 100644 --- a/sim/rl78/trace.c +++ b/sim/rl78/trace.c @@ -223,6 +223,7 @@ sim_get_current_source_location (const char ** pfilename, info.mach = bfd_get_mach (current_bfd); if (info.mach == 0) info.arch = bfd_arch_rl78; + info.abfd = current_bfd; disassemble_init_for_target (& info); @@ -284,7 +285,7 @@ sim_disasm_one (void) else if (g13_multiply) rl78_disasm_fn = print_insn_rl78_g13; else - rl78_disasm_fn = print_insn_rl78; + rl78_disasm_fn = print_insn_rl78_default; } if (filename && functionname && lineno) diff --git a/sim/rx/trace.c b/sim/rx/trace.c index 443a990c669..e83c61f3017 100644 --- a/sim/rx/trace.c +++ b/sim/rx/trace.c @@ -227,6 +227,7 @@ sim_get_current_source_location (const char ** pfilename, info.mach = bfd_get_mach (current_bfd); if (info.mach == 0) info.arch = bfd_arch_rx; + info.abfd = current_bfd; disassemble_init_for_target (& info); From patchwork Fri Dec 13 17:25:44 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Marek Pikula X-Patchwork-Id: 103095 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 920A83858C35 for ; Fri, 13 Dec 2024 17:29:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 920A83858C35 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=r2RYHIuY X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by sourceware.org (Postfix) with ESMTPS id 176853858C2B for ; Fri, 13 Dec 2024 17:26:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 176853858C2B 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 176853858C2B 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=1734110814; cv=none; b=Ymm7vTmO+6GHBsE7YilAwymPT1BHjr9tNqAvtyqDBRi3ufLzx/qfrC2bhDNZNeX5f7wdz0GBIWfIKUeLEefpg+2C7rDdfcVkvRKRrJ7d8XLxjAuzCP22+8FLuyaQ4rd7oAoML5N12vJo6kMpO+UtrRjPs63PcWywq43bN50CZd8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1734110814; c=relaxed/simple; bh=mE30MWkTAKT+9kvRE0RNZa2w2wa3jZLXJPCrXWg+VoE=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=JCQMBMRaAja2irLvfnRBFlbEKSqtX5fD1o5bIsD1JeTc9mIwVtcrK8uKSx6rIetuJD1TrTrPCu9IlYEABjwkaH1R13zfL6nAeC0ajqIh3788UMNkQ0L1V1oY9yO+8KC1CQk6gK2Hayc6glMT213fFHS1rWJW1SUYBmsfXnknnfw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 176853858C2B Received: from eucas1p2.samsung.com (unknown [182.198.249.207]) by mailout1.w1.samsung.com (KnoxPortal) with ESMTP id 20241213172653euoutp0146be0eb74ba288ea2bd105b518d704f5~QzJjWewtX1446414464euoutp01C for ; Fri, 13 Dec 2024 17:26:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 mailout1.w1.samsung.com 20241213172653euoutp0146be0eb74ba288ea2bd105b518d704f5~QzJjWewtX1446414464euoutp01C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=samsung.com; s=mail20170921; t=1734110813; bh=kdnQBCiA0ermMZzs0ZyaGLhpkyrZ+KgInFuQFNc8Kt4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r2RYHIuYNGAm4tB/s/PLXDiJBEySNL7I+2cpnaic3/wlnknqa1Tu4N8pH3JNjgQk2 NXdg1Fub2OB9jgI6Fqk4atas3Jgbqczj44zJsZ6kNSziDnDnN5LFLIVsNTPKalFHyb Xb2bf8Blj8wUZfGNQ7hVp6bXooA5qy7o67OOhAp4= Received: from eusmges1new.samsung.com (unknown [203.254.199.242]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20241213172652eucas1p2fa78c1aff3556ea10522b852bf9b03ac~QzJiUeHuD0645706457eucas1p2T; Fri, 13 Dec 2024 17:26:52 +0000 (GMT) Received: from eucas1p2.samsung.com ( [182.198.249.207]) by eusmges1new.samsung.com (EUCPMTA) with SMTP id 39.8E.20821.C5E6C576; Fri, 13 Dec 2024 17:26:52 +0000 (GMT) Received: from eusmtrp2.samsung.com (unknown [182.198.249.139]) by eucas1p1.samsung.com (KnoxPortal) with ESMTPA id 20241213172651eucas1p1441c0c84eefb0f5bab24c3ea3d2d3a0a~QzJiAE6Qp2964429644eucas1p1O; Fri, 13 Dec 2024 17:26:51 +0000 (GMT) Received: from eusmgms2.samsung.com (unknown [182.198.249.180]) by eusmtrp2.samsung.com (KnoxPortal) with ESMTP id 20241213172651eusmtrp226b37cffde2c6096b767cb4f01d57fd5~QzJh6VsJC2209822098eusmtrp2v; Fri, 13 Dec 2024 17:26:51 +0000 (GMT) X-AuditID: cbfec7f2-b09c370000005155-c0-675c6e5c0f6a Received: from eusmtip2.samsung.com ( [203.254.199.222]) by eusmgms2.samsung.com (EUCPMTA) with SMTP id 2B.EF.19654.B5E6C576; Fri, 13 Dec 2024 17:26:51 +0000 (GMT) Received: from localhost.localdomain (unknown [106.210.135.145]) by eusmtip2.samsung.com (KnoxPortal) with ESMTPA id 20241213172651eusmtip24377fec98912804e0a26d9d323c24f55~QzJhUn9ro2108221082eusmtip2A; Fri, 13 Dec 2024 17:26:51 +0000 (GMT) From: =?utf-8?q?Marek_Piku=C5=82a?= To: binutils@sourceware.org Cc: gdb-patches@sourceware.org, k.lewandowsk@samsung.com, s.rutka@samsung.com, cgen@sourceware.org, =?utf-8?q?Marek_Piku=C5=82a?= Subject: [PATCH 2/2] RISC-V: Use obfd for disassembly instead of abfd Date: Fri, 13 Dec 2024 18:25:44 +0100 Message-ID: <20241213172637.1191157-3-m.pikula@partner.samsung.com> X-Mailer: git-send-email 2.47.0 In-Reply-To: <20241213172637.1191157-1-m.pikula@partner.samsung.com> MIME-Version: 1.0 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrPIsWRmVeSWpSXmKPExsWy7djP87oxeTHpBp3tPBYfp+1htFg2H0j0 3P7CbNH4aS6zxd95U9ksXnUvZnNg8zj4bg+TR9+WVYwe23+7BTBHcdmkpOZklqUW6dslcGWs OxtQsEmw4nTXbZYGxuV8XYycHBICJhIvGyYydzFycQgJrGCUWP7lOJTzhVHi2OcmJgjnM6PE zm/bgRwOsJa/h4Mh4ssZJXru/IXq+Moose51ByPIXDYBF4lD24+ygdgiAtISTTP6WECKmAWW MUo0f/0DViQs4Cqx++EhVpCpLAKqEo/viIGEeQWcJdbun8YIcZ+8xPk3/8HmcALNfPm8kQmi RlDi5MwnLCA2M1BN89bZYEdICOzgkLiwaCsjxKUuEktPxkDMEZZ4dXwLO4QtI/F/53wmCDtb YuqnZ6wQdonEhLaZUDXWEnfO/WIDGcMsoCmxfpc+RNhRYv+BX9Bw4JO48VYQ4gI+iUnbpjND hHklOtqEIKq1JK48/8ECYUtIfP/9GuopD4mTj+6xT2BUnIXkl1lIfpmFsHcBI/MqRvHU0uLc 9NRiw7zUcr3ixNzi0rx0veT83E2MwDRy+t/xTzsY5776qHeIkYmD8RCjBAezkgjvDfvIdCHe lMTKqtSi/Pii0pzU4kOM0hwsSuK8qinyqUIC6YklqdmpqQWpRTBZJg5OqQamOL36lelLPy6Y z12jd1xg45OnD6wz74mULq+wfVi+/+zkmh86VV8+sia8aOYpjs7ZbiagdcV1DsfqYC9mAZko WdZ1Wl3CInrvLu/0vs9/5IzF5fjMuMglkS/3PXs9O/3J21OLr/Kf2nd49fIZrg39HNZHVkhK 3Xm8OkJ3ZQPzlKbfF9KnNt5hV5h+MsV68uoYQ4Hzlyfr6f01eN//KPvSexbtFC0/9ZstM6sL br8RPPl3m5TWHedrVmdcJ7dYnp+b2Lruz5tnL/ouSzyTOb5145pH/HuW9nDcmiKe93COpNn1 RsabPKkFRmt0V/RFPsgO/vrkWV5sx69O/rq/8xyTt9q8/CaQefD1kVfsMl/bXymxFGckGmox FxUnAgCScaZBkgMAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmphkeLIzCtJLcpLzFFi42I5/e/4Pd3ovJh0gzPL9Cw+TtvDaLFsPpDo uf2F2aLx01xmi7/zprJZvOpezObA5nHw3R4mj74tqxg9tv92C2CO0rMpyi8tSVXIyC8usVWK NrQw0jO0tNAzMrHUMzQ2j7UyMlXSt7NJSc3JLEst0rdL0MtYdzagYJNgxemu2ywNjMv5uhg5 OCQETCT+Hg7uYuTkEBJYyiix95AHiC0hICHx7dsLdghbWOLPtS62LkYuoJrPjBJ73mxmAkmw CbhIHNp+lA3EFhGQlmia0ccCUsQssIpRYsfbJrAiYQFXid0PD7GCLGMRUJV4fEcMJMwr4Cyx dv80RogF8hLn3/wHm8MJNPPl80YmiIOcJdr6PzJB1AtKnJz5hAVkDLOAusT6eUIgYWag1uat s5knMArOQlI1C6FqFpKqBYzMqxhFUkuLc9Nzi430ihNzi0vz0vWS83M3MQKjY9uxn1t2MK58 9VHvECMTB+MhRgkOZiUR3hv2kelCvCmJlVWpRfnxRaU5qcWHGE2BnpnILCWanA+Mz7ySeEMz A1NDEzNLA1NLM2MlcV62K+fThATSE0tSs1NTC1KLYPqYODilGph04jv7tyz78v+U8RJVwXUp WvO3GdgYdj9eKXfyf37m5YflMuJiX38JdaZ4CbRHOp7LPv3C9pmkb2DVi+YPIqpiUW7Nkypv N8R9vrRzT4dX5J4rmro/dmexyZTcC/w5/3Nc80Hj5o/TwlY/Xv+u1tUg/sdThX18c1Qn7yxK +Xmm9GPuudM3Ls168MnIv+hGTnl8ejtPcGqon8PkLLb0h+deJuc5C0YqvjBeJx3iKHTv8sey kxMfcBp/TK89c/vnMucpwktmVa9by/5Me+2mAusj1stizU8XpJb+nuXx5HMI51f9mhtRVxYJ XHHaFynCwV7HxyenPOn/0XUx4mXvfx95ccOw0XKWx7/sjjkfp/crsRRnJBpqMRcVJwIANr1A uhcDAAA= X-CMS-MailID: 20241213172651eucas1p1441c0c84eefb0f5bab24c3ea3d2d3a0a X-Msg-Generator: CA X-RootMTR: 20241213172651eucas1p1441c0c84eefb0f5bab24c3ea3d2d3a0a X-EPHeader: CA CMS-TYPE: 201P X-CMS-RootMailID: 20241213172651eucas1p1441c0c84eefb0f5bab24c3ea3d2d3a0a References: <20241213172637.1191157-1-m.pikula@partner.samsung.com> X-Spam-Status: No, score=-17.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=unavailable 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.30 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org In case the disassembled ELF is built for a different subset of ISA extensions than the target binary (abfd) the disassembly might be different. For example, a binary might be built for a general `rv64gc` target, but a library that the binary loads might be built for `rv64gcv`. In that case, when only abfd provides information to disassembler, the vector instructions don't get disassembled correctly (and are shown as generic `.insn`). With this change, the disassembler checks which object file is in scope. Thus, it adjusts the output to the ISA subset present in `Tag_RISCV_arch` from the object file in the current scope. Signed-off-by: Marek Pikuła --- opcodes/riscv-dis.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c index f9cf9c5eed0..f5c2329cd8b 100644 --- a/opcodes/riscv-dis.c +++ b/opcodes/riscv-dis.c @@ -1371,6 +1371,7 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) 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) { @@ -1381,12 +1382,12 @@ print_insn_riscv (bfd_vma memaddr, struct disassemble_info *info) else if (riscv_gpr_names == NULL) set_default_riscv_dis_options (); - if (info->abfd && bfd_get_flavour (info->abfd) == bfd_target_elf_flavour) + if (obfd && bfd_get_flavour (obfd) == bfd_target_elf_flavour) { - const char *sec_name = get_elf_backend_data (info->abfd)->obj_attrs_section; - if (bfd_get_section_by_name (info->abfd, sec_name) != NULL) + 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 (info->abfd); + 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;