PPC32 TLS (Local Dynamic, General Dynamic)
Hal Finkel
hfinkel at anl.gov
Fri Jul 25 10:56:32 PDT 2014
----- Original Message -----
> From: "Bill Schmidt" <wschmidt at linux.vnet.ibm.com>
> To: "Justin Hibbits" <chmeeedalf at gmail.com>
> Cc: "Hal Finkel" <hfinkel at anl.gov>, llvm-commits at cs.uiuc.edu
> Sent: Thursday, July 24, 2014 11:15:32 AM
> Subject: Re: PPC32 TLS (Local Dynamic, General Dynamic)
>
> Hi Justin,
>
> No further questions, Your Honor. ;)
>
> (LGTM.)
r213960, thanks!
-Hal
>
> Thanks,
> Bill
>
> On Thu, 2014-07-24 at 09:01 -0700, Justin Hibbits wrote:
> > Hi Bill,
> >
> > Thanks for the review, sorry for the time wasting. I've addressed
> > all
> > of these comments now, and checked over multiple times, so they
> > should
> > all be fixed.
> >
> > - Justin
> >
> > On Thu, 24 Jul 2014 10:43:19 -0500
> > Bill Schmidt <wschmidt at linux.vnet.ibm.com> wrote:
> >
> > > Hi Justin,
> > >
> > > A number of typos still.
> > >
> >
> > > >Index: lib/Target/PowerPC/PPCAsmPrinter.cpp
> > > >===================================================================
> > > >--- lib/Target/PowerPC/PPCAsmPrinter.cpp (revision 213689)
> > > >+++ lib/Target/PowerPC/PPCAsmPrinter.cpp (working copy)
> > > >@@ -573,6 +573,34 @@
> > > > return;
> > > > }
> > > >
> > > >+ case PPC::PPC32PICGOT: {
> > > >+ MCSymbol *GOTSymbol =
> > > >OutContext.GetOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
> > > >+ MCSymbol *GOTRef = OutContext.CreateTempSymbol();
> > > >+ MCSymbol *NextInstr = OutContext.CreateTempSymbol();
> > > >+
> > > >+ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::BL)
> > > >+ // FIXME: We would like an efficient form for this, so we
> > > >don't have to do
> > > >+ // a lot of extra uniquing.
> > > >+ .addExpr(MCSymbolRefExpr::Create(NextInstr,
> > > >OutContext)));
> > > >+ const MCExpr *OffsExpr =
> > > >+
> > > > MCBinaryExpr::CreateSub(MCSymbolRefExpr::Create(GOTSymbol,
> > > >OutContext),
> > > >+ MCSymbolRefExpr::Create(GOTRef,
> > > >OutContext),
> > > >+ OutContext);
> > > >+ OutStreamer.EmitLabel(GOTRef);
> > > >+ OutStreamer.EmitValue(OffsExpr, 4);
> > > >+ OutStreamer.EmitLabel(NextInstr);
> > > >+ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::MFLR)
> > > >+
> > > > .addReg(MI->getOperand(0).getReg()));
> > > >+ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::LWZ)
> > > >+
> > > > .addReg(MI->getOperand(1).getReg())
> > > >+ .addImm(0)
> > > >+
> > > > .addReg(MI->getOperand(0).getReg()));
> > > >+ EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADD4)
> > > >+
> > > > .addReg(MI->getOperand(0).getReg())
> > > >+
> > > > .addReg(MI->getOperand(1).getReg())
> > > >+
> > > > .addReg(MI->getOperand(0).getReg()));
> > > >+ return;
> > > >+ }
> > > > case PPC::PPC32GOT: {
> > > > MCSymbol *GOTSymbol =
> > > > OutContext.GetOrCreateSymbol(StringRef("_GLOBAL_OFFSET_TABLE_"));
> > > > const MCExpr *SymGotTlsL =
> > > >@@ -606,31 +634,43 @@
> > > > .addExpr(SymGotTlsGD));
> > > > return;
> > > > }
> > > >- case PPC::ADDItlsgdL: {
> > > >+ case PPC::ADDItlsgdL:
> > > > // Transform: %Xd = ADDItlsgdL %Xs, <ga:@sym>
> > > > // Into: %Xd = ADDI8 %Xs, sym at got@tlsgd at l
> > > >- assert(Subtarget.isPPC64() && "Not supported for 32-bit
> > > >PowerPC");
> > > >+ case PPC::ADDItlsgdL32: {
> > > >+ // Transform: %Rd = ADDItlsgdL32 %Rs, <ga:@sym>
> > > >+ // Into: %Rd = ADDI4 %Rs, sym at got@tlsgd
> > >
> > > ADDI, not ADDI4.
> >
> > No defense to this one, at least the others I could claim a missed
> > copy&paste.
> >
> > >
> > > > const MachineOperand &MO = MI->getOperand(2);
> > > > const GlobalValue *GValue = MO.getGlobal();
> > > > MCSymbol *MOSymbol = getSymbol(GValue);
> > > > const MCExpr *SymGotTlsGD =
> > > >- MCSymbolRefExpr::Create(MOSymbol,
> > > >MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO,
> > > >+ MCSymbolRefExpr::Create(MOSymbol, Subtarget.isPPC64() ?
> > > >+
> > > >MCSymbolRefExpr::VK_PPC_GOT_TLSGD_LO :
> > > >+
> > > >MCSymbolRefExpr::VK_PPC_GOT_TLSGD,
> > > > OutContext);
> > > >- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDI8)
> > > >-
> > > > .addReg(MI->getOperand(0).getReg())
> > > >-
> > > > .addReg(MI->getOperand(1).getReg())
> > > >- .addExpr(SymGotTlsGD));
> > > >+ EmitToStreamer(OutStreamer,
> > > >+ MCInstBuilder(Subtarget.isPPC64() ?
> > > >PPC::ADDI8 :
> > > >PPC::ADDI)
> > > >+ .addReg(MI->getOperand(0).getReg())
> > > >+ .addReg(MI->getOperand(1).getReg())
> > > >+ .addExpr(SymGotTlsGD));
> > > > return;
> > > > }
> > > >- case PPC::GETtlsADDR: {
> > > >+ case PPC::GETtlsADDR:
> > > > // Transform: %X3 = GETtlsADDR %X3, <ga:@sym>
> > > > // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsgd)
> > > >- assert(Subtarget.isPPC64() && "Not supported for 32-bit
> > > >PowerPC");
> > > >+ case PPC::GETtlsADDR32: {
> > > >+ // Transform: %R3 = GETtlsADDR %R3, <ga:@sym>
> > > >+ // Into: BL_TLS __tls_get_addr(sym at tlsgd)
> > >
> > > Isn't there an @PLT needed on the end of that?
> > >
> > > >
> > > > StringRef Name = "__tls_get_addr";
> > > > MCSymbol *TlsGetAddr = OutContext.GetOrCreateSymbol(Name);
> > > >+ MCSymbolRefExpr::VariantKind Kind =
> > > >MCSymbolRefExpr::VK_None;
> > > >+
> > > >+ if (!Subtarget.isPPC64() && !Subtarget.isDarwin() &&
> > > >+ TM.getRelocationModel() == Reloc::PIC_)
> > > >+ Kind = MCSymbolRefExpr::VK_PLT;
> > > > const MCSymbolRefExpr *TlsRef =
> > > >- MCSymbolRefExpr::Create(TlsGetAddr,
> > > >MCSymbolRefExpr::VK_None,
> > > >OutContext);
> > > >+ MCSymbolRefExpr::Create(TlsGetAddr, Kind, OutContext);
> > > > const MachineOperand &MO = MI->getOperand(2);
> > > > const GlobalValue *GValue = MO.getGlobal();
> > > > MCSymbol *MOSymbol = getSymbol(GValue);
> > > >@@ -637,9 +677,11 @@
> > > > const MCExpr *SymVar =
> > > > MCSymbolRefExpr::Create(MOSymbol,
> > > > MCSymbolRefExpr::VK_PPC_TLSGD, OutContext);
> > > >- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::BL8_NOP_TLS)
> > > >- .addExpr(TlsRef)
> > > >- .addExpr(SymVar));
> > > >+ EmitToStreamer(OutStreamer,
> > > >+ MCInstBuilder(Subtarget.isPPC64() ?
> > > >+ PPC::BL8_NOP_TLS :
> > > >PPC::BL_TLS)
> > > >+ .addExpr(TlsRef)
> > > >+ .addExpr(SymVar));
> > > > return;
> > > > }
> > > > case PPC::ADDIStlsldHA: {
> > > >@@ -658,31 +700,44 @@
> > > > .addExpr(SymGotTlsLD));
> > > > return;
> > > > }
> > > >- case PPC::ADDItlsldL: {
> > > >+ case PPC::ADDItlsldL:
> > > > // Transform: %Xd = ADDItlsldL %Xs, <ga:@sym>
> > > > // Into: %Xd = ADDI8 %Xs, sym at got@tlsld at l
> > > >- assert(Subtarget.isPPC64() && "Not supported for 32-bit
> > > >PowerPC");
> > > >+ case PPC::ADDItlsldL32: {
> > > >+ // Transform: %Rd = ADDItlsldL %Rs, <ga:@sym>
> > > >+ // Into: %Rd = ADDI %Rs, sym at got@tlsld
> > >
> > > ADDItlsldL32, not ADDItlsld.
> > >
> > > > const MachineOperand &MO = MI->getOperand(2);
> > > > const GlobalValue *GValue = MO.getGlobal();
> > > > MCSymbol *MOSymbol = getSymbol(GValue);
> > > > const MCExpr *SymGotTlsLD =
> > > >- MCSymbolRefExpr::Create(MOSymbol,
> > > >MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO,
> > > >+ MCSymbolRefExpr::Create(MOSymbol, Subtarget.isPPC64() ?
> > > >+
> > > >MCSymbolRefExpr::VK_PPC_GOT_TLSLD_LO :
> > > >+
> > > >MCSymbolRefExpr::VK_PPC_GOT_TLSLD,
> > > > OutContext);
> > > >- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDI8)
> > > >-
> > > > .addReg(MI->getOperand(0).getReg())
> > > >-
> > > > .addReg(MI->getOperand(1).getReg())
> > > >- .addExpr(SymGotTlsLD));
> > > >+ EmitToStreamer(OutStreamer,
> > > >+ MCInstBuilder(Subtarget.isPPC64() ?
> > > >PPC::ADDI8 :
> > > >PPC::ADDI)
> > > >+ .addReg(MI->getOperand(0).getReg())
> > > >+ .addReg(MI->getOperand(1).getReg())
> > > >+ .addExpr(SymGotTlsLD));
> > > > return;
> > > > }
> > > >- case PPC::GETtlsldADDR: {
> > > >+ case PPC::GETtlsldADDR:
> > > > // Transform: %X3 = GETtlsldADDR %X3, <ga:@sym>
> > > > // Into: BL8_NOP_TLS __tls_get_addr(sym at tlsld)
> > > >- assert(Subtarget.isPPC64() && "Not supported for 32-bit
> > > >PowerPC");
> > > >+ case PPC::GETtlsldADDR32: {
> > > >+ // Transform: %R3 = GETtlsldADDR %R3, <ga:@sym>
> > > >+ // Into: BL_TLS __tls_get_addr(sym at tlsld)
> > >
> > > GETtlsldADDR32, not GETtlsldADDR. Missing @PLT.
> > >
> > > >
> > > > StringRef Name = "__tls_get_addr";
> > > > MCSymbol *TlsGetAddr = OutContext.GetOrCreateSymbol(Name);
> > > >+ MCSymbolRefExpr::VariantKind Kind =
> > > >MCSymbolRefExpr::VK_None;
> > > >+
> > > >+ if (!Subtarget.isPPC64() && !Subtarget.isDarwin() &&
> > > >+ TM.getRelocationModel() == Reloc::PIC_)
> > > >+ Kind = MCSymbolRefExpr::VK_PLT;
> > > >+
> > > > const MCSymbolRefExpr *TlsRef =
> > > >- MCSymbolRefExpr::Create(TlsGetAddr,
> > > >MCSymbolRefExpr::VK_None,
> > > >OutContext);
> > > >+ MCSymbolRefExpr::Create(TlsGetAddr, Kind, OutContext);
> > > > const MachineOperand &MO = MI->getOperand(2);
> > > > const GlobalValue *GValue = MO.getGlobal();
> > > > MCSymbol *MOSymbol = getSymbol(GValue);
> > > >@@ -689,15 +744,19 @@
> > > > const MCExpr *SymVar =
> > > > MCSymbolRefExpr::Create(MOSymbol,
> > > > MCSymbolRefExpr::VK_PPC_TLSLD, OutContext);
> > > >- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::BL8_NOP_TLS)
> > > >- .addExpr(TlsRef)
> > > >- .addExpr(SymVar));
> > > >+ EmitToStreamer(OutStreamer,
> > > >+ MCInstBuilder(Subtarget.isPPC64() ?
> > > >+ PPC::BL8_NOP_TLS :
> > > >PPC::BL_TLS)
> > > >+ .addExpr(TlsRef)
> > > >+ .addExpr(SymVar));
> > > > return;
> > > > }
> > > >- case PPC::ADDISdtprelHA: {
> > > >+ case PPC::ADDISdtprelHA:
> > > > // Transform: %Xd = ADDISdtprelHA %X3, <ga:@sym>
> > > > // Into: %Xd = ADDIS8 %X3, sym at dtprel@ha
> > > >- assert(Subtarget.isPPC64() && "Not supported for 32-bit
> > > >PowerPC");
> > > >+ case PPC::ADDISdtprelHA32: {
> > > >+ // Transform: %Rd = ADDISdtprelHA %R3, <ga:@sym>
> > > >+ // Into: %Rd = ADDIS %R3, sym at dtprel@ha
> > >
> > > ADDISdtprelHA32.
> > >
> > > > const MachineOperand &MO = MI->getOperand(2);
> > > > const GlobalValue *GValue = MO.getGlobal();
> > > > MCSymbol *MOSymbol = getSymbol(GValue);
> > > >@@ -704,16 +763,19 @@
> > > > const MCExpr *SymDtprel =
> > > > MCSymbolRefExpr::Create(MOSymbol,
> > > > MCSymbolRefExpr::VK_PPC_DTPREL_HA, OutContext);
> > > >- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDIS8)
> > > >-
> > > > .addReg(MI->getOperand(0).getReg())
> > > >- .addReg(PPC::X3)
> > > >- .addExpr(SymDtprel));
> > > >+ EmitToStreamer(OutStreamer,
> > > >+ MCInstBuilder(Subtarget.isPPC64() ?
> > > >PPC::ADDIS8 : PPC::ADDIS)
> > > >+ .addReg(MI->getOperand(0).getReg())
> > > >+ .addReg(Subtarget.isPPC64() ? PPC::X3 :
> > > >PPC::R3)
> > > >+ .addExpr(SymDtprel));
> > > > return;
> > > > }
> > > >- case PPC::ADDIdtprelL: {
> > > >+ case PPC::ADDIdtprelL:
> > > > // Transform: %Xd = ADDIdtprelL %Xs, <ga:@sym>
> > > > // Into: %Xd = ADDI8 %Xs, sym at dtprel@l
> > > >- assert(Subtarget.isPPC64() && "Not supported for 32-bit
> > > >PowerPC");
> > > >+ case PPC::ADDIdtprelL32: {
> > > >+ // Transform: %Rd = ADDIdtprelL %Rs, <ga:@sym>
> > > >+ // Into: %Rd = ADDI %Rs, sym at dtprel@l
> > >
> > > ADDIdtprelL32.
> > >
> > > > const MachineOperand &MO = MI->getOperand(2);
> > > > const GlobalValue *GValue = MO.getGlobal();
> > > > MCSymbol *MOSymbol = getSymbol(GValue);
> > > >@@ -720,10 +782,11 @@
> > > > const MCExpr *SymDtprel =
> > > > MCSymbolRefExpr::Create(MOSymbol,
> > > > MCSymbolRefExpr::VK_PPC_DTPREL_LO, OutContext);
> > > >- EmitToStreamer(OutStreamer, MCInstBuilder(PPC::ADDI8)
> > > >-
> > > > .addReg(MI->getOperand(0).getReg())
> > > >-
> > > > .addReg(MI->getOperand(1).getReg())
> > > >- .addExpr(SymDtprel));
> > > >+ EmitToStreamer(OutStreamer,
> > > >+ MCInstBuilder(Subtarget.isPPC64() ?
> > > >PPC::ADDI8 :
> > > >PPC::ADDI)
> > > >+ .addReg(MI->getOperand(0).getReg())
> > > >+ .addReg(MI->getOperand(1).getReg())
> > > >+ .addExpr(SymDtprel));
> > > > return;
> > > > }
> > > > case PPC::MFOCRF:
> >
>
>
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list