[ELF/AArch64] Implement some UABS relocs
authorEugene Leviant <evgeny.leviant@gmail.com>
Mon, 12 Sep 2016 10:02:41 +0000 (10:02 +0000)
committerEugene Leviant <evgeny.leviant@gmail.com>
Mon, 12 Sep 2016 10:02:41 +0000 (10:02 +0000)
Differential revision: https://reviews.llvm.org/D24403

llvm-svn: 281202

lld/ELF/Target.cpp
lld/test/ELF/Inputs/uabs_label.s [new file with mode: 0644]
lld/test/ELF/aarch64-relocs.s

index 98bb8dbab0c2548e2aed07808565f8bf40ad37b9..7690071d358c8eb05364a125a814291c786f8327 100644 (file)
@@ -1357,6 +1357,18 @@ void AArch64TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
   case R_AARCH64_LDST64_ABS_LO12_NC:
     or32le(Loc, (Val & 0xFF8) << 7);
     break;
+  case R_AARCH64_MOVW_UABS_G0_NC:
+    or32le(Loc, (Val & 0xFFFF) << 5);
+    break;
+  case R_AARCH64_MOVW_UABS_G1_NC:
+    or32le(Loc, (Val & 0xFFFF0000) >> 11);
+    break;
+  case R_AARCH64_MOVW_UABS_G2_NC:
+    or32le(Loc, (Val & 0xFFFF00000000) >> 27);
+    break;
+  case R_AARCH64_MOVW_UABS_G3:
+    or32le(Loc, (Val & 0xFFFF000000000000) >> 43);
+    break;
   case R_AARCH64_TSTBR14:
     checkInt<16>(Val, Type);
     or32le(Loc, (Val & 0xFFFC) << 3);
diff --git a/lld/test/ELF/Inputs/uabs_label.s b/lld/test/ELF/Inputs/uabs_label.s
new file mode 100644 (file)
index 0000000..b2a6721
--- /dev/null
@@ -0,0 +1,4 @@
+# Sample label to test R_AARCH64_MOVW_UABS relocations
+
+.globl uabs_label
+uabs_label = 0xF000E000D000C
index 90541329587a88b48ca7b0164f6a1a1bc81dc47f..cb2780b330238169a48e76a6bfe790701b7cdb59 100644 (file)
@@ -1,5 +1,6 @@
 # RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %s -o %t
-# RUN: ld.lld %t -o %t2
+# RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %p/Inputs/uabs_label.s -o %t2.o
+# RUN: ld.lld %t %t2.o -o %t2
 # RUN: llvm-objdump -d %t2 | FileCheck %s
 # REQUIRES: aarch64
 
@@ -150,3 +151,20 @@ foo16:
 # CHECK: Disassembly of section .R_AARCH64_LDST16_ABS_LO12_NC:
 # CHECK-NEXT: ldst16:
 # CHECK-NEXT:   11054:       71 b2 40 7d     ldr     h17, [x19, #88]
+
+.section .R_AARCH64_MOVW_UABS,"ax",@progbits
+movz1:
+   movk x12, #:abs_g0_nc:uabs_label
+   movk x13, #:abs_g1_nc:uabs_label
+   movk x14, #:abs_g2_nc:uabs_label
+   movz x15, #:abs_g3:uabs_label
+   movk x16, #:abs_g3:uabs_label
+
+## 4222124650659840 == (0xF << 48)
+# CHECK: Disassembly of section .R_AARCH64_MOVW_UABS:
+# CHECK-NEXT: movz1:
+# CHECK-NEXT: 8c 01 80 f2   movk  x12, #12
+# CHECK-NEXT: ad 01 a0 f2   movk  x13, #13, lsl #16
+# CHECK-NEXT: ce 01 c0 f2   movk  x14, #14, lsl #32
+# CHECK-NEXT: ef 01 e0 d2   mov x15, #4222124650659840
+# CHECK-NEXT: f0 01 e0 f2   movk  x16, #15, lsl #48