On ELF and COFF treat linker_private like private.

The linkers on these systems don't have anything special to do with these
symbols. Since the intent is for them to be absent from the final object,
just treat them as private.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197080 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2013-12-11 22:18:44 +00:00
parent 118de30ec1
commit 343da2e255
3 changed files with 23 additions and 6 deletions

View File

@ -124,10 +124,12 @@ namespace llvm {
/// file. /// file.
const char *PrivateGlobalPrefix; // Defaults to "L" const char *PrivateGlobalPrefix; // Defaults to "L"
/// LinkerPrivateGlobalPrefix - This prefix is used for symbols that should /// This prefix is used for symbols that should be passed through the
/// be passed through the assembler but be removed by the linker. This /// assembler but be removed by the linker. This is 'l' on Darwin,
/// is "l" on Darwin, currently used for some ObjC metadata. /// currently used for some ObjC metadata.
const char *LinkerPrivateGlobalPrefix; // Defaults to "" /// The default of "" meast that for this system a plain private symbol
/// should be used.
const char *LinkerPrivateGlobalPrefix; // Defaults to "".
/// InlineAsmStart/End - If these are nonempty, they contain a directive to /// InlineAsmStart/End - If these are nonempty, they contain a directive to
/// emit before and after an inline assembly statement. /// emit before and after an inline assembly statement.
@ -441,8 +443,13 @@ namespace llvm {
const char *getPrivateGlobalPrefix() const { const char *getPrivateGlobalPrefix() const {
return PrivateGlobalPrefix; return PrivateGlobalPrefix;
} }
bool hasLinkerPrivateGlobalPrefix() const {
return LinkerPrivateGlobalPrefix[0] != '\0';
}
const char *getLinkerPrivateGlobalPrefix() const { const char *getLinkerPrivateGlobalPrefix() const {
return LinkerPrivateGlobalPrefix; if (hasLinkerPrivateGlobalPrefix())
return LinkerPrivateGlobalPrefix;
return getPrivateGlobalPrefix();
} }
const char *getInlineAsmStart() const { const char *getInlineAsmStart() const {
return InlineAsmStart; return InlineAsmStart;

View File

@ -1175,7 +1175,7 @@ void AsmPrinter::EmitJumpTableInfo() {
// before each jump table. The first label is never referenced, but tells // before each jump table. The first label is never referenced, but tells
// the assembler and linker the extents of the jump table object. The // the assembler and linker the extents of the jump table object. The
// second label is actually referenced by the code. // second label is actually referenced by the code.
if (JTInDiffSection && MAI->getLinkerPrivateGlobalPrefix()[0]) if (JTInDiffSection && MAI->hasLinkerPrivateGlobalPrefix())
// FIXME: This doesn't have to have any specific name, just any randomly // FIXME: This doesn't have to have any specific name, just any randomly
// named and numbered 'l' label would work. Simplify GetJTISymbol. // named and numbered 'l' label would work. Simplify GetJTISymbol.
OutStreamer.EmitLabel(GetJTISymbol(JTI, true)); OutStreamer.EmitLabel(GetJTISymbol(JTI, true));

View File

@ -0,0 +1,10 @@
; RUN: llc < %s -mtriple=x86_64-pc-linux | FileCheck --check-prefix=ELF %s
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck --check-prefix=MACHO %s
@foo = linker_private global i32 42
;ELF: {{^}}.Lfoo:
;MACHO: {{^}}l_foo:
define i32* @f() {
ret i32* @foo
}