diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index d0795705293e..c4c93cb72aae 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -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 { diff --git a/lld/test/ELF/aarch64-relative.s b/lld/test/ELF/aarch64-relative.s index cd33d0932782..e2ff69d4f10d 100644 --- a/lld/test/ELF/aarch64-relative.s +++ b/lld/test/ELF/aarch64-relative.s @@ -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: ]