[PATCH] D63404: [RISCV] Don't force absolute FK_Data_X fixups to relocs

Alex Bradbury via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 19 06:23:00 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rL369257: [RISCV] Don't force absolute FK_Data_X fixups to relocs (authored by asb, committed by ).
Herald added a subscriber: pzheng.

Changed prior to commit:
  https://reviews.llvm.org/D63404?vs=213374&id=215877#toc

Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63404/new/

https://reviews.llvm.org/D63404

Files:
  llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
  llvm/trunk/test/MC/RISCV/fde-reloc.s
  llvm/trunk/test/MC/RISCV/linker-relaxation.s


Index: llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
===================================================================
--- llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
+++ llvm/trunk/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp
@@ -33,6 +33,13 @@
   switch ((unsigned)Fixup.getKind()) {
   default:
     break;
+  case FK_Data_1:
+  case FK_Data_2:
+  case FK_Data_4:
+  case FK_Data_8:
+    if (Target.isAbsolute())
+      return false;
+    break;
   case RISCV::fixup_riscv_got_hi20:
   case RISCV::fixup_riscv_tls_got_hi20:
   case RISCV::fixup_riscv_tls_gd_hi20:
Index: llvm/trunk/test/MC/RISCV/linker-relaxation.s
===================================================================
--- llvm/trunk/test/MC/RISCV/linker-relaxation.s
+++ llvm/trunk/test/MC/RISCV/linker-relaxation.s
@@ -136,3 +136,24 @@
 # RELAX-RELOC: R_RISCV_RELAX - 0x0
 # RELAX-FIXUP: fixup A - offset: 0, value: %pcrel_lo(.Ltmp1), kind: fixup_riscv_pcrel_lo12_s
 # RELAX-FIXUP: fixup B - offset: 0, value: 0, kind: fixup_riscv_relax
+
+# Check that a relocation is not emitted for a symbol difference which has
+# been folded to a fixup with an absolute value. This can happen when a
+# difference expression refers to two symbols, at least one of which is
+# not defined at the point it is referenced. Then during *assembler*
+# relaxation when both symbols have become defined the difference may be folded
+# down to a fixup simply containing the absolute value. We want to ensure that
+# we don't force a relocation to be emitted for this absolute value even
+# when linker relaxation is enabled. The reason for this is that one instance
+# where this pattern appears in in the .eh_frame section (the CIE 'length'
+# field), and the .eh_frame section cannot be parsed by the linker unless the
+# fixup has been resolved to a concrete value instead of a relocation.
+  .data
+lo:
+  .word hi-lo
+  .quad hi-lo
+# NORELAX-RELOC-NOT: R_RISCV_32
+# NORELAX-RELOC-NOT: R_RISCV_64
+# RELAX-RELOC-NOT: R_RISCV_32
+# RELAX-RELOC-NOT: R_RISCV_64
+hi:
Index: llvm/trunk/test/MC/RISCV/fde-reloc.s
===================================================================
--- llvm/trunk/test/MC/RISCV/fde-reloc.s
+++ llvm/trunk/test/MC/RISCV/fde-reloc.s
@@ -14,9 +14,6 @@
 # preparation for follow-on patches to fix it.
 
 # RELAX-RELOC:   Section (4) .rela.eh_frame {
-# RELAX-RELOC-NEXT:   0x0 R_RISCV_32 - 0x10
-# RELAX-RELOC-NEXT:   0x14 R_RISCV_32 - 0x10
-# RELAX-RELOC-NEXT:   0x18 R_RISCV_32 - 0x18
 # RELAX-RELOC-NEXT:   0x1C R_RISCV_ADD32 - 0x0
 # RELAX-RELOC-NEXT:   0x1C R_RISCV_SUB32 - 0x0
 # RELAX-RELOC-NEXT:   0x20 R_RISCV_ADD32 - 0x0


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63404.215877.patch
Type: text/x-patch
Size: 2648 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190819/aa4699e6/attachment.bin>


More information about the llvm-commits mailing list