From: Sun Sunny Date: Thu, 4 Jul 2024 03:03:37 +0000 (+0000) Subject: RISC-V: Fix BFD_RELOC_RISCV_PCREL_LO12_S patch issue X-Git-Tag: binutils-2_43~200 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c83ea305e21e1363b62747984c1b7286cb7a2ca8;p=thirdparty%2Fbinutils-gdb.git RISC-V: Fix BFD_RELOC_RISCV_PCREL_LO12_S patch issue In commit dff565fcca8137954d6ad571ef39f6aec5c0429c, the fixups for PCREL_LO12_I and PCREL_LO12_S were mixed, so the "IMM" field were applied to incorrect position, this caused incorrect src registers to be encoded. gas/ * config/tc-riscv.c (md_apply_fix): Fix PCREL_LO12_S issue. * testsuite/gas/riscv/ixup-local.s: Updated for PCREL_LO12_S cases. * testsuite/gas/riscv/fixup-local-relax.d: Likewise. * testsuite/gas/riscv/fixup-local-norelax.d: Likewise. Signed-off-by: Jianwei Sun --- diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c index 5b9bfbdfa68..c09bd429bab 100644 --- a/gas/config/tc-riscv.c +++ b/gas/config/tc-riscv.c @@ -4717,7 +4717,10 @@ md_apply_fix (fixS *fixP, valueT *valP, segT seg) { bfd_vma target = entry->target; bfd_vma value = target - entry->address; - bfd_putl32 (bfd_getl32 (buf) | ENCODE_ITYPE_IMM (value), buf); + if (fixP->fx_r_type == BFD_RELOC_RISCV_PCREL_LO12_S) + bfd_putl32 (bfd_getl32 (buf) | ENCODE_STYPE_IMM (value), buf); + else + bfd_putl32 (bfd_getl32 (buf) | ENCODE_ITYPE_IMM (value), buf); /* Relaxations should never be enabled by `.option relax'. */ if (!riscv_opts.relax) fixP->fx_done = 1; diff --git a/gas/testsuite/gas/riscv/fixup-local-norelax.d b/gas/testsuite/gas/riscv/fixup-local-norelax.d index 3169c69390d..8b29860893c 100644 --- a/gas/testsuite/gas/riscv/fixup-local-norelax.d +++ b/gas/testsuite/gas/riscv/fixup-local-norelax.d @@ -1,22 +1,45 @@ #as: -march=rv64i -mno-relax #source: fixup-local.s -#objdump: -dr +#objdump: -dr -Mno-aliases .*:[ ]+file format .* + Disassembly of section .text: 0+0000 : [ ]+0:[ ]+00000517[ ]+auipc[ ]+a0,0x0 -[ ]+4:[ ]+00850513[ ]+addi[ ]+a0,a0,8 # 8 +[ ]+4:[ ]+01850513[ ]+addi[ ]+a0,a0,24 # 18 [ ]+8:[ ]+00000517[ ]+auipc[ ]+a0,0x0 -[ ]+8:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* -[ ]+c:[ ]+00050513[ ]+mv[ ]+a0,a0 -[ ]+c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+c:[ ]+01051503[ ]+lh[ ]+a0,16\(a0\) # 18 [ ]+10:[ ]+00000517[ ]+auipc[ ]+a0,0x0 -[ ]+10:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* -[ ]+14:[ ]+00050513[ ]+mv[ ]+a0,a0 -[ ]+14:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* -[ ]+18:[ ]+00000517[ ]+auipc[ ]a0,0x0 -[ ]+1c:[ ]+00852503[ ]+lw[ ]+a0,8\(a0\) # 20 -[ ]+20:[ ]+00008067[ ]+ret +[ ]+14:[ ]+00a51423[ ]+sh[ ]+a0,8\(a0\) # 18 +[ ]+18:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+18:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+1c:[ ]+00050513[ ]+addi[ ]+a0,a0,0 # 18 +[ ]+1c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+20:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+20:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+24:[ ]+00051503[ ]+lh[ ]+a0,0\(a0\) # 20 +[ ]+24:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+28:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+28:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+2c:[ ]+00a51023[ ]+sh[ ]+a0,0\(a0\) # 28 +[ ]+2c:[ ]+R_RISCV_PCREL_LO12_S[ ]+.L0.* +[ ]+30:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+30:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+34:[ ]+00050513[ ]+addi[ ]+a0,a0,0 # 30 +[ ]+34:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+38:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+38:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+3c:[ ]+00051503[ ]+lh[ ]+a0,0\(a0\) # 38 +[ ]+3c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+40:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+40:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+44:[ ]+00a51023[ ]+sh[ ]+a0,0\(a0\) # 40 +[ ]+44:[ ]+R_RISCV_PCREL_LO12_S[ ]+.L0.* +[ ]+48:[ ]+00000517[ ]+auipc[ ]a0,0x0 +[ ]+4c:[ ]+01052503[ ]+lw[ ]+a0,16\(a0\) # 58 +[ ]+50:[ ]+00000517[ ]+auipc[ ]a0,0x0 +[ ]+54:[ ]+00a52823[ ]+sw[ ]+a0,16\(a0\) # 60 +[ ]+58:[ ]+00008067[ ]+jalr[ ]+zero,0\(ra\) diff --git a/gas/testsuite/gas/riscv/fixup-local-relax.d b/gas/testsuite/gas/riscv/fixup-local-relax.d index 3738de1deaf..13ba70cda66 100644 --- a/gas/testsuite/gas/riscv/fixup-local-relax.d +++ b/gas/testsuite/gas/riscv/fixup-local-relax.d @@ -1,6 +1,6 @@ #as: -march=rv64i -mrelax #source: fixup-local.s -#objdump: -dr +#objdump: -dr -Mno-aliases .*:[ ]+file format .* @@ -11,31 +11,73 @@ Disassembly of section .text: [ ]+0:[ ]+00000517[ ]+auipc[ ]+a0,0x0 [ ]+0:[ ]+R_RISCV_PCREL_HI20[ ]+.LL0.* [ ]+0:[ ]+R_RISCV_RELAX.* -[ ]+4:[ ]+00850513[ ]+addi[ ]+a0,a0,8 # 8 <.LL0> +[ ]+4:[ ]+01850513[ ]+addi[ ]+a0,a0,24 # 18 <.LL0> [ ]+4:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* [ ]+4:[ ]+R_RISCV_RELAX.* - -0+0008 <.LL0>: [ ]+8:[ ]+00000517[ ]+auipc[ ]+a0,0x0 -[ ]+8:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+8:[ ]+R_RISCV_PCREL_HI20[ ]+.LL0.* [ ]+8:[ ]+R_RISCV_RELAX.* -[ ]+c:[ ]+00050513[ ]+mv[ ]+a0,a0 +[ ]+c:[ ]+01051503[ ]+lh[ ]+a0,16\(a0\) # 18 <.LL0> [ ]+c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* [ ]+c:[ ]+R_RISCV_RELAX.* [ ]+10:[ ]+00000517[ ]+auipc[ ]+a0,0x0 -[ ]+10:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+10:[ ]+R_RISCV_PCREL_HI20[ ]+.LL0.* [ ]+10:[ ]+R_RISCV_RELAX.* -[ ]+14:[ ]+00050513[ ]+mv[ ]+a0,a0 -[ ]+14:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+14:[ ]+00a51423[ ]+sh[ ]+a0,8\(a0\) # 18 <.LL0> +[ ]+14:[ ]+R_RISCV_PCREL_LO12_S[ ]+.L0.* [ ]+14:[ ]+R_RISCV_RELAX.* -0+0018 <.LL1>: -[ ]+18:[ ]+00000517[ ]+auipc[ ]a0,0x0 -[ ]+18:[ ]+R_RISCV_PCREL_HI20[ ]+.LL2.* -[ ]+18:[ ]R_RISCV_RELAX.* -[ ]+1c:[ ]+00852503[ ]+lw[ ]+a0,8\(a0\) # 20 <.LL2> -[ ]+1c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.LL1.* +0+0018 <.LL0>: +[ ]+18:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+18:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+18:[ ]+R_RISCV_RELAX.* +[ ]+1c:[ ]+00050513[ ]+addi[ ]+a0,a0,0 # 18 <.LL0> +[ ]+1c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* [ ]+1c:[ ]+R_RISCV_RELAX.* +[ ]+20:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+20:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+20:[ ]+R_RISCV_RELAX.* +[ ]+24:[ ]+00051503[ ]+lh[ ]+a0,0\(a0\) # 20 <.LL0\+0x8> +[ ]+24:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+24:[ ]+R_RISCV_RELAX.* +[ ]+28:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+28:[ ]+R_RISCV_PCREL_HI20[ ]+bar.* +[ ]+28:[ ]+R_RISCV_RELAX.* +[ ]+2c:[ ]+00a51023[ ]+sh[ ]+a0,0\(a0\) # 28 <.LL0\+0x10> +[ ]+2c:[ ]+R_RISCV_PCREL_LO12_S[ ]+.L0.* +[ ]+2c:[ ]+R_RISCV_RELAX.* +[ ]+30:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+30:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+30:[ ]+R_RISCV_RELAX.* +[ ]+34:[ ]+00050513[ ]+addi[ ]+a0,a0,0 # 30 <.LL0\+0x18> +[ ]+34:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+34:[ ]+R_RISCV_RELAX.* +[ ]+38:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+38:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+38:[ ]+R_RISCV_RELAX.* +[ ]+3c:[ ]+00051503[ ]+lh[ ]+a0,0\(a0\) # 38 <.LL0\+0x20> +[ ]+3c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.L0.* +[ ]+3c:[ ]+R_RISCV_RELAX.* +[ ]+40:[ ]+00000517[ ]+auipc[ ]+a0,0x0 +[ ]+40:[ ]+R_RISCV_PCREL_HI20[ ]+foo.* +[ ]+40:[ ]+R_RISCV_RELAX.* +[ ]+44:[ ]+00a51023[ ]+sh[ ]+a0,0\(a0\) # 40 <.LL0\+0x28> +[ ]+44:[ ]+R_RISCV_PCREL_LO12_S[ ]+.L0.* +[ ]+44:[ ]+R_RISCV_RELAX.* + +0+0048 <.LL1>: +[ ]+48:[ ]+00000517[ ]+auipc[ ]a0,0x0 +[ ]+48:[ ]+R_RISCV_PCREL_HI20[ ]+.LL3.* +[ ]+48:[ ]+R_RISCV_RELAX.* +[ ]+4c:[ ]+01052503[ ]+lw[ ]+a0,16\(a0\) # 58 <.LL3> +[ ]+4c:[ ]+R_RISCV_PCREL_LO12_I[ ]+.LL1.* +[ ]+4c:[ ]+R_RISCV_RELAX.* +[ ]+50:[ ]+00000517[ ]+auipc[ ]a0,0x0 +[ ]+50:[ ]+R_RISCV_PCREL_HI20[ ]+.LL3.* +[ ]+50:[ ]+R_RISCV_RELAX.* +[ ]+54:[ ]+00a52823[ ]+sw[ ]+a0,16\(a0\) # 60 <.LL3\+0x8> +[ ]+54:[ ]+R_RISCV_PCREL_LO12_S[ ]+.LL1.* +[ ]+54:[ ]+R_RISCV_RELAX.* -0+0020 <.LL2>: -[ ]+20:[ ]+00008067[ ]+ret +0+0058 <.LL3>: +[ ]+58:[ ]+00008067[ ]+jalr[ ]+zero,0\(ra\) diff --git a/gas/testsuite/gas/riscv/fixup-local.s b/gas/testsuite/gas/riscv/fixup-local.s index 44b47311235..04e7c7f6160 100644 --- a/gas/testsuite/gas/riscv/fixup-local.s +++ b/gas/testsuite/gas/riscv/fixup-local.s @@ -1,13 +1,19 @@ -.global foo -.global bar + .global foo + .global bar foo: - la a0, .LL0 + la a0, .LL0 + lh a0, .LL0 + sh a0, .LL0, a0 .LL0: - la a0, bar - la a0, foo -.LL1: - auipc a0, %pcrel_hi(.LL2) - lw a0, %pcrel_lo(.LL1)(a0) - -.LL2: - ret + la a0, bar + lh a0, bar + sh a0, bar, a0 + la a0, foo + lh a0, foo + sh a0, foo, a0 +.LL1: auipc a0, %pcrel_hi(.LL3) + lw a0, %pcrel_lo(.LL1)(a0) +.LL2: auipc a0, %pcrel_hi(.LL3) + sw a0, %pcrel_lo(.LL1)(a0) +.LL3: + ret