[PATCH] D80390: [WIP][mips] Support 64-bit relative relocations

Simon Atanasyan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 21 11:21:57 PDT 2020


atanasyan created this revision.
atanasyan added reviewers: sdardis, dsanders, arichardson, MaskRay.
Herald added subscribers: jrtc27, hiraditya, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.
atanasyan added a child revision: D80392: [WIP][mips] Use pc-relative relocations in .eh_frame.

MIPS 64-bit ABI does not provide special PC-relative relocation like R_MIPS_PC32 in 32-bit case. But we can use a "chain of relocation" defined by N64 ABIs. In that case one relocation record might contain up to three relocations which applied sequentially. Width of a final relocation mask applied to the result of relocation depends on the last relocation in the chain. In case of 64-bit PC-relative relocation we need the following chain: `R_MIPS_PC32 | R_MIPS_64`. The first relocation calculates an offset, but does not truncate the result. The second relocation just apply calculated result as a 64-bit value.

      

The 64-bit PC-relative relocation might be useful in generation of `.eh_frame` sections to escape passing `-Wl,-z,notext` flags to linker.

      

Now this patch is rather "proof-of-concept". Not a commit ready changes. Any comments are welcome.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D80390

Files:
  lld/test/ELF/mips-pc64.s
  llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
  llvm/test/MC/Mips/relocation-n64.s
  llvm/test/MC/Mips/unsupported-relocation.s


Index: llvm/test/MC/Mips/unsupported-relocation.s
===================================================================
--- llvm/test/MC/Mips/unsupported-relocation.s
+++ llvm/test/MC/Mips/unsupported-relocation.s
@@ -11,5 +11,3 @@
 # CHECK: :[[@LINE-1]]:17: error: MIPS does not support one byte relocations
         .byte   x+1
 # CHECK: :[[@LINE-1]]:17: error: MIPS does not support one byte relocations
-        .quad   x-foo
-# CHECK: :[[@LINE-1]]:17: error: MIPS does not support 64-bit PC-relative relocations
Index: llvm/test/MC/Mips/relocation-n64.s
===================================================================
--- llvm/test/MC/Mips/relocation-n64.s
+++ llvm/test/MC/Mips/relocation-n64.s
@@ -70,4 +70,6 @@
         .word 0
 bar:
         .word 1
+        .option pic2
+        .quad foo+0x1fffffff0-.               // RELOC: R_MIPS_PC32/R_MIPS_64/R_MIPS_NONE foo 0x1FFFFFFF0
 // DATA-LABEL: Section {
Index: llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
===================================================================
--- llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
+++ llvm/lib/Target/Mips/MCTargetDesc/MipsELFObjectWriter.cpp
@@ -234,14 +234,15 @@
   case Mips::fixup_Mips_32:
   case FK_Data_4:
     return IsPCRel ? ELF::R_MIPS_PC32 : ELF::R_MIPS_32;
+  case Mips::fixup_Mips_64:
+  case FK_Data_8:
+    return IsPCRel
+               ? setRTypes(ELF::R_MIPS_PC32, ELF::R_MIPS_64, ELF::R_MIPS_NONE)
+               : ELF::R_MIPS_64;
   }
 
   if (IsPCRel) {
     switch (Kind) {
-    case FK_Data_8:
-      Ctx.reportError(Fixup.getLoc(),
-                      "MIPS does not support 64-bit PC-relative relocations");
-      return ELF::R_MIPS_NONE;
     case Mips::fixup_Mips_Branch_PCRel:
     case Mips::fixup_Mips_PC16:
       return ELF::R_MIPS_PC16;
@@ -277,9 +278,6 @@
   }
 
   switch (Kind) {
-  case Mips::fixup_Mips_64:
-  case FK_Data_8:
-    return ELF::R_MIPS_64;
   case FK_DTPRel_4:
     return ELF::R_MIPS_TLS_DTPREL32;
   case FK_DTPRel_8:
Index: lld/test/ELF/mips-pc64.s
===================================================================
--- /dev/null
+++ lld/test/ELF/mips-pc64.s
@@ -0,0 +1,26 @@
+# REQUIRES: mips
+
+# Check handling of 64-bit pc-realtive relocation.
+
+# RUN: llvm-mc -filetype=obj -triple=mips64-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { \
+# RUN:         . = 0x10000; .text ALIGN(0x10000) : { *(.text) } \
+# RUN:         . = 0x30000; .data                : { *(.data) } \
+# RUN:       }" > %t.script
+# RUN: ld.lld -shared %t.o -script %t.script -o %t.exe
+# RUN: llvm-objdump -s %t.exe | FileCheck %s
+
+# CHECK:      Contents of section .data:
+# CHECK-NEXT:  {{.*}} 00000000 0000fff0 00000001 fffeffe8
+
+  .option pic2
+  .text
+foo:
+  nop
+  .data
+  .global v0
+  .global v1
+v0:
+  .quad foo+0x1fff0-.
+v1:
+  .quad foo+0x1fffffff0-.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D80390.265549.patch
Type: text/x-patch
Size: 2844 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200521/f2f204e8/attachment-0001.bin>


More information about the llvm-commits mailing list