[lld] r274514 - ELF/AMDGPU: Add support for GOT relocations

Tom Stellard via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 4 12:19:07 PDT 2016


Author: tstellar
Date: Mon Jul  4 14:19:07 2016
New Revision: 274514

URL: http://llvm.org/viewvc/llvm-project?rev=274514&view=rev
Log:
ELF/AMDGPU: Add support for GOT relocations

Reviewers: arsenm, rafael, tony-tye, kzhuravl, ruiu

Subscribers: llvm-commits, kzhuravl

Differential Revision: http://reviews.llvm.org/D21481

Modified:
    lld/trunk/ELF/Target.cpp
    lld/trunk/test/ELF/amdgpu-relocs.s

Modified: lld/trunk/ELF/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=274514&r1=274513&r2=274514&view=diff
==============================================================================
--- lld/trunk/ELF/Target.cpp (original)
+++ lld/trunk/ELF/Target.cpp Mon Jul  4 14:19:07 2016
@@ -166,7 +166,7 @@ public:
 
 class AMDGPUTargetInfo final : public TargetInfo {
 public:
-  AMDGPUTargetInfo() {}
+  AMDGPUTargetInfo();
   void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override;
   RelExpr getRelExpr(uint32_t Type, const SymbolBody &S) const override;
 };
@@ -1415,16 +1415,29 @@ void AArch64TargetInfo::relaxTlsIeToLe(u
   llvm_unreachable("invalid relocation for TLS IE to LE relaxation");
 }
 
+AMDGPUTargetInfo::AMDGPUTargetInfo() { GotRel = R_AMDGPU_ABS64; }
+
 void AMDGPUTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
                                    uint64_t Val) const {
-  assert(Type == R_AMDGPU_REL32);
-  write32le(Loc, Val);
+  switch (Type) {
+  case R_AMDGPU_GOTPCREL:
+  case R_AMDGPU_REL32:
+    write32le(Loc, Val);
+    break;
+  default:
+    fatal("unrecognized reloc " + Twine(Type));
+  }
 }
 
 RelExpr AMDGPUTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
-  if (Type != R_AMDGPU_REL32)
-    error("do not know how to handle relocation");
-  return R_PC;
+  switch (Type) {
+  case R_AMDGPU_REL32:
+    return R_PC;
+  case R_AMDGPU_GOTPCREL:
+    return R_GOT_PC;
+  default:
+    fatal("do not know how to handle relocation " + Twine(Type));
+  }
 }
 
 ARMTargetInfo::ARMTargetInfo() {

Modified: lld/trunk/test/ELF/amdgpu-relocs.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/amdgpu-relocs.s?rev=274514&r1=274513&r2=274514&view=diff
==============================================================================
--- lld/trunk/test/ELF/amdgpu-relocs.s (original)
+++ lld/trunk/test/ELF/amdgpu-relocs.s Mon Jul  4 14:19:07 2016
@@ -4,15 +4,30 @@
 
 # REQUIRES: amdgpu
 
-# Make sure that the reloc for local_var is resolved by lld.
-
   .text
 
 kernel0:
+  s_mov_b32 s0, common_var at GOTPCREL+4
+  s_mov_b32 s0, extern_var at GOTPCREL+4
   s_mov_b32 s0, local_var+4
+  s_mov_b32 s0, global_var at GOTPCREL+4
+  s_mov_b32 s0, weak_var at GOTPCREL+4
+  s_mov_b32 s0, weakref_var at GOTPCREL+4
   s_endpgm
 
-  .local local_var
+  .comm   common_var,1024,4
+  .globl  global_var
+  .local  local_var
+  .weak   weak_var
+  .weakref weakref_var, weakref_alias_var
 
+# The relocation for local_var should be resolved by the linker.
 # CHECK: Relocations [
+# CHECK: .rela.dyn {
+# CHECK-NEXT: R_AMDGPU_ABS64 common_var 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 extern_var 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 global_var 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weak_var 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var 0x0
+# CHECK-NEXT: }
 # CHECK-NEXT: ]




More information about the llvm-commits mailing list