[lld] r369258 - [lld][Hexagon] Add GOTREL relocations.

Sid Manning via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 19 06:32:32 PDT 2019


Author: sidneym
Date: Mon Aug 19 06:32:32 2019
New Revision: 369258

URL: http://llvm.org/viewvc/llvm-project?rev=369258&view=rev
Log:
[lld][Hexagon] Add GOTREL relocations.

Add GOTREL relocation support. (S + A - GOT)

Differential Revision: https://reviews.llvm.org/D66260

Added:
    lld/trunk/test/ELF/hexagon-gotrel.s
Modified:
    lld/trunk/ELF/Arch/Hexagon.cpp

Modified: lld/trunk/ELF/Arch/Hexagon.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Arch/Hexagon.cpp?rev=369258&r1=369257&r2=369258&view=diff
==============================================================================
--- lld/trunk/ELF/Arch/Hexagon.cpp (original)
+++ lld/trunk/ELF/Arch/Hexagon.cpp Mon Aug 19 06:32:32 2019
@@ -100,6 +100,12 @@ RelExpr Hexagon::getRelExpr(RelType type
   case R_HEX_B22_PCREL_X:
   case R_HEX_B32_PCREL_X:
     return R_PLT_PC;
+  case R_HEX_GOTREL_11_X:
+  case R_HEX_GOTREL_16_X:
+  case R_HEX_GOTREL_32_6_X:
+  case R_HEX_GOTREL_HI16:
+  case R_HEX_GOTREL_LO16:
+    return R_GOTPLTREL;
   case R_HEX_GOT_11_X:
   case R_HEX_GOT_16_X:
   case R_HEX_GOT_32_6_X:
@@ -198,6 +204,7 @@ void Hexagon::relocateOne(uint8_t *loc,
     break;
   case R_HEX_11_X:
   case R_HEX_GOT_11_X:
+  case R_HEX_GOTREL_11_X:
     or32le(loc, applyMask(findMaskR11(read32le(loc)), val & 0x3f));
     break;
   case R_HEX_12_X:
@@ -205,6 +212,7 @@ void Hexagon::relocateOne(uint8_t *loc,
     break;
   case R_HEX_16_X: // These relocs only have 6 effective bits.
   case R_HEX_GOT_16_X:
+  case R_HEX_GOTREL_16_X:
     or32le(loc, applyMask(findMaskR16(read32le(loc)), val & 0x3f));
     break;
   case R_HEX_32:
@@ -213,6 +221,7 @@ void Hexagon::relocateOne(uint8_t *loc,
     break;
   case R_HEX_32_6_X:
   case R_HEX_GOT_32_6_X:
+  case R_HEX_GOTREL_32_6_X:
     or32le(loc, applyMask(0x0fff3fff, val >> 6));
     break;
   case R_HEX_B9_PCREL:
@@ -240,9 +249,11 @@ void Hexagon::relocateOne(uint8_t *loc,
   case R_HEX_B32_PCREL_X:
     or32le(loc, applyMask(0x0fff3fff, val >> 6));
     break;
+  case R_HEX_GOTREL_HI16:
   case R_HEX_HI16:
     or32le(loc, applyMask(0x00c03fff, val >> 16));
     break;
+  case R_HEX_GOTREL_LO16:
   case R_HEX_LO16:
     or32le(loc, applyMask(0x00c03fff, val));
     break;

Added: lld/trunk/test/ELF/hexagon-gotrel.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/hexagon-gotrel.s?rev=369258&view=auto
==============================================================================
--- lld/trunk/test/ELF/hexagon-gotrel.s (added)
+++ lld/trunk/test/ELF/hexagon-gotrel.s Mon Aug 19 06:32:32 2019
@@ -0,0 +1,27 @@
+# REQUIRES: hexagon
+# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %S/Inputs/hexagon-shared.s -o %t2.o
+# RUN: ld.lld -shared %t2.o -o %t2.so
+# RUN: ld.lld -shared %t.o %t2.so -o %t3.so
+# RUN: llvm-objdump --print-imm-hex -d -j .text %t3.so | FileCheck --check-prefix=TEXT %s
+
+.global foo
+foo:
+
+.Lpc:
+
+# R_HEX_GOTREL_LO16
+  r0.l = #LO(.Lpc at GOTREL)
+# R_HEX_GOTREL_HI16
+  r0.h = #HI(.Lpc at GOTREL)
+# R_HEX_GOTREL_11_X
+  r0 = memw(r1+##.Lpc at GOTREL)
+# R_HEX_GOTREL_32_6_X and R_HEX_GOTREL_16_X
+  r0 = ##(.Lpc at GOTREL)
+
+# TEXT: r0.l = #0x0 }
+# TEXT: r0.h = #0xfffe }
+# TEXT: immext(#0xfffe0000)
+# TEXT: r0 = memw(r1+##-0x20000) }
+# TEXT: immext(#0xfffe0000)
+# TEXT: r0 = ##-0x20000 }




More information about the llvm-commits mailing list