[llvm] [PowerPC] Support local-dynamic TLS relocation on AIX (PR #66316)
Kai Luo via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 14 02:17:25 PDT 2023
================
@@ -145,19 +158,57 @@ namespace {
.addImm(0);
if (IsAIX) {
- // The variable offset and region handle are copied in r4 and r3. The
- // copies are followed by GETtlsADDR32AIX/GETtlsADDR64AIX.
- if (!IsTLSTPRelMI) {
- BuildMI(MBB, I, DL, TII->get(TargetOpcode::COPY), GPR4)
- .addReg(MI.getOperand(1).getReg());
+ if (MI.getOpcode() == PPC::TLSLDAIX8 ||
+ MI.getOpcode() == PPC::TLSLDAIX) {
+ // For Local-Dynamic, the module handle is copied in r3. The copy is
+ // followed by GETtlsMOD32AIX/GETtlsMOD64AIX.
+ const PPCSubtarget &Subtarget =
+ MBB.getParent()->getSubtarget<PPCSubtarget>();
+ bool IsLargeModel =
+ Subtarget.getTargetMachine().getCodeModel() == CodeModel::Large;
+ Register ModuleHandleHReg;
+ unsigned LDTocOp =
+ Is64Bit ? (IsLargeModel ? PPC::LDtocL : PPC::LDtoc)
+ : (IsLargeModel ? PPC::LWZtocL : PPC::LWZtoc);
+ if (IsLargeModel) {
+ ModuleHandleHReg = RegInfo.createVirtualRegister(GPRNoZero);
+ BuildMI(MBB, I, DL,
+ TII->get(Is64Bit ? PPC::ADDIStocHA8 : PPC::ADDIStocHA),
+ ModuleHandleHReg)
+ .addReg(Subtarget.getTOCPointerRegister())
+ .addExternalSymbol("_$TLSML[TC]", PPCII::MO_TLSLD_FLAG);
+ }
+ Register MHReg = RegInfo.createVirtualRegister(GPRNoZero);
+ BuildMI(MBB, I, DL, TII->get(LDTocOp), MHReg)
+ .addExternalSymbol("_$TLSML[TC]", PPCII::MO_TLSLD_FLAG)
+ .addReg(IsLargeModel
+ ? ModuleHandleHReg
+ : Register(Subtarget.getTOCPointerRegister()));
BuildMI(MBB, I, DL, TII->get(TargetOpcode::COPY), GPR3)
- .addReg(MI.getOperand(2).getReg());
- BuildMI(MBB, I, DL, TII->get(Opc2), GPR3).addReg(GPR3).addReg(GPR4);
- } else
- // The opcode of GETtlsTpointer32AIX does not change, because later
- // this instruction will be expanded into a call to .__get_tpointer,
- // which will return the thread pointer into r3.
- BuildMI(MBB, I, DL, TII->get(Opc2), GPR3);
+ .addReg(MHReg);
+ // The call to __tls_get_mod.
----------------
bzEq wrote:
```suggestion
// The call to .__tls_get_mod.
```
https://github.com/llvm/llvm-project/pull/66316
More information about the llvm-commits
mailing list