| Message ID | 20260627104555.331493-1-jiawei@iscas.ac.cn |
|---|---|
| Headers |
Return-Path: <binutils-bounces~patchwork=sourceware.org@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1D31A4BA23CC for <patchwork@sourceware.org>; Sat, 27 Jun 2026 10:47:05 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1D31A4BA23CC X-Original-To: binutils@sourceware.org Delivered-To: binutils@sourceware.org Received: from cstnet.cn (smtp21.cstnet.cn [159.226.251.21]) by sourceware.org (Postfix) with ESMTPS id B63EE4BA2E30 for <binutils@sourceware.org>; Sat, 27 Jun 2026 10:46:26 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B63EE4BA2E30 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=iscas.ac.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=iscas.ac.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org B63EE4BA2E30 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.21 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782557187; cv=none; b=AOlWMel1xUSHk6/7MTNbAvo1V0spCJo9nt2V2w7THfoWagItt61v8EUrsWu6E/NHzmeef5U3Vhn3ZEKNASxguFFFoVuekgjc3Uupoci5eMI/C6mEbweSz5rFq/VBpnL4qwqJiByjgqPqeqxMlQ8fTVfbgktEH9LMQBBuzC2m8aM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1782557187; c=relaxed/simple; bh=0KQsGxP3ttNHe6hk/tv9p9d+xlrdj1StEEZKRm2LOnk=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=GFExTr+9jKHi4gRWD6k7XqValp9FGHoOf8ezT1bWUS/DuS0EYe0Z4II29mjYeJ8fsO1FPEjCzalAjhvcGAUsfnbjZdpybHjAVOLvXYb52BsJIdot6S3u92vtqgWlDmgYdTLtA+DhJ2eW+g01W6sVjjePcEui/82VvGXQ1PssEZM= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B63EE4BA2E30 Received: from localhost.localdomain (unknown [157.0.80.168]) by APP-01 (Coremail) with SMTP id qwCowACXMcr6qT9qMtWNAw--.25411S2; Sat, 27 Jun 2026 18:46:19 +0800 (CST) From: Jiawei <jiawei@iscas.ac.cn> To: binutils@sourceware.org Cc: nelson@rivosinc.com, jbeulich@suse.com, jeremy.bennett@embecosm.com, kito.cheng@sifive.com, mary.bennett@embecosm.com, nandni.jamnadas@embecosm.com, charlie.keaney@embecosm.com, hau.hsu@sifive.com, jerry.zhangjian@sifive.com, sinan.lin@linux.alibaba.com, Jiawei <jiawei@iscas.ac.cn> Subject: [RFC PATCH 0/5] RISC-V: Add Zcmt table-jump relaxation support Date: Sat, 27 Jun 2026 18:45:50 +0800 Message-ID: <20260627104555.331493-1-jiawei@iscas.ac.cn> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CM-TRANSID: qwCowACXMcr6qT9qMtWNAw--.25411S2 X-Coremail-Antispam: 1UD129KBjvAXoW3CryktF4DCr13WFyrXryxZrb_yoW8JFyUto WDJa1Yq3Z8Zr42yF15XrWkJrs8GF18KF4UXws0krWkurn09a4rGFW0vwn8A3sxZr12kryk WF98AwnF9F18Kw17n29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYZ7AC8VAFwI0_Gr0_Xr1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2 x7M28EF7xvwVC0I7IYx2IY67AKxVW8JVW5JwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8 JVWxJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oV Cq3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0 I7IYx2IY67AKxVWUJVWUGwAv7VCY1x0262k0Y48FwI0_Jr0_Gr1lYx0Ex4A2jsIE14v26r 1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAq YI8I648v4I1lFIxGxcIEc7CjxVA2Y2ka0xkIwI1lc7CjxVAaw2AFwI0_Jw0_GFyl42xK82 IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC2 0s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r43MIIYrxkI7VAKI48JMI IF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r4j6F4UMIIF 0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87 Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjfU5fHUDUUUU X-Originating-IP: [157.0.80.168] X-CM-SenderInfo: 5mld4v3l6l2u1dvotugofq/1tbiBgcLAGo-j-0blQABsi X-Spam-Status: No, score=-5.2 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Binutils mailing list <binutils.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/binutils>, <mailto:binutils-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/binutils/> List-Post: <mailto:binutils@sourceware.org> List-Help: <mailto:binutils-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/binutils>, <mailto:binutils-request@sourceware.org?subject=subscribe> Errors-To: binutils-bounces~patchwork=sourceware.org@sourceware.org |
| Series |
RISC-V: Add Zcmt table-jump relaxation support
|
|
Message
Jiawei
June 27, 2026, 10:45 a.m. UTC
This RFC series adds RISC-V Zcmt table-jump relaxation support to GNU ld. The optimization is default-off and must be requested with `--relax-zcmt`. The implementation follows a post-relaxation profitability model. It records the residual `R_RISCV_CALL`, `R_RISCV_CALL_PLT`, and `R_RISCV_JAL` opportunities that still have paired `R_RISCV_RELAX` relocations after ordinary RISC-V relaxation. It then ranks JT and JALT candidates separately, uses a deterministic prefix selection, accounts for the JVT payload cost, and emits no `.riscv.jvt` section if no positive-benefit table is selected. Runtime policy: - when a non-empty `.riscv.jvt` is emitted, the linker defines local `__jvt_base$` at the table base; - programs that execute `cm.jt`/`cm.jalt` remain responsible for initializing CSR `jvt` to `__jvt_base$` first; - when no profitable JVT is emitted, `__jvt_base$` is not defined; - generic startup code that unconditionally references `__jvt_base$` is not supported unless it arranges an optional reference or is linked only when a JVT is emitted. ISA/profile policy: - Zcmt relaxation is enabled only when output attributes explicitly support `zcmt`, `zca`, and `zicsr`; - output attributes containing `zcd` disable Zcmt relaxation because the encodings conflict. Scope: - non-position-independent executable links only; - PIC, PIE, and shared-object links are conservatively not relaxed; - no Linux ABI claim for automatic `jvt` initialization; Open questions: - Is the `__jvt_base$` emission policy acceptable for v1? - Is `R_RISCV_TABLE_JUMP` acceptable as an internal linker relocation? - Are `.riscv.jvt` section naming, flags, and 64-byte alignment suitable? - Should objdump present JVT entries as `jvt.jt[]`/`jvt.jalt[]`, or use a more conservative `.word`/`.dword` presentation? (Patch 4 is separable; if maintainers prefer, the linker relaxation support can be reviewed independently from the objdump JVT annotation.) - Is default-off `--relax-zcmt` the desired upstream user interface? Contributors: This RFC builds on earlier Zcmt table-jump relaxation work carried out with contributions and discussions from Embecosm, SiFive and ISCAS. Thanks to Jeremy Bennet, Kito Cheng, Mary Bennett, Nandni Jamnadas, Simon Cook, Charlie Keaney, Hau Hsu, Jerry Zhang Jian, Sinan Lin, Shihua Liao and Yulong Shi for the earlier work and feedback that helped shape this series. Since this upstream version has been substantially reworked, the commit authorship is limited to the current patch submission, while the earlier collaborative work is acknowledged here rather than carrying over historical authorship trailers. RISC-V: Add Zcmt table-jump relocation definitions RISC-V: Add Zcmt table-jump relaxation ld: Add RISC-V --relax-zcmt option RISC-V: Decode Zcmt JVT entries in objdump RISC-V: Add Zcmt table-jump linker tests bfd/elfnn-riscv.c | 1134 ++++++++++++++++- bfd/elfxx-riscv.c | 4 + bfd/elfxx-riscv.h | 21 + include/elf/riscv.h | 5 + include/opcode/riscv.h | 9 + ld/NEWS | 3 + ld/emultempl/riscvelf.em | 17 +- ld/gen-doc.texi | 2 +- ld/ld.texi | 35 + ld/ldlex.h | 2 + ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp | 50 + ld/testsuite/ld-riscv-elf/table-jump-addend.d | 18 + ld/testsuite/ld-riscv-elf/table-jump-addend.s | 21 + .../ld-riscv-elf/table-jump-base-collision.d | 4 + .../ld-riscv-elf/table-jump-base-collision.s | 18 + .../table-jump-base-local-collision.d | 4 + .../table-jump-base-local-collision.s | 17 + .../ld-riscv-elf/table-jump-be32-bytes.d | 10 + .../ld-riscv-elf/table-jump-be32-text.d | 13 + .../ld-riscv-elf/table-jump-be64-bytes.d | 10 + .../ld-riscv-elf/table-jump-be64-text.d | 13 + .../ld-riscv-elf/table-jump-benefit.d | 17 + .../ld-riscv-elf/table-jump-benefit.s | 51 + .../table-jump-default-jvt-relocs.d | 9 + .../table-jump-default-jvt-symbol.d | 10 + .../ld-riscv-elf/table-jump-default-jvt.d | 12 + .../ld-riscv-elf/table-jump-default-no-jvt.d | 15 + .../ld-riscv-elf/table-jump-dump-unknown.d | 25 + .../ld-riscv-elf/table-jump-emit-relocs.d | 9 + .../ld-riscv-elf/table-jump-equal-benefit.d | 18 + .../ld-riscv-elf/table-jump-equal-benefit.s | 19 + .../table-jump-gc-comdat-symbol.d | 9 + .../ld-riscv-elf/table-jump-gc-comdat.d | 11 + .../ld-riscv-elf/table-jump-gc-comdat.s | 18 + .../ld-riscv-elf/table-jump-gc-dead-symbol.d | 9 + .../ld-riscv-elf/table-jump-gc-dead.d | 11 + .../ld-riscv-elf/table-jump-gc-dead.s | 18 + ld/testsuite/ld-riscv-elf/table-jump-jalt.d | 18 + ld/testsuite/ld-riscv-elf/table-jump-jt.d | 23 + .../table-jump-multiple-local-sym-2.s | 12 + .../table-jump-multiple-local-sym.d | 16 + .../table-jump-multiple-local-sym.s | 18 + .../table-jump-no-benefit-jvt-ref.d | 4 + .../table-jump-no-benefit-jvt-ref.s | 16 + .../table-jump-no-benefit-section.d | 9 + .../table-jump-no-benefit-symbol.d | 9 + .../ld-riscv-elf/table-jump-no-benefit.s | 12 + .../ld-riscv-elf/table-jump-no-relax-zcmt.d | 17 + .../ld-riscv-elf/table-jump-no-relo-1.s | 7 + .../ld-riscv-elf/table-jump-no-relo-2.s | 12 + .../ld-riscv-elf/table-jump-no-relo.d | 16 + .../ld-riscv-elf/table-jump-no-zcmt.d | 16 + .../ld-riscv-elf/table-jump-no-zcmt.s | 16 + .../ld-riscv-elf/table-jump-norelax.d | 15 + .../ld-riscv-elf/table-jump-norelax.s | 17 + .../ld-riscv-elf/table-jump-overflow.d | 11 + .../ld-riscv-elf/table-jump-overflow.s | 49 + .../ld-riscv-elf/table-jump-pie-relocs.d | 9 + .../ld-riscv-elf/table-jump-pie-text.d | 9 + ld/testsuite/ld-riscv-elf/table-jump-pie.d | 9 + ld/testsuite/ld-riscv-elf/table-jump-pie.s | 13 + .../ld-riscv-elf/table-jump-relax-zcmt.d | 23 + ld/testsuite/ld-riscv-elf/table-jump-rv32.d | 15 + ld/testsuite/ld-riscv-elf/table-jump-rv32.s | 25 + .../ld-riscv-elf/table-jump-shared-relocs.d | 9 + .../ld-riscv-elf/table-jump-shared-symbol.d | 9 + .../ld-riscv-elf/table-jump-shared-text.d | 9 + ld/testsuite/ld-riscv-elf/table-jump-shared.d | 12 + ld/testsuite/ld-riscv-elf/table-jump-shared.s | 15 + .../ld-riscv-elf/table-jump-strip-symbol.d | 9 + .../ld-riscv-elf/table-jump-symbol-policy.d | 8 + .../ld-riscv-elf/table-jump-vma-lma.d | 16 + .../ld-riscv-elf/table-jump-vma-lma.ld | 10 + .../ld-riscv-elf/table-jump-vma-zero.d | 15 + .../ld-riscv-elf/table-jump-vma-zero.ld | 13 + .../ld-riscv-elf/table-jump-vma-zero.s | 14 + .../ld-riscv-elf/table-jump-zcd-conflict.d | 9 + .../ld-riscv-elf/table-jump-zcmt-no-zca.d | 9 + .../ld-riscv-elf/table-jump-zcmt-no-zca.s | 24 + .../ld-riscv-elf/table-jump-zcmt-no-zicsr.d | 9 + .../ld-riscv-elf/table-jump-zcmt-no-zicsr.s | 24 + ld/testsuite/ld-riscv-elf/table-jump.ld | 16 + ld/testsuite/ld-riscv-elf/table-jump.s | 46 + opcodes/riscv-dis.c | 164 ++- 84 files changed, 2478 insertions(+), 54 deletions(-) create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-addend.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-addend.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-base-collision.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-base-collision.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-base-local-collision.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-base-local-collision.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-be32-bytes.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-be32-text.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-be64-bytes.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-be64-text.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-benefit.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-benefit.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-default-jvt-relocs.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-default-jvt-symbol.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-default-jvt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-default-no-jvt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-dump-unknown.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-emit-relocs.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-equal-benefit.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-equal-benefit.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-gc-comdat-symbol.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-gc-comdat.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-gc-comdat.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-gc-dead-symbol.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-gc-dead.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-gc-dead.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-jalt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-jt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-multiple-local-sym-2.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-multiple-local-sym.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-multiple-local-sym.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-benefit-jvt-ref.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-benefit-jvt-ref.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-benefit-section.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-benefit-symbol.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-benefit.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-relax-zcmt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-relo-1.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-relo-2.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-relo.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-zcmt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-no-zcmt.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-norelax.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-norelax.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-overflow.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-overflow.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-pie-relocs.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-pie-text.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-pie.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-pie.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-relax-zcmt.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-rv32.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-rv32.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-shared-relocs.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-shared-symbol.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-shared-text.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-shared.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-shared.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-strip-symbol.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-symbol-policy.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-vma-lma.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-vma-lma.ld create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-vma-zero.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-vma-zero.ld create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-vma-zero.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-zcd-conflict.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-zcmt-no-zca.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-zcmt-no-zca.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-zcmt-no-zicsr.d create mode 100644 ld/testsuite/ld-riscv-elf/table-jump-zcmt-no-zicsr.s create mode 100644 ld/testsuite/ld-riscv-elf/table-jump.ld create mode 100644 ld/testsuite/ld-riscv-elf/table-jump.s