Skip to content

Commit 9f4b637

Browse files
authored
[BOLT][AArch64] Skip R_AARCH64_TLSDESC_CALL relocation (#161610)
R_AARCH64_TLSDESC_CALL is a relocation emitted as a hint for a linker to replace `blr r` instruction with nop. BOLT does not currently require any special handling for it. Note that previously existing extraction of the relocated value was incorrect.
1 parent 8b9e208 commit 9f4b637

File tree

2 files changed

+43
-7
lines changed

2 files changed

+43
-7
lines changed

bolt/lib/Core/Relocation.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ static bool isSupportedAArch64(uint32_t Type) {
8181
case ELF::R_AARCH64_LD64_GOT_LO12_NC:
8282
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
8383
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
84-
case ELF::R_AARCH64_TLSDESC_CALL:
8584
case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
8685
case ELF::R_AARCH64_PREL16:
8786
case ELF::R_AARCH64_PREL32:
@@ -193,7 +192,6 @@ static size_t getSizeForTypeAArch64(uint32_t Type) {
193192
case ELF::R_AARCH64_LD64_GOT_LO12_NC:
194193
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
195194
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
196-
case ELF::R_AARCH64_TLSDESC_CALL:
197195
case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
198196
case ELF::R_AARCH64_PREL32:
199197
case ELF::R_AARCH64_MOVW_UABS_G0:
@@ -248,7 +246,14 @@ static bool skipRelocationTypeX86(uint32_t Type) {
248246
}
249247

250248
static bool skipRelocationTypeAArch64(uint32_t Type) {
251-
return Type == ELF::R_AARCH64_NONE || Type == ELF::R_AARCH64_LD_PREL_LO19;
249+
switch (Type) {
250+
default:
251+
return false;
252+
case ELF::R_AARCH64_NONE:
253+
case ELF::R_AARCH64_LD_PREL_LO19:
254+
case ELF::R_AARCH64_TLSDESC_CALL:
255+
return true;
256+
}
252257
}
253258

254259
static bool skipRelocationTypeRISCV(uint32_t Type) {
@@ -362,7 +367,6 @@ static uint64_t extractValueAArch64(uint32_t Type, uint64_t Contents,
362367
return static_cast<int64_t>(PC) + SignExtend64<32>(Contents & 0xffffffff);
363368
case ELF::R_AARCH64_PREL64:
364369
return static_cast<int64_t>(PC) + Contents;
365-
case ELF::R_AARCH64_TLSDESC_CALL:
366370
case ELF::R_AARCH64_JUMP26:
367371
case ELF::R_AARCH64_CALL26:
368372
// Immediate goes in bits 25:0 of B and BL.
@@ -552,7 +556,6 @@ static bool isGOTAArch64(uint32_t Type) {
552556
case ELF::R_AARCH64_TLSDESC_ADR_PAGE21:
553557
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
554558
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
555-
case ELF::R_AARCH64_TLSDESC_CALL:
556559
return true;
557560
}
558561
}
@@ -591,7 +594,6 @@ static bool isTLSAArch64(uint32_t Type) {
591594
case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
592595
case ELF::R_AARCH64_TLSDESC_LD64_LO12:
593596
case ELF::R_AARCH64_TLSDESC_ADD_LO12:
594-
case ELF::R_AARCH64_TLSDESC_CALL:
595597
case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
596598
return true;
597599
}
@@ -667,7 +669,6 @@ static bool isPCRelativeAArch64(uint32_t Type) {
667669
case ELF::R_AARCH64_MOVW_UABS_G2_NC:
668670
case ELF::R_AARCH64_MOVW_UABS_G3:
669671
return false;
670-
case ELF::R_AARCH64_TLSDESC_CALL:
671672
case ELF::R_AARCH64_CALL26:
672673
case ELF::R_AARCH64_JUMP26:
673674
case ELF::R_AARCH64_TSTBR14:

bolt/test/AArch64/tls-desc-call.s

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# RUN: %clang %cflags %s -o %t.so -fPIC -shared -Wl,-q
2+
# RUN: llvm-bolt %t.so -o %t.bolt --debug-only=bolt 2>&1 | FileCheck %s
3+
4+
# REQUIRES: asserts
5+
6+
## Verify that R_AARCH64_TLSDESC_CALL relocations are ignored
7+
8+
# CHECK-NOT: Relocation {{.*}} R_AARCH64_TLSDESC_CALL
9+
10+
.text
11+
.globl get_tls_var
12+
.p2align 2
13+
.type get_tls_var,@function
14+
get_tls_var:
15+
.cfi_startproc
16+
str x30, [sp, #-16]!
17+
adrp x0, :tlsdesc:tls_var
18+
ldr x1, [x0, :tlsdesc_lo12:tls_var]
19+
add x0, x0, :tlsdesc_lo12:tls_var
20+
.tlsdesccall tls_var
21+
blr x1
22+
mrs x8, TPIDR_EL0
23+
ldr w0, [x8, x0]
24+
ldr x30, [sp], #16
25+
ret
26+
.size get_tls_var, .-get_tls_var
27+
.cfi_endproc
28+
29+
.type tls_var,@object
30+
.section .tdata,"awT",@progbits
31+
.globl tls_var
32+
.p2align 2, 0x0
33+
tls_var:
34+
.word 42
35+
.size tls_var, 4

0 commit comments

Comments
 (0)