[ELF/AMDGPU]: Add support for new relocations
authorKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Fri, 14 Oct 2016 04:51:43 +0000 (04:51 +0000)
committerKonstantin Zhuravlyov <kzhuravl_dev@outlook.com>
Fri, 14 Oct 2016 04:51:43 +0000 (04:51 +0000)
Differential Revision: https://reviews.llvm.org/D25563

llvm-svn: 284197

lld/ELF/Target.cpp
lld/test/ELF/amdgpu-relocs.s

index 276df78..09bedd3 100644 (file)
@@ -1479,9 +1479,15 @@ void AMDGPUTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
   switch (Type) {
   case R_AMDGPU_ABS32:
   case R_AMDGPU_GOTPCREL:
+  case R_AMDGPU_GOTPCREL32_LO:
   case R_AMDGPU_REL32:
+  case R_AMDGPU_REL32_LO:
     write32le(Loc, Val);
     break;
+  case R_AMDGPU_GOTPCREL32_HI:
+  case R_AMDGPU_REL32_HI:
+    write32le(Loc, Val >> 32);
+    break;
   default:
     fatal("unrecognized reloc " + Twine(Type));
   }
@@ -1492,8 +1498,12 @@ RelExpr AMDGPUTargetInfo::getRelExpr(uint32_t Type, const SymbolBody &S) const {
   case R_AMDGPU_ABS32:
     return R_ABS;
   case R_AMDGPU_REL32:
+  case R_AMDGPU_REL32_LO:
+  case R_AMDGPU_REL32_HI:
     return R_PC;
   case R_AMDGPU_GOTPCREL:
+  case R_AMDGPU_GOTPCREL32_LO:
+  case R_AMDGPU_GOTPCREL32_HI:
     return R_GOT_PC;
   default:
     fatal("do not know how to handle relocation " + Twine(Type));
index b159472..aa749d0 100644 (file)
@@ -8,33 +8,75 @@
   .text
 
 kernel0:
-  s_mov_b32 s0, common_var@GOTPCREL+4
-  s_mov_b32 s0, extern_var@GOTPCREL+4
-  s_mov_b32 s0, local_var+4
-  s_mov_b32 s0, global_var@GOTPCREL+4
-  s_mov_b32 s0, weak_var@GOTPCREL+4
-  s_mov_b32 s0, weakref_var@GOTPCREL+4
+  s_mov_b32 s0, common_var0@GOTPCREL+4
+  s_mov_b32 s0, common_var1@gotpcrel32@lo+4
+  s_mov_b32 s0, common_var2@gotpcrel32@hi+4
+
+  s_mov_b32 s0, global_var0@GOTPCREL+4
+  s_mov_b32 s0, global_var1@gotpcrel32@lo+4
+  s_mov_b32 s0, global_var2@gotpcrel32@hi+4
+
+  s_mov_b32 s0, extern_var0@GOTPCREL+4
+  s_mov_b32 s0, extern_var1@gotpcrel32@lo+4
+  s_mov_b32 s0, extern_var2@gotpcrel32@hi+4
+
+  s_mov_b32 s0, weak_var0@GOTPCREL+4
+  s_mov_b32 s0, weak_var1@gotpcrel32@lo+4
+  s_mov_b32 s0, weak_var2@gotpcrel32@hi+4
+
+  s_mov_b32 s0, weakref_var0@GOTPCREL+4
+  s_mov_b32 s0, weakref_var1@gotpcrel32@lo+4
+  s_mov_b32 s0, weakref_var2@gotpcrel32@hi+4
+
+  s_mov_b32 s0, local_var0+4
+  s_mov_b32 s0, local_var1@rel32@lo+4
+  s_mov_b32 s0, local_var2@rel32@hi+4
+
   s_endpgm
 
-  .comm   common_var,1024,4
-  .globl  global_var
-  .local  local_var
-  .weak   weak_var
-  .weakref weakref_var, weakref_alias_var
+  .comm    common_var0,1024,4
+  .comm    common_var1,1024,4
+  .comm    common_var2,1024,4
+  .globl   global_var0
+  .globl   global_var1
+  .globl   global_var1
+  .weak    weak_var0
+  .weak    weak_var1
+  .weak    weak_var2
+  .weakref weakref_var0, weakref_alias_var0
+  .weakref weakref_var1, weakref_alias_var1
+  .weakref weakref_var2, weakref_alias_var2
+  .local   local_var0
+  .local   local_var1
+  .local   local_var2
 
 .section nonalloc, "w", @progbits
-  .long var, common_var
+  .long var0, common_var2+4
+  .long var1, common_var1+8
+  .long var2, common_var0+12
 
-# The relocation for local_var and var should be resolved by the linker.
+# The relocation for local_var{0, 1, 2} and 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: R_AMDGPU_ABS64 common_var0 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 common_var1 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 common_var2 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 extern_var0 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 extern_var1 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 extern_var2 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 global_var0 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 global_var1 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 global_var2 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weak_var0 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weak_var1 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weak_var2 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var0 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var1 0x0
+# CHECK-NEXT: R_AMDGPU_ABS64 weakref_alias_var2 0x0
 # CHECK-NEXT: }
 # CHECK-NEXT: ]
 
 # OBJDUMP: Contents of section nonalloc:
-# OBJDUMP-NEXT: 0000 00000000 00300000
+# OBJDUMP-NEXT: 0000 00000000 04380000 00000000 08340000
+# OBJDUMP-NEXT: 00000000 0c300000