Skip to content

Commit d8df046

Browse files
author
git apple-llvm automerger
committed
Merge commit '652a8f150d49' from llvm.org/master into apple/main
2 parents dedb944 + 652a8f1 commit d8df046

File tree

16 files changed

+171
-12
lines changed

16 files changed

+171
-12
lines changed

llvm/include/llvm/BinaryFormat/ELFRelocs/PowerPC64.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@
101101
#undef R_PPC64_PCREL34
102102
#undef R_PPC64_GOT_PCREL34
103103
#undef R_PPC64_TPREL34
104+
#undef R_PPC64_DTPREL34
104105
#undef R_PPC64_GOT_TLSGD_PCREL34
106+
#undef R_PPC64_GOT_TLSLD_PCREL34
105107
#undef R_PPC64_GOT_TPREL_PCREL34
106108
#undef R_PPC64_IRELATIVE
107109
#undef R_PPC64_REL16
@@ -202,7 +204,9 @@ ELF_RELOC(R_PPC64_PCREL_OPT, 123)
202204
ELF_RELOC(R_PPC64_PCREL34, 132)
203205
ELF_RELOC(R_PPC64_GOT_PCREL34, 133)
204206
ELF_RELOC(R_PPC64_TPREL34, 146)
207+
ELF_RELOC(R_PPC64_DTPREL34, 147)
205208
ELF_RELOC(R_PPC64_GOT_TLSGD_PCREL34, 148)
209+
ELF_RELOC(R_PPC64_GOT_TLSLD_PCREL34, 149)
206210
ELF_RELOC(R_PPC64_GOT_TPREL_PCREL34, 150)
207211
ELF_RELOC(R_PPC64_IRELATIVE, 248)
208212
ELF_RELOC(R_PPC64_REL16, 249)

llvm/include/llvm/MC/MCExpr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,7 @@ class MCSymbolRefExpr : public MCExpr {
300300
VK_PPC_GOT_TLSLD_HA, // symbol@got@tlsld@ha
301301
VK_PPC_GOT_PCREL, // symbol@got@pcrel
302302
VK_PPC_GOT_TLSGD_PCREL, // symbol@got@tlsgd@pcrel
303+
VK_PPC_GOT_TLSLD_PCREL, // symbol@got@tlsld@pcrel
303304
VK_PPC_GOT_TPREL_PCREL, // symbol@got@tprel@pcrel
304305
VK_PPC_TLS_PCREL, // symbol@tls@pcrel
305306
VK_PPC_TLSLD, // symbol@tlsld

llvm/lib/MC/MCExpr.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
324324
return "got@pcrel";
325325
case VK_PPC_GOT_TLSGD_PCREL:
326326
return "got@tlsgd@pcrel";
327+
case VK_PPC_GOT_TLSLD_PCREL:
328+
return "got@tlsld@pcrel";
327329
case VK_PPC_GOT_TPREL_PCREL:
328330
return "got@tprel@pcrel";
329331
case VK_PPC_TLS_PCREL:
@@ -461,6 +463,7 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
461463
.Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA)
462464
.Case("got@pcrel", VK_PPC_GOT_PCREL)
463465
.Case("got@tlsgd@pcrel", VK_PPC_GOT_TLSGD_PCREL)
466+
.Case("got@tlsld@pcrel", VK_PPC_GOT_TLSLD_PCREL)
464467
.Case("got@tprel@pcrel", VK_PPC_GOT_TPREL_PCREL)
465468
.Case("tls@pcrel", VK_PPC_TLS_PCREL)
466469
.Case("notoc", VK_PPC_NOTOC)

llvm/lib/Target/PowerPC/MCTargetDesc/PPCELFObjectWriter.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
141141
case MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL:
142142
Type = ELF::R_PPC64_GOT_TLSGD_PCREL34;
143143
break;
144+
case MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL:
145+
Type = ELF::R_PPC64_GOT_TLSLD_PCREL34;
146+
break;
144147
case MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL:
145148
Type = ELF::R_PPC64_GOT_TPREL_PCREL34;
146149
break;
@@ -422,6 +425,9 @@ unsigned PPCELFObjectWriter::getRelocType(MCContext &Ctx, const MCValue &Target,
422425
switch (Modifier) {
423426
default:
424427
report_fatal_error("Unsupported Modifier for fixup_ppc_imm34.");
428+
case MCSymbolRefExpr::VK_DTPREL:
429+
Type = ELF::R_PPC64_DTPREL34;
430+
break;
425431
case MCSymbolRefExpr::VK_TPREL:
426432
Type = ELF::R_PPC64_TPREL34;
427433
break;

llvm/lib/Target/PowerPC/MCTargetDesc/PPCMCCodeEmitter.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,11 @@ PPCMCCodeEmitter::getMemRI34PCRelEncoding(const MCInst &MI, unsigned OpNo,
233233
assert((SRE->getKind() == MCSymbolRefExpr::VK_PCREL ||
234234
SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_PCREL ||
235235
SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL ||
236+
SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL ||
236237
SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL) &&
237238
"VariantKind must be VK_PCREL or VK_PPC_GOT_PCREL or "
238-
"VK_PPC_GOT_TLSGD_PCREL or VK_PPC_GOT_TPREL_PCREL");
239+
"VK_PPC_GOT_TLSGD_PCREL or VK_PPC_GOT_TLSLD_PCREL or "
240+
"VK_PPC_GOT_TPREL_PCREL.");
239241
// Generate the fixup for the relocation.
240242
Fixups.push_back(
241243
MCFixup::create(0, Expr,

llvm/lib/Target/PowerPC/PPC.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,11 +123,20 @@ FunctionPass *createPPCCTRLoops();
123123
/// TLS Initial Exec model.
124124
MO_TPREL_FLAG = 64,
125125

126+
/// MO_TLSLD_FLAG - If this bit is set the symbol reference is relative to
127+
/// TLS Local Dynamic model.
128+
MO_TLSLD_FLAG = 128,
129+
126130
/// MO_GOT_TLSGD_PCREL_FLAG - A combintaion of flags, if these bits are set
127131
/// they should produce the relocation @got@tlsgd@pcrel.
128132
/// Fix up is VK_PPC_GOT_TLSGD_PCREL
129133
MO_GOT_TLSGD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSGD_FLAG,
130134

135+
/// MO_GOT_TLSLD_PCREL_FLAG - A combintaion of flags, if these bits are set
136+
/// they should produce the relocation @got@tlsld@pcrel.
137+
/// Fix up is VK_PPC_GOT_TLSLD_PCREL
138+
MO_GOT_TLSLD_PCREL_FLAG = MO_PCREL_FLAG | MO_GOT_FLAG | MO_TLSLD_FLAG,
139+
131140
/// MO_GOT_TPREL_PCREL_FLAG - A combintaion of flags, if these bits are set
132141
/// they should produce the relocation @got@tprel@pcrel.
133142
/// Fix up is VK_PPC_GOT_TPREL_PCREL

llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,8 @@ void PPCAsmPrinter::EmitTlsCall(const MachineInstr *MI,
491491
unsigned Opcode = PPC::BL8_NOP_TLS;
492492

493493
assert(MI->getNumOperands() >= 3 && "Expecting at least 3 operands from MI");
494-
if (MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSGD_PCREL_FLAG) {
494+
if (MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSGD_PCREL_FLAG ||
495+
MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSLD_PCREL_FLAG) {
495496
Kind = MCSymbolRefExpr::VK_PPC_NOTOC;
496497
Opcode = PPC::BL8_NOTOC_TLS;
497498
}
@@ -1146,6 +1147,21 @@ void PPCAsmPrinter::emitInstruction(const MachineInstr *MI) {
11461147
.addExpr(SymDtprel));
11471148
return;
11481149
}
1150+
case PPC::PADDIdtprel: {
1151+
// Transform: %rd = PADDIdtprel %rs, @sym
1152+
// Into: %rd = PADDI8 %rs, sym@dtprel
1153+
const MachineOperand &MO = MI->getOperand(2);
1154+
const GlobalValue *GValue = MO.getGlobal();
1155+
MCSymbol *MOSymbol = getSymbol(GValue);
1156+
const MCExpr *SymDtprel = MCSymbolRefExpr::create(
1157+
MOSymbol, MCSymbolRefExpr::VK_DTPREL, OutContext);
1158+
EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::PADDI8)
1159+
.addReg(MI->getOperand(0).getReg())
1160+
.addReg(MI->getOperand(1).getReg())
1161+
.addExpr(SymDtprel));
1162+
return;
1163+
}
1164+
11491165
case PPC::ADDIdtprelL:
11501166
// Transform: %xd = ADDIdtprelL %xs, @sym
11511167
// Into: %xd = ADDI8 %xs, sym@dtprel@l

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,8 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
14991499
case PPCISD::ADDI_TLSLD_L_ADDR: return "PPCISD::ADDI_TLSLD_L_ADDR";
15001500
case PPCISD::ADDIS_DTPREL_HA: return "PPCISD::ADDIS_DTPREL_HA";
15011501
case PPCISD::ADDI_DTPREL_L: return "PPCISD::ADDI_DTPREL_L";
1502+
case PPCISD::PADDI_DTPREL:
1503+
return "PPCISD::PADDI_DTPREL";
15021504
case PPCISD::VADD_SPLAT: return "PPCISD::VADD_SPLAT";
15031505
case PPCISD::SC: return "PPCISD::SC";
15041506
case PPCISD::CLRBHRB: return "PPCISD::CLRBHRB";
@@ -3098,6 +3100,14 @@ SDValue PPCTargetLowering::LowerGlobalTLSAddress(SDValue Op,
30983100
}
30993101

31003102
if (Model == TLSModel::LocalDynamic) {
3103+
if (Subtarget.isUsingPCRelativeCalls()) {
3104+
SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0,
3105+
PPCII::MO_GOT_TLSLD_PCREL_FLAG);
3106+
SDValue MatPCRel =
3107+
DAG.getNode(PPCISD::TLS_DYNAMIC_MAT_PCREL_ADDR, dl, PtrVT, TGA);
3108+
return DAG.getNode(PPCISD::PADDI_DTPREL, dl, PtrVT, MatPCRel, TGA);
3109+
}
3110+
31013111
SDValue TGA = DAG.getTargetGlobalAddress(GV, dl, PtrVT, 0, 0);
31023112
SDValue GOTPtr;
31033113
if (is64bit) {

llvm/lib/Target/PowerPC/PPCISelLowering.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,10 @@ namespace llvm {
381381
/// sym\@got\@dtprel\@l.
382382
ADDI_DTPREL_L,
383383

384+
/// G8RC = PADDI_DTPREL %x3, Symbol - For the pc-rel based local-dynamic TLS
385+
/// model, produces a PADDI8 instruction that adds X3 to sym\@dtprel.
386+
PADDI_DTPREL,
387+
384388
/// VRRC = VADD_SPLAT Elt, EltSize - Temporary node to be expanded
385389
/// during instruction selection to optimize a BUILD_VECTOR into
386390
/// operations on splats. This is necessary to avoid losing these

llvm/lib/Target/PowerPC/PPCInstr64Bit.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,6 +1332,11 @@ def ADDIdtprelL : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm
13321332
[(set i64:$rD,
13331333
(PPCaddiDtprelL i64:$reg, tglobaltlsaddr:$disp))]>,
13341334
isPPC64;
1335+
def PADDIdtprel : PPCEmitTimePseudo<(outs g8rc:$rD), (ins g8rc_nox0:$reg, s16imm64:$disp),
1336+
"#PADDIdtprel",
1337+
[(set i64:$rD,
1338+
(PPCpaddiDtprel i64:$reg, tglobaltlsaddr:$disp))]>,
1339+
isPPC64;
13351340

13361341
let PPC970_Unit = 2 in {
13371342
let Interpretation64Bit = 1, isCodeGenOnly = 1 in {

llvm/lib/Target/PowerPC/PPCInstrInfo.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,8 +2380,10 @@ PPCInstrInfo::getSerializableBitmaskMachineOperandTargetFlags() const {
23802380
{MO_GOT_FLAG, "ppc-got"},
23812381
{MO_PCREL_OPT_FLAG, "ppc-opt-pcrel"},
23822382
{MO_TLSGD_FLAG, "ppc-tlsgd"},
2383+
{MO_TLSLD_FLAG, "ppc-tlsld"},
23832384
{MO_TPREL_FLAG, "ppc-tprel"},
23842385
{MO_GOT_TLSGD_PCREL_FLAG, "ppc-got-tlsgd-pcrel"},
2386+
{MO_GOT_TLSLD_PCREL_FLAG, "ppc-got-tlsld-pcrel"},
23852387
{MO_GOT_TPREL_PCREL_FLAG, "ppc-got-tprel-pcrel"}};
23862388
return makeArrayRef(TargetFlags);
23872389
}

llvm/lib/Target/PowerPC/PPCInstrInfo.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ def PPCaddiTlsldLAddr : SDNode<"PPCISD::ADDI_TLSLD_L_ADDR",
222222
SDTCisSameAs<0, 3>, SDTCisInt<0> ]>>;
223223
def PPCaddisDtprelHA : SDNode<"PPCISD::ADDIS_DTPREL_HA", SDTIntBinOp>;
224224
def PPCaddiDtprelL : SDNode<"PPCISD::ADDI_DTPREL_L", SDTIntBinOp>;
225+
def PPCpaddiDtprel : SDNode<"PPCISD::PADDI_DTPREL", SDTIntBinOp>;
225226

226227
def PPCvperm : SDNode<"PPCISD::VPERM", SDT_PPCvperm, []>;
227228
def PPCxxsplt : SDNode<"PPCISD::XXSPLT", SDT_PPCVecSplat, []>;

llvm/lib/Target/PowerPC/PPCMCInstLower.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol,
9090
RefKind = MCSymbolRefExpr::VK_TPREL;
9191
else if (MO.getTargetFlags() == PPCII::MO_GOT_TLSGD_PCREL_FLAG)
9292
RefKind = MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL;
93+
else if (MO.getTargetFlags() == PPCII::MO_GOT_TLSLD_PCREL_FLAG)
94+
RefKind = MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL;
9395
else if (MO.getTargetFlags() == PPCII::MO_GOT_TPREL_PCREL_FLAG)
9496
RefKind = MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL;
9597

llvm/lib/Target/PowerPC/PPCTLSDynamicCall.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,17 +50,17 @@ namespace {
5050
bool Changed = false;
5151
bool NeedFence = true;
5252
bool Is64Bit = MBB.getParent()->getSubtarget<PPCSubtarget>().isPPC64();
53-
bool IsTLSGDPCREL = false;
53+
bool IsPCREL = false;
5454

5555
for (MachineBasicBlock::iterator I = MBB.begin(), IE = MBB.end();
5656
I != IE;) {
5757
MachineInstr &MI = *I;
58-
IsTLSGDPCREL = isTLSGDPCREL(MI);
58+
IsPCREL = isPCREL(MI);
5959

6060
if (MI.getOpcode() != PPC::ADDItlsgdLADDR &&
6161
MI.getOpcode() != PPC::ADDItlsldLADDR &&
6262
MI.getOpcode() != PPC::ADDItlsgdLADDR32 &&
63-
MI.getOpcode() != PPC::ADDItlsldLADDR32 && !IsTLSGDPCREL) {
63+
MI.getOpcode() != PPC::ADDItlsldLADDR32 && !IsPCREL) {
6464
// Although we create ADJCALLSTACKDOWN and ADJCALLSTACKUP
6565
// as scheduling fences, we skip creating fences if we already
6666
// have existing ADJCALLSTACKDOWN/UP to avoid nesting,
@@ -80,7 +80,7 @@ namespace {
8080
Register InReg = PPC::NoRegister;
8181
Register GPR3 = Is64Bit ? PPC::X3 : PPC::R3;
8282
SmallVector<Register, 3> OrigRegs = {OutReg, GPR3};
83-
if (!IsTLSGDPCREL) {
83+
if (!IsPCREL) {
8484
InReg = MI.getOperand(1).getReg();
8585
OrigRegs.push_back(InReg);
8686
}
@@ -107,9 +107,12 @@ namespace {
107107
Opc2 = PPC::GETtlsldADDR32;
108108
break;
109109
case PPC::PADDI8pc:
110-
assert(IsTLSGDPCREL && "Expecting General Dynamic PCRel");
110+
assert(IsPCREL && "Expecting General/Local Dynamic PCRel");
111111
Opc1 = PPC::PADDI8pc;
112-
Opc2 = PPC::GETtlsADDR;
112+
Opc2 = MI.getOperand(2).getTargetFlags() ==
113+
PPCII::MO_GOT_TLSGD_PCREL_FLAG
114+
? PPC::GETtlsADDR
115+
: PPC::GETtlsldADDR;
113116
}
114117

115118
// We create ADJCALLSTACKUP and ADJCALLSTACKDOWN around _tls_get_addr
@@ -123,7 +126,7 @@ namespace {
123126
.addImm(0);
124127

125128
MachineInstr *Addi;
126-
if (IsTLSGDPCREL) {
129+
if (IsPCREL) {
127130
Addi = BuildMI(MBB, I, DL, TII->get(Opc1), GPR3).addImm(0);
128131
} else {
129132
// Expand into two ops built prior to the existing instruction.
@@ -140,7 +143,7 @@ namespace {
140143

141144
MachineInstr *Call = (BuildMI(MBB, I, DL, TII->get(Opc2), GPR3)
142145
.addReg(GPR3));
143-
if (IsTLSGDPCREL)
146+
if (IsPCREL)
144147
Call->addOperand(MI.getOperand(2));
145148
else
146149
Call->addOperand(MI.getOperand(3));
@@ -168,11 +171,14 @@ namespace {
168171
}
169172

170173
public:
171-
bool isTLSGDPCREL(const MachineInstr &MI) {
174+
bool isPCREL(const MachineInstr &MI) {
172175
return (MI.getOpcode() == PPC::PADDI8pc) &&
173176
(MI.getOperand(2).getTargetFlags() ==
174-
PPCII::MO_GOT_TLSGD_PCREL_FLAG);
177+
PPCII::MO_GOT_TLSGD_PCREL_FLAG ||
178+
MI.getOperand(2).getTargetFlags() ==
179+
PPCII::MO_GOT_TLSLD_PCREL_FLAG);
175180
}
181+
176182
bool runOnMachineFunction(MachineFunction &MF) override {
177183
TII = MF.getSubtarget<PPCSubtarget>().getInstrInfo();
178184
LIS = &getAnalysis<LiveIntervals>();
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 \
2+
; RUN: -ppc-asm-full-reg-names --relocation-model=pic -enable-ppc-pcrel-tls < %s | FileCheck %s --check-prefix=CHECK-S
3+
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr10 \
4+
; RUN: -ppc-asm-full-reg-names --relocation-model=pic -enable-ppc-pcrel-tls --filetype=obj < %s | \
5+
; RUN: llvm-objdump --mcpu=pwr10 --no-show-raw-insn -dr - | FileCheck %s --check-prefix=CHECK-O
6+
7+
; These test cases are to ensure that when using pc relative memory operations
8+
; ABI correct code and relocations are produced for Local Dynamic TLS Model.
9+
10+
@x = hidden thread_local global i32 0, align 4
11+
12+
define nonnull i32* @LocalDynamicAddressLoad() {
13+
; CHECK-S-LABEL: LocalDynamicAddressLoad:
14+
; CHECK-S: paddi r3, 0, x@got@tlsld@pcrel, 1
15+
; CHECK-S-NEXT: bl __tls_get_addr@notoc(x@tlsld)
16+
; CHECK-S-NEXT: paddi r3, r3, x@DTPREL, 0
17+
; CHECK-S-NEXT: addi r1, r1, 32
18+
; CHECK-S-NEXT: ld r0, 16(r1)
19+
; CHECK-S-NEXT: mtlr r0
20+
; CHECK-S-NEXT: blr
21+
; CHECK-O-LABEL: <LocalDynamicAddressLoad>:
22+
; CHECK-O: c: paddi 3, 0, 0, 1
23+
; CHECK-O-NEXT: 000000000000000c: R_PPC64_GOT_TLSLD_PCREL34 x
24+
; CHECK-O-NEXT: 14: bl 0x14
25+
; CHECK-O-NEXT: 0000000000000014: R_PPC64_TLSLD x
26+
; CHECK-O-NEXT: 0000000000000014: R_PPC64_REL24_NOTOC __tls_get_addr
27+
; CHECK-O-NEXT: 18: paddi 3, 3, 0, 0
28+
; CHECK-O-NEXT: 0000000000000018: R_PPC64_DTPREL34 x
29+
entry:
30+
ret i32* @x
31+
}
32+
33+
define i32 @LocalDynamicValueLoad() {
34+
; CHECK-S-LABEL: LocalDynamicValueLoad:
35+
; CHECK-S: paddi r3, 0, x@got@tlsld@pcrel, 1
36+
; CHECK-S-NEXT: bl __tls_get_addr@notoc(x@tlsld)
37+
; CHECK-S-NEXT: paddi r3, r3, x@DTPREL, 0
38+
; CHECK-S-NEXT: lwz r3, 0(r3)
39+
; CHECK-S-NEXT: addi r1, r1, 32
40+
; CHECK-S-NEXT: ld r0, 16(r1)
41+
; CHECK-S-NEXT: mtlr r0
42+
; CHECK-S-NEXT: blr
43+
; CHECK-O-LABEL: <LocalDynamicValueLoad>:
44+
; CHECK-O: 4c: paddi 3, 0, 0, 1
45+
; CHECK-O-NEXT: 000000000000004c: R_PPC64_GOT_TLSLD_PCREL34 x
46+
; CHECK-O-NEXT: 54: bl 0x54
47+
; CHECK-O-NEXT: 0000000000000054: R_PPC64_TLSLD x
48+
; CHECK-O-NEXT: 0000000000000054: R_PPC64_REL24_NOTOC __tls_get_addr
49+
; CHECK-O-NEXT: 58: paddi 3, 3, 0, 0
50+
; CHECK-O-NEXT: 0000000000000058: R_PPC64_DTPREL34 x
51+
; CHECK-O-NEXT: 60: lwz 3, 0(3)
52+
entry:
53+
%0 = load i32, i32* @x, align 4
54+
ret i32 %0
55+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# RUN: llvm-mc -triple=powerpc64le-unknown-unknown -filetype=obj %s 2>&1 | \
2+
# RUN: FileCheck %s -check-prefix=MC
3+
# RUN: llvm-mc -triple=powerpc64le-unknown-unknown -filetype=obj %s | \
4+
# RUN: llvm-readobj -r - | FileCheck %s -check-prefix=READOBJ
5+
6+
# This test checks that on Power PC we can correctly convert @got@tlsld@pcrel
7+
# x@tlsld, __tls_get_addr@notoc and x@DTPREL into R_PPC64_GOT_TLSLD_PCREL34,
8+
# R_PPC64_TLSLD, R_PPC64_REL24_NOTOC and R_PPC64_DTPREL34 for local dynamic
9+
# relocations with address/value loaded
10+
11+
# MC-NOT: error: invalid variant
12+
13+
# READOBJ: 0x0 R_PPC64_GOT_TLSLD_PCREL34 x 0x0
14+
# READOBJ-NEXT: 0x8 R_PPC64_TLSLD x 0x0
15+
# READOBJ-NEXT: 0x8 R_PPC64_REL24_NOTOC __tls_get_addr 0x0
16+
# READOBJ-NEXT: 0xC R_PPC64_DTPREL34 x 0x0
17+
# READOBJ-NEXT: 0x18 R_PPC64_GOT_TLSLD_PCREL34 x 0x0
18+
# READOBJ-NEXT: 0x20 R_PPC64_TLSLD x 0x0
19+
# READOBJ-NEXT: 0x20 R_PPC64_REL24_NOTOC __tls_get_addr 0x0
20+
# READOBJ-NEXT: 0x24 R_PPC64_DTPREL34 x 0x0
21+
22+
LocalDynamicAddrLoad:
23+
paddi 3, 0, x@got@tlsld@pcrel, 1
24+
bl __tls_get_addr@notoc(x@tlsld)
25+
paddi 3, 3, x@DTPREL, 0
26+
blr
27+
28+
LocalDynamicValueLoad:
29+
paddi 3, 0, x@got@tlsld@pcrel, 1
30+
bl __tls_get_addr@notoc(x@tlsld)
31+
paddi 3, 3, x@DTPREL, 0
32+
lwz 3, 0(3)
33+
blr

0 commit comments

Comments
 (0)