diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 16 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/Target/TargetAsmInfo.cpp | 1 | ||||
-rw-r--r-- | lib/Target/X86/X86TargetAsmInfo.cpp | 1 |
5 files changed, 18 insertions, 2 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 273253ae23..f041f3be56 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -452,7 +452,9 @@ const GlobalValue * AsmPrinter::findGlobalValue(const Constant *CV) { /// EmitLLVMUsedList - For targets that define a TAI::UsedDirective, mark each /// global in the specified llvm.used list as being used with this directive. -/// Non-globals (i.e. internal linkage) should not be emitted. +/// Internally linked data beginning with the PrivateGlobalPrefix or the +/// LessPrivateGlobalPrefix does not have the directive emitted (this +/// occurs in ObjC metadata). void AsmPrinter::EmitLLVMUsedList(Constant *List) { const char *Directive = TAI->getUsedDirective(); @@ -462,7 +464,17 @@ void AsmPrinter::EmitLLVMUsedList(Constant *List) { for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) { const GlobalValue *GV = findGlobalValue(InitList->getOperand(i)); - if (GV && (!GV->hasInternalLinkage() || isa<Function>(GV))) { + if (GV) { + if (GV->hasInternalLinkage() && !isa<Function>(GV) && + ((strlen(TAI->getPrivateGlobalPrefix()) != 0 && + Mang->getValueName(GV) + .substr(0,strlen(TAI->getPrivateGlobalPrefix())) == + TAI->getPrivateGlobalPrefix()) || + (strlen(TAI->getLessPrivateGlobalPrefix()) != 0 && + Mang->getValueName(GV) + .substr(0,strlen(TAI->getLessPrivateGlobalPrefix())) == + TAI->getLessPrivateGlobalPrefix()))) + continue; O << Directive; EmitConstantValueOnly(InitList->getOperand(i)); O << '\n'; diff --git a/lib/Target/ARM/ARMTargetAsmInfo.cpp b/lib/Target/ARM/ARMTargetAsmInfo.cpp index 3e05735958..a1a00a2cda 100644 --- a/lib/Target/ARM/ARMTargetAsmInfo.cpp +++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp @@ -62,6 +62,7 @@ ARMDarwinTargetAsmInfo::ARMDarwinTargetAsmInfo(const ARMTargetMachine &TM): GlobalPrefix = "_"; PrivateGlobalPrefix = "L"; + LessPrivateGlobalPrefix = "l"; StringConstantPrefix = "\1LC"; BSSSection = 0; // no BSS section ZeroDirective = "\t.space\t"; diff --git a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index 1b8c1a5fb3..fc98e57c82 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -38,6 +38,7 @@ PPCDarwinTargetAsmInfo::PPCDarwinTargetAsmInfo(const PPCTargetMachine &TM): CommentString = ";"; GlobalPrefix = "_"; PrivateGlobalPrefix = "L"; + LessPrivateGlobalPrefix = "l"; StringConstantPrefix = "\1LC"; ConstantPoolSection = "\t.const\t"; JumpTableDataSection = ".const"; diff --git a/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 6baebd0ffe..06b77dd26a 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/lib/Target/TargetAsmInfo.cpp @@ -50,6 +50,7 @@ TargetAsmInfo::TargetAsmInfo() : CommentString("#"), GlobalPrefix(""), PrivateGlobalPrefix("."), + LessPrivateGlobalPrefix(""), JumpTableSpecialLabelPrefix(0), GlobalVarAddrPrefix(""), GlobalVarAddrSuffix(""), diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index be390c2396..64858f89bd 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -136,6 +136,7 @@ X86DarwinTargetAsmInfo::X86DarwinTargetAsmInfo(const X86TargetMachine &TM): Data64bitsDirective = 0; // we can't emit a 64-bit unit ZeroDirective = "\t.space\t"; // ".space N" emits N zeros. PrivateGlobalPrefix = "L"; // Marker for constant pool idxs + LessPrivateGlobalPrefix = "l"; // Marker for some ObjC metadata BSSSection = 0; // no BSS section. ZeroFillDirective = "\t.zerofill\t"; // Uses .zerofill if (DTM->getRelocationModel() != Reloc::Static) |