[binutils-gdb] RISC-V: Fix BFD_RELOC_RISCV_PCREL_LO12_S patch issue

Nelson Chu nelsonc1225@sourceware.org
Thu Jul 4 13:47:21 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=c83ea305e21e1363b62747984c1b7286cb7a2ca8

commit c83ea305e21e1363b62747984c1b7286cb7a2ca8
Author: Sun Sunny <sunny.sun@corelabtech.com>
Date:   Thu Jul 4 03:03:37 2024 +0000

    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 <sunny.sun@corelabtech.com>

Diff:
---
 gas/config/tc-riscv.c                         |  5 +-
 gas/testsuite/gas/riscv/fixup-local-norelax.d | 45 ++++++++++++----
 gas/testsuite/gas/riscv/fixup-local-relax.d   | 76 +++++++++++++++++++++------
 gas/testsuite/gas/riscv/fixup-local.s         | 28 ++++++----
 4 files changed, 114 insertions(+), 40 deletions(-)

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 <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\)
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


More information about the Binutils-cvs mailing list