Simplify AArch64 isRelRelative
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 24 Mar 2016 19:12:14 +0000 (19:12 +0000)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 24 Mar 2016 19:12:14 +0000 (19:12 +0000)
This patch simplifies the isRelRelative for AArch64 and add the missing
ones for bootstrap and test-suite.  It also adds more testing for
shared object creation.

llvm-svn: 264322

lld/ELF/Target.cpp
lld/test/ELF/aarch64-relative.s

index d079570..c4c93cb 100644 (file)
@@ -1223,12 +1223,25 @@ AArch64TargetInfo::AArch64TargetInfo() {
 }
 
 bool AArch64TargetInfo::isRelRelative(uint32_t Type) const {
-  return Type == R_AARCH64_PREL32 || Type == R_AARCH64_ADR_PREL_PG_HI21 ||
-         Type == R_AARCH64_LDST8_ABS_LO12_NC ||
-         Type == R_AARCH64_LDST32_ABS_LO12_NC ||
-         Type == R_AARCH64_LDST64_ABS_LO12_NC ||
-         Type == R_AARCH64_ADD_ABS_LO12_NC || Type == R_AARCH64_CALL26 ||
-         Type == R_AARCH64_CONDBR19;
+  switch (Type) {
+  default:
+    return false;
+  case R_AARCH64_PREL32:
+  case R_AARCH64_ADR_PREL_LO21:
+  case R_AARCH64_ADR_PREL_PG_HI21:
+  case R_AARCH64_ADR_GOT_PAGE:
+  case R_AARCH64_LDST8_ABS_LO12_NC:
+  case R_AARCH64_LDST16_ABS_LO12_NC:
+  case R_AARCH64_LDST32_ABS_LO12_NC:
+  case R_AARCH64_LDST64_ABS_LO12_NC:
+  case R_AARCH64_LDST128_ABS_LO12_NC:
+  case R_AARCH64_ADD_ABS_LO12_NC:
+  case R_AARCH64_CALL26:
+  case R_AARCH64_JUMP26:
+  case R_AARCH64_CONDBR19:
+  case R_AARCH64_TSTBR14:
+    return true;
+  }
 }
 
 bool AArch64TargetInfo::isTlsGlobalDynamicRel(uint32_t Type) const {
index cd33d09..e2ff69d 100644 (file)
@@ -2,19 +2,25 @@
 // RUN: llvm-mc -filetype=obj -triple=aarch64-unknown-freebsd %s -o %t.o
 // RUN: ld.lld %t.o -o %t.so -shared
 // RUN: llvm-readobj -r %t.so | FileCheck %s
-        adrp    x8, .Lfoo
-        strb    w9, [x8, :lo12:.Lfoo]
-        ldr     w0, [x8, :lo12:.Lfoo]
-        ldr     x0, [x8, :lo12:.Lfoo]
-        add     x0, x0, :lo12:.Lfoo
-        bl      .Lfoo
-        b.eq    .Lfoo
 
-        .data
-        .Lfoo:
+  adr     x8, .Lfoo                 // R_AARCH64_ADR_PREL_LO21
+  adrp    x8, .Lfoo                 // R_AARCH64_ADR_PREL_PG_HI21
+  strb    w9, [x8, :lo12:.Lfoo]     // R_AARCH64_LDST8_ABS_LO12_NC
+  ldr     h17, [x19, :lo12:.Lfoo]   // R_AARCH64_LDST16_ABS_LO12_NC
+  ldr     w0, [x8, :lo12:.Lfoo]     // R_AARCH64_LDST32_ABS_LO12_NC
+  ldr     x0, [x8, :lo12:.Lfoo]     // R_AARCH64_LDST64_ABS_LO12_NC
+  ldr     q20, [x19, #:lo12:.Lfoo]  // R_AARCH64_LDST128_ABS_LO12_NC
+  add     x0, x0, :lo12:.Lfoo       // R_AARCH64_ADD_ABS_LO12_NC
+  bl      .Lfoo                     // R_AARCH64_CALL26
+  b       .Lfoo                     // R_AARCH64_JUMP26
+  beq     .Lfoo                     // R_AARCH64_CONDBR19
+.Lbranch:
+  tbz     x1, 7, .Lbranch           // R_AARCH64_TSTBR14
+.data
+.Lfoo:
 
-        .rodata
-        .long .Lfoo - .
+.rodata
+.long .Lfoo - .
 
 // CHECK:      Relocations [
 // CHECK-NEXT: ]