[PowerPC CodeGen] patch for bug 15763

David Fang fang at csl.cornell.edu
Mon Apr 22 13:57:57 PDT 2013


Hi all,

Attached is a patch that fixes PIC codegen for PPC on darwin, by 
privatizing all function stubs and lazy pointer symbols in emitted 
assembly.

http://llvm.org/bugs/show_bug.cgi?id=15763

Could PPC maintainers kindly review/apply?  Thanks.

Fang

-- 
David Fang
http://www.csl.cornell.edu/~fang/
-------------- next part --------------
diff --git a/lib/Target/PowerPC/PPCMCInstLower.cpp b/lib/Target/PowerPC/PPCMCInstLower.cpp
index 9b0df3e..421b624 100644
--- a/lib/Target/PowerPC/PPCMCInstLower.cpp
+++ b/lib/Target/PowerPC/PPCMCInstLower.cpp
@@ -46,8 +46,16 @@ static MCSymbol *GetSymbolFromOperand(const MachineOperand &MO, AsmPrinter &AP){
   // If the target flags on the operand changes the name of the symbol, do that
   // before we return the symbol.
   if (MO.getTargetFlags() == PPCII::MO_DARWIN_STUB) {
     Name += "$stub";
-    MCSymbol *Sym = Ctx.GetOrCreateSymbol(Name.str());
+    SmallString<128> StubName;
+    const char* const plp = AP.MAI->getPrivateGlobalPrefix();
+    if (!Name.startswith(plp)) {
+      // http://llvm.org/bugs/show_bug.cgi?id=15763
+      // stubs and lazy_ptrs should be local symbols, which need leading 'L'
+      StubName += plp;
+    }
+    StubName += Name;
+    MCSymbol *Sym = Ctx.GetOrCreateSymbol(StubName.str());
     MachineModuleInfoImpl::StubValueTy &StubSym =
       getMachOMMI(AP).getFnStubEntry(Sym);
     if (StubSym.getPointer())
diff --git a/test/CodeGen/PowerPC/stubs.ll b/test/CodeGen/PowerPC/stubs.ll
index cfcc50b..694f208 100644
--- a/test/CodeGen/PowerPC/stubs.ll
+++ b/test/CodeGen/PowerPC/stubs.ll
@@ -6,16 +6,16 @@ entry:
 }
 
 ; CHECK: _test1:
-; CHECK: bl ___floatditf$stub
+; CHECK: bl L___floatditf$stub
 ; CHECK: 	.section	__TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16
-; CHECK: ___floatditf$stub:
+; CHECK: L___floatditf$stub:
 ; CHECK: 	.indirect_symbol ___floatditf
-; CHECK: 	lis r11, ha16(___floatditf$lazy_ptr)
-; CHECK: 	lwzu r12, lo16(___floatditf$lazy_ptr)(r11)
+; CHECK: 	lis r11, ha16(L___floatditf$lazy_ptr)
+; CHECK: 	lwzu r12, lo16(L___floatditf$lazy_ptr)(r11)
 ; CHECK: 	mtctr r12
 ; CHECK: 	bctr
 ; CHECK: 	.section	__DATA,__la_symbol_ptr,lazy_symbol_pointers
-; CHECK: ___floatditf$lazy_ptr:
+; CHECK: L___floatditf$lazy_ptr:
 ; CHECK: 	.indirect_symbol ___floatditf
 ; CHECK: 	.long dyld_stub_binding_helper


More information about the llvm-commits mailing list