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