[binutils-gdb] RISC-V: Give error for ignored pcrel_lo addend.

Jim Wilson wilson@sourceware.org
Thu Feb 15 18:54:00 GMT 2018


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

commit 2a0d98534964649bc6884b7833c6c4089159a6df
Author: Jim Wilson <jimw@sifive.com>
Date:   Thu Feb 15 10:53:46 2018 -0800

    RISC-V: Give error for ignored pcrel_lo addend.
    
    	bfd/
    	* elfnn-riscv.c (riscv_elf_relocate_section): Use bfd_reloc_dangerous
    	when pcrel_lo reloc has an addend.  Use reloc_dangerous callback for
    	bfd_reloc_dangerous.  Use einfo instead of warning callback for errors.
    	Add %X%P to error messages.
    
    	ld/
    	* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Run pcrel-lo-addend test.
    	* testsuite/ld-riscv-elf/pcrel-lo-addend.d: New.
    	* testsuite/ld-riscv-elf/pcrel-lo-addend.s: New.

Diff:
---
 bfd/ChangeLog                               |  7 +++++++
 bfd/elfnn-riscv.c                           | 24 ++++++++++++++++++------
 ld/ChangeLog                                |  6 ++++++
 ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp  |  1 +
 ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d |  5 +++++
 ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s | 17 +++++++++++++++++
 6 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index aa14169..cab828b 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2018-02-15  Jim Wilson  <jimw@sifive.com>
+
+	* elfnn-riscv.c (riscv_elf_relocate_section): Use bfd_reloc_dangerous
+	when pcrel_lo reloc has an addend.  Use reloc_dangerous callback for
+	bfd_reloc_dangerous.  Use einfo instead of warning callback for errors.
+	Add %X%P to error messages.
+
 2018-02-15  Eric Botcazou  <ebotcazou@adacore.com>
 
 	PR ld/22832
diff --git a/bfd/elfnn-riscv.c b/bfd/elfnn-riscv.c
index dd9c300..931bd1d 100644
--- a/bfd/elfnn-riscv.c
+++ b/bfd/elfnn-riscv.c
@@ -1993,6 +1993,16 @@ riscv_elf_relocate_section (bfd *output_bfd,
 
 	case R_RISCV_PCREL_LO12_I:
 	case R_RISCV_PCREL_LO12_S:
+	  /* Addends are not allowed, because then riscv_relax_delete_bytes
+	     would have to search through all relocs to update the addends.
+	     Also, riscv_resolve_pcrel_lo_relocs does not support addends
+	     when searching for a matching hi reloc.  */
+	  if (rel->r_addend)
+	    {
+	      r = bfd_reloc_dangerous;
+	      break;
+	    }
+
 	  if (riscv_record_pcrel_lo_reloc (&pcrel_relocs, input_section, info,
 					   howto, rel, relocation, name,
 					   contents))
@@ -2234,25 +2244,27 @@ riscv_elf_relocate_section (bfd *output_bfd,
 	  break;
 
 	case bfd_reloc_outofrange:
-	  msg = _("internal error: out of range error");
+	  msg = _("%X%P: internal error: out of range error\n");
 	  break;
 
 	case bfd_reloc_notsupported:
-	  msg = _("internal error: unsupported relocation error");
+	  msg = _("%X%P: internal error: unsupported relocation error\n");
 	  break;
 
 	case bfd_reloc_dangerous:
-	  msg = _("internal error: dangerous relocation");
+	  info->callbacks->reloc_dangerous
+	    (info, "%pcrel_lo with addend", input_bfd, input_section,
+	     rel->r_offset);
 	  break;
 
 	default:
-	  msg = _("internal error: unknown error");
+	  msg = _("%X%P: internal error: unknown error\n");
 	  break;
 	}
 
       if (msg)
-	info->callbacks->warning
-	  (info, msg, name, input_bfd, input_section, rel->r_offset);
+	info->callbacks->einfo (msg);
+
       /* We already reported the error via a callback, so don't try to report
 	 it again by returning false.  That leads to spurious errors.  */
       ret = TRUE;
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c8a967a..a1d0049 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-15  Jim Wilson  <jimw@sifive.com>
+
+	* testsuite/ld-riscv-elf/ld-riscv-elf.exp: Run pcrel-lo-addend test.
+	* testsuite/ld-riscv-elf/pcrel-lo-addend.d: New.
+	* testsuite/ld-riscv-elf/pcrel-lo-addend.s: New.
+
 2018-02-14  H.J. Lu  <hongjiu.lu@intel.com>
 
 	PR ld/22842
diff --git a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
index 2b6a1d7..cd11680 100644
--- a/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
+++ b/ld/testsuite/ld-riscv-elf/ld-riscv-elf.exp
@@ -22,6 +22,7 @@
 if [istarget "riscv*-*-*"] {
     run_dump_test "c-lui"
     run_dump_test "disas-jalr"
+    run_dump_test "pcrel-lo-addend"
 
     # The following tests require shared library support.
     if ![check_shared_lib_support] {
diff --git a/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d
new file mode 100644
index 0000000..bd61b4b
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.d
@@ -0,0 +1,5 @@
+#name: %pcrel_lo with an addend
+#source: pcrel-lo-addend.s
+#as: -march=rv32ic
+#ld: -melf32lriscv
+#error: .*dangerous relocation: %pcrel_lo with addend
diff --git a/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s
new file mode 100644
index 0000000..50cdccc
--- /dev/null
+++ b/ld/testsuite/ld-riscv-elf/pcrel-lo-addend.s
@@ -0,0 +1,17 @@
+  .text
+  .globl _start
+_start:
+  auipc ra, %pcrel_hi(tdata)
+  addi ra, ra, %pcrel_lo(.text)
+  lb t1, 0(ra)
+foo:
+  auipc ra, %pcrel_hi(tdata)
+  addi ra, ra, %pcrel_lo(.text+12)
+  lb t2, 1(ra)
+
+  .data
+tdata:
+  .byte 0xff
+  .byte 0x00
+  .byte 0xf0
+  .byte 0x0f



More information about the Binutils-cvs mailing list