PPC32 TLS (Local Dynamic, General Dynamic)

Justin Hibbits chmeeedalf at gmail.com
Thu Jul 24 09:01:12 PDT 2014


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:

-------------- next part --------------
A non-text attachment was scrubbed...
Name: ppc32tls_jul24.diff
Type: text/x-patch
Size: 24734 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140724/0abd4a45/attachment.bin>


More information about the llvm-commits mailing list