[binutils-gdb] RISC-V: Treat R_RISCV_CALL and R_RISCV_CALL_PLT as the same in check_relocs.

Nelson Chu nelsonc1225@sourceware.org
Fri Aug 28 01:38:58 GMT 2020


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

commit 3b1450b38c644f99aa2e211747b428b9f8d15cca
Author: Nelson Chu <nelson.chu@sifive.com>
Date:   Wed Aug 26 01:19:13 2020 -0700

    RISC-V: Treat R_RISCV_CALL and R_RISCV_CALL_PLT as the same in check_relocs.
    
    In fact, we can treate these two relocation as the same one in the
    riscv_elf_check_relocs.  I have heard that RISC-V lld had made this
    improvement, and so had GNU AARCH64, they only need R_AARCH64_CALL26
    for calls rather than two seperate relocations.
    
    Beside, the following PLT issue for RISC-V 32-bit glibc seems to be
    fixed by applying at least this patch.
    
    <https://sourceware.org/pipermail/libc-alpha/2020-August/117214.html>
    
    I have ran the toolchain regression, and everything seems fine for now.
    
            bfd/
            * elfnn-riscv.c (riscv_elf_check_relocs): Treat R_RISCV_CALL
            and R_RISCV_CALL_PLT as the same in the riscv_elf_check_relocs.
            (riscv_elf_relocate_section): Remove the R_RISCV_CALL for the
            unresolved reloc checks.
    
            ld/
            testsuite/ld-riscv-elf/lib-nopic-01a.s: Use R_RISCV_JAL rather
            than R_RISCV_CALL.
            testsuite/ld-riscv-elf/lib-nopic-01b.d: Likewise.
            testsuite/ld-riscv-elf/lib-nopic-01b.s: Likewise.

Diff:
---
 bfd/ChangeLog                             |  7 +++++++
 bfd/elfnn-riscv.c                         | 19 ++++++++++---------
 ld/ChangeLog                              |  7 +++++++
 ld/testsuite/ld-riscv-elf/lib-nopic-01a.s |  2 +-
 ld/testsuite/ld-riscv-elf/lib-nopic-01b.d |  2 +-
 ld/testsuite/ld-riscv-elf/lib-nopic-01b.s |  2 +-
 6 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 7700973bf96..cbec1c5eecb 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2020-08-28  Nelson Chu  <nelson.chu@sifive.com>
+
+	* elfnn-riscv.c (riscv_elf_check_relocs): Treat R_RISCV_CALL
+	and R_RISCV_CALL_PLT as the same in the riscv_elf_check_relocs.
+	(riscv_elf_relocate_section): Remove the R_RISCV_CALL for the
+	unresolved reloc checks.
+
 2020-08-27  John David Anglin  <danglin@gcc.gnu.org>
 
 	PR 26356
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index 5af1b1c3ff3..e6c5d1fba5a 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -557,21 +557,23 @@ riscv_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
 	    return FALSE;
 	  break;
 
+	case R_RISCV_CALL:
 	case R_RISCV_CALL_PLT:
-	  /* This symbol requires a procedure linkage table entry.  We
+	  /* These symbol requires a procedure linkage table entry.  We
 	     actually build the entry in adjust_dynamic_symbol,
-	     because this might be a case of linking PIC code without
+	     because these might be a case of linking PIC code without
 	     linking in any dynamic objects, in which case we don't
 	     need to generate a procedure linkage table after all.  */
 
-	  if (h != NULL)
-	    {
-	      h->needs_plt = 1;
-	      h->plt.refcount += 1;
-	    }
+	  /* If it is a local symbol, then we resolve it directly
+	     without creating a PLT entry.  */
+	  if (h == NULL)
+	    continue;
+
+	  h->needs_plt = 1;
+	  h->plt.refcount += 1;
 	  break;
 
-	case R_RISCV_CALL:
 	case R_RISCV_JAL:
 	case R_RISCV_BRANCH:
 	case R_RISCV_RVC_BRANCH:
@@ -2189,7 +2191,6 @@ riscv_elf_relocate_section (bfd *output_bfd,
 	{
 	  switch (r_type)
 	    {
-	    case R_RISCV_CALL:
 	    case R_RISCV_JAL:
 	    case R_RISCV_RVC_JUMP:
 	      if (asprintf (&msg_buf,
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 7881dd1f0fc..787d7605f5d 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,10 @@
+2020-08-28  Nelson Chu  <nelson.chu@sifive.com>
+
+	testsuite/ld-riscv-elf/lib-nopic-01a.s: Use R_RISCV_JAL rather
+	than R_RISCV_CALL.
+	testsuite/ld-riscv-elf/lib-nopic-01b.d: Likewise.
+	testsuite/ld-riscv-elf/lib-nopic-01b.s: Likewise.
+
 2020-08-27  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
 	* emultempl/msp430.em: Remove unused variable "buf".
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
index c95cda05d24..632875d423a 100644
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
+++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01a.s
@@ -4,6 +4,6 @@
 	.globl  func1
 	.type   func1, @function
 func1:
-	call    func2
+	jal	func2
 	jr      ra
 	.size   func1, .-func1
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
index 0d758a40d60..1c2c907fc30 100644
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
+++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.d
@@ -2,4 +2,4 @@
 #source: lib-nopic-01b.s
 #as:
 #ld: -shared tmpdir/lib-nopic-01a.so
-#error: .*relocation R_RISCV_CALL against `func1' can not be used when making a shared object; recompile with -fPIC
+#error: .*relocation R_RISCV_JAL against `func1' can not be used when making a shared object; recompile with -fPIC
diff --git a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
index 97fe1374e4f..ea7b0298895 100644
--- a/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
+++ b/ld/testsuite/ld-riscv-elf/lib-nopic-01b.s
@@ -4,6 +4,6 @@
 	.globl  func2
 	.type   func2, @function
 func2:
-	call    func1
+	jal	func1
 	jr      ra
 	.size   func2, .-func2


More information about the Binutils-cvs mailing list