Fix logic for not emitting no-dead-strip for some
objects in llvm.used (thanks Anton).  Makes visible
the magic 'l' prefix for symbols on Darwin which are
to be passed through the assembler, then removed at
linktime (previously all references to this had been
hidden in the ObjC FE code, oh well).



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55973 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 273253a..f041f3b 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -452,7 +452,9 @@
 
 /// 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 @@
   
   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 3e05735..a1a00a2 100644
--- a/lib/Target/ARM/ARMTargetAsmInfo.cpp
+++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp
@@ -62,6 +62,7 @@
 
   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 1b8c1a5..fc98e57 100644
--- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
+++ b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp
@@ -38,6 +38,7 @@
   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 6baebd0..06b77dd 100644
--- a/lib/Target/TargetAsmInfo.cpp
+++ b/lib/Target/TargetAsmInfo.cpp
@@ -50,6 +50,7 @@
   CommentString("#"),
   GlobalPrefix(""),
   PrivateGlobalPrefix("."),
+  LessPrivateGlobalPrefix(""),
   JumpTableSpecialLabelPrefix(0),
   GlobalVarAddrPrefix(""),
   GlobalVarAddrSuffix(""),
diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp
index be390c2..64858f8 100644
--- a/lib/Target/X86/X86TargetAsmInfo.cpp
+++ b/lib/Target/X86/X86TargetAsmInfo.cpp
@@ -136,6 +136,7 @@
     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)