diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index ff2491e7ab3..bbb58527eb6 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/include/llvm/Target/TargetAsmInfo.h @@ -216,10 +216,15 @@ namespace llvm { const char *GlobalPrefix; // Defaults to "" /// PrivateGlobalPrefix - This prefix is used for globals like constant - /// pool entries that are completely private to the .o file and should not + /// pool entries that are completely private to the .s file and should not /// have names in the .o file. This is often "." or "L". const char *PrivateGlobalPrefix; // Defaults to "." + /// LessPrivateGlobalPrefix - This prefix is used for some Objective C + /// metadata symbols that should be passed through the assembler but be + /// removed by the linker. This is "l" on Darwin. + const char *LessPrivateGlobalPrefix; // Defaults to "" + /// JumpTableSpecialLabelPrefix - If not null, a extra (dead) label is /// emitted before jump tables with the specified prefix. const char *JumpTableSpecialLabelPrefix; // Default to null. @@ -653,6 +658,9 @@ namespace llvm { const char *getPrivateGlobalPrefix() const { return PrivateGlobalPrefix; } + const char *getLessPrivateGlobalPrefix() const { + return LessPrivateGlobalPrefix; + } const char *getJumpTableSpecialLabelPrefix() const { return JumpTableSpecialLabelPrefix; } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 273253ae23c..f041f3be56f 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(GV))) { + if (GV) { + if (GV->hasInternalLinkage() && !isa(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 3e057359582..a1a00a2cdae 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 1b8c1a5fb3c..fc98e57c82a 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 6baebd0ffe7..06b77dd26aa 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 be390c23963..64858f89bd5 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)