Skip to content

Commit 60c1020

Browse files
authored
[AArch64][AsmParser] Add MC support for %dtprel() relocation (llvm#186599)
This patch adds support for the %dtprel relocation specifier in the AArch64 assembler. This specifier is used to generate the R_AARCH64_TLS_DTPREL64 relocation, which is used in .debug_info sections to describe the location of thread-local variables. Prerequisite for llvm#146572
1 parent b37f8a5 commit 60c1020

4 files changed

Lines changed: 34 additions & 0 deletions

File tree

‎llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4659,6 +4659,7 @@ bool AArch64AsmParser::parseSymbolicImmVal(const MCExpr *&ImmVal) {
46594659
.Case("prel_g1_nc", AArch64::S_PREL_G1_NC)
46604660
.Case("prel_g0", AArch64::S_PREL_G0)
46614661
.Case("prel_g0_nc", AArch64::S_PREL_G0_NC)
4662+
.Case("dtprel", AArch64::S_DTPREL)
46624663
.Case("dtprel_g2", AArch64::S_DTPREL_G2)
46634664
.Case("dtprel_g1", AArch64::S_DTPREL_G1)
46644665
.Case("dtprel_g1_nc", AArch64::S_DTPREL_G1_NC)

‎llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFObjectWriter.cpp‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,8 @@ unsigned AArch64ELFObjectWriter::getRelocType(const MCFixup &Fixup,
249249
}
250250
if (RefKind == AArch64::S_AUTH || RefKind == AArch64::S_AUTHADDR)
251251
return ELF::R_AARCH64_AUTH_ABS64;
252+
if (RefKind == AArch64::S_DTPREL)
253+
return ELF::R_AARCH64_TLS_DTPREL64;
252254
if (RefKind == AArch64::S_FUNCINIT)
253255
return ELF::R_AARCH64_FUNCINIT64;
254256
return ELF::R_AARCH64_ABS64;
@@ -465,6 +467,8 @@ unsigned AArch64ELFObjectWriter::getRelocType(const MCFixup &Fixup,
465467
return R_CLS(MOVW_PREL_G0);
466468
if (RefKind == AArch64::S_PREL_G0_NC)
467469
return R_CLS(MOVW_PREL_G0_NC);
470+
if (RefKind == AArch64::S_DTPREL)
471+
return ELF::R_AARCH64_TLS_DTPREL64;
468472
if (RefKind == AArch64::S_DTPREL_G2)
469473
return ELF::R_AARCH64_TLSLD_MOVW_DTPREL_G2;
470474
if (RefKind == AArch64::S_DTPREL_G1)

‎llvm/lib/Target/AArch64/MCTargetDesc/AArch64MCAsmInfo.cpp‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ StringRef AArch64::getSpecifierName(AArch64::Specifier S) {
114114

115115
case AArch64::S_GOTPCREL: return "%gotpcrel";
116116
case AArch64::S_PLT: return "%pltpcrel";
117+
case AArch64::S_DTPREL: return "%dtprel";
117118
case AArch64::S_FUNCINIT: return "%funcinit";
118119
default:
119120
llvm_unreachable("Invalid relocation specifier");
@@ -125,6 +126,7 @@ AArch64::Specifier AArch64::parsePercentSpecifierName(StringRef name) {
125126
return StringSwitch<AArch64::Specifier>(name)
126127
.Case("pltpcrel", AArch64::S_PLT)
127128
.Case("gotpcrel", AArch64::S_GOTPCREL)
129+
.Case("dtprel", AArch64::S_DTPREL)
128130
.Case("funcinit", AArch64::S_FUNCINIT)
129131
.Default(0);
130132
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: llvm-mc -triple=aarch64 -show-encoding < %s | FileCheck %s
2+
// RUN: llvm-mc -filetype=obj -triple=aarch64 %s | llvm-readobj -r - | FileCheck --check-prefix=CHECK-ELF %s
3+
4+
# CHECK: .xword %dtprel(var)
5+
# CHECK: .xword %dtprel(var+1)
6+
# CHECK: .xword %dtprel(.tdata)
7+
# CHECK: .xword %dtprel(.tdata+1)
8+
9+
# CHECK-ELF: Relocations [
10+
# CHECK-ELF: Section (5) .rela.debug_info {
11+
# CHECK-ELF: 0x0 R_AARCH64_TLS_DTPREL64 var 0x0
12+
# CHECK-ELF: 0x8 R_AARCH64_TLS_DTPREL64 var 0x1
13+
# CHECK-ELF: 0x10 R_AARCH64_TLS_DTPREL64 .tdata 0x0
14+
# CHECK-ELF: 0x18 R_AARCH64_TLS_DTPREL64 .tdata 0x1
15+
# CHECK-ELF: }
16+
17+
.section .tdata,"awT",@progbits
18+
.skip 8
19+
.globl var
20+
var:
21+
.word 0
22+
23+
.section .debug_info,"",@progbits
24+
.xword %dtprel(var)
25+
.xword %dtprel(var+1)
26+
.xword %dtprel(.tdata)
27+
.xword %dtprel(.tdata+1)

0 commit comments

Comments
 (0)