]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
RISC-V: Fix BFD_RELOC_RISCV_PCREL_LO12_S patch issue
authorSun Sunny <sunny.sun@corelabtech.com>
Thu, 4 Jul 2024 03:03:37 +0000 (03:03 +0000)
committerNelson Chu <nelson@rivosinc.com>
Thu, 4 Jul 2024 13:36:48 +0000 (21:36 +0800)
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 <sunny.sun@corelabtech.com>
gas/config/tc-riscv.c
gas/testsuite/gas/riscv/fixup-local-norelax.d
gas/testsuite/gas/riscv/fixup-local-relax.d
gas/testsuite/gas/riscv/fixup-local.s

index 5b9bfbdfa682cfd0a22dd596c4aeb6ec17573da0..c09bd429baba593a8bf6d6f1c7cc2f775b12d67e 100644 (file)
@@ -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;
index 3169c69390d10665dfef78bb8dce318c077d39c5..8b29860893c90a241b0e8cacae69a9a80701ff4b 100644 (file)
@@ -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 <foo>:
 [      ]+0:[   ]+00000517[     ]+auipc[        ]+a0,0x0
-[      ]+4:[   ]+00850513[     ]+addi[         ]+a0,a0,8 # 8 <foo\+0x8>
+[      ]+4:[   ]+01850513[     ]+addi[         ]+a0,a0,24 # 18 <foo\+0x18>
 [      ]+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 <foo\+0x18>
 [      ]+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 <foo\+0x20>
-[      ]+20:[  ]+00008067[     ]+ret
+[      ]+14:[  ]+00a51423[     ]+sh[   ]+a0,8\(a0\) # 18 <foo\+0x18>
+[      ]+18:[  ]+00000517[     ]+auipc[        ]+a0,0x0
+[      ]+18:[  ]+R_RISCV_PCREL_HI20[   ]+bar.*
+[      ]+1c:[  ]+00050513[     ]+addi[         ]+a0,a0,0 # 18 <foo\+0x18>
+[      ]+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 <foo\+0x20>
+[      ]+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 <foo\+0x28>
+[      ]+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 <foo\+0x30>
+[      ]+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 <foo\+0x38>
+[      ]+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 <foo\+0x40>
+[      ]+44:[  ]+R_RISCV_PCREL_LO12_S[         ]+.L0.*
+[      ]+48:[  ]+00000517[     ]+auipc[        ]a0,0x0
+[      ]+4c:[  ]+01052503[     ]+lw[   ]+a0,16\(a0\) # 58 <foo\+0x58>
+[      ]+50:[  ]+00000517[     ]+auipc[        ]a0,0x0
+[      ]+54:[  ]+00a52823[     ]+sw[   ]+a0,16\(a0\) # 60 <foo\+0x60>
+[      ]+58:[  ]+00008067[     ]+jalr[         ]+zero,0\(ra\)
index 3738de1deafb60f969fdcf37b9a6a7510a02bb95..13ba70cda66d1dda3584fe202f176b829d6d4739 100644 (file)
@@ -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\)
index 44b473112353c5efbd65e4dadb9f7838ee1445eb..04e7c7f6160592698ca22f27430358fc82bc2d98 100644 (file)
@@ -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