summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDale Johannesen <dalej@apple.com>2008-09-09 01:21:22 +0000
committerDale Johannesen <dalej@apple.com>2008-09-09 01:21:22 +0000
commitb2dfb89e0e7f1ee3e4fe4a3a1b3af148f0aec34f (patch)
tree38fb163f96e48210e7ebb62a66ef0c6c9b48e23d
parentd8ee59b0ca7080c01704d064cec56e157ad26d81 (diff)
downloadexternal_llvm-b2dfb89e0e7f1ee3e4fe4a3a1b3af148f0aec34f.zip
external_llvm-b2dfb89e0e7f1ee3e4fe4a3a1b3af148f0aec34f.tar.gz
external_llvm-b2dfb89e0e7f1ee3e4fe4a3a1b3af148f0aec34f.tar.bz2
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
-rw-r--r--include/llvm/Target/TargetAsmInfo.h10
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp16
-rw-r--r--lib/Target/ARM/ARMTargetAsmInfo.cpp1
-rw-r--r--lib/Target/PowerPC/PPCTargetAsmInfo.cpp1
-rw-r--r--lib/Target/TargetAsmInfo.cpp1
-rw-r--r--lib/Target/X86/X86TargetAsmInfo.cpp1
6 files changed, 27 insertions, 3 deletions
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index ff2491e..bbb5852 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 273253a..f041f3b 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 3e05735..a1a00a2 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 1b8c1a5..fc98e57 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 6baebd0..06b77dd 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 be390c2..64858f8 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)