PPC32 TLS (Local Dynamic, General Dynamic)

Bill Schmidt wschmidt at linux.vnet.ibm.com
Thu Jul 24 09:15:32 PDT 2014


Hi Justin,

No further questions, Your Honor. ;)

(LGTM.)

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:
> 





More information about the llvm-commits mailing list