From: Chris Lattner Date: Tue, 19 Jan 2010 05:08:13 +0000 (+0000) Subject: hookize the cygwin ".linkonce" directive. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=41eb8b47717e1fe1a6d0e99ec1b4e890091f77aa;p=oota-llvm.git hookize the cygwin ".linkonce" directive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93855 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index a340a121384..22f147587cd 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -226,6 +226,10 @@ namespace llvm { /// WeakDefDirective - This directive, if non-null, is used to declare a /// global as being a weak defined symbol. const char *WeakDefDirective; // Defaults to NULL. + + /// LinkOnceDirective - This directive, if non-null is used to declare a + /// global as being a weak defined symbol. This is used on cygwin/mingw. + const char *LinkOnceDirective; // Defaults to NULL. /// HiddenDirective - This directive, if non-null, is used to declare a /// global or function as having hidden visibility. @@ -426,12 +430,9 @@ namespace llvm { const char *getUsedDirective() const { return UsedDirective; } - const char *getWeakRefDirective() const { - return WeakRefDirective; - } - const char *getWeakDefDirective() const { - return WeakDefDirective; - } + const char *getWeakRefDirective() const { return WeakRefDirective; } + const char *getWeakDefDirective() const { return WeakDefDirective; } + const char *getLinkOnceDirective() const { return LinkOnceDirective; } const char *getHiddenDirective() const { return HiddenDirective; } diff --git a/lib/MC/MCAsmInfo.cpp b/lib/MC/MCAsmInfo.cpp index 4c53d7a284a..556b0aa6c68 100644 --- a/lib/MC/MCAsmInfo.cpp +++ b/lib/MC/MCAsmInfo.cpp @@ -62,6 +62,7 @@ MCAsmInfo::MCAsmInfo() { UsedDirective = 0; WeakRefDirective = 0; WeakDefDirective = 0; + LinkOnceDirective = 0; // FIXME: These are ELFish - move to ELFMAI. HiddenDirective = "\t.hidden\t"; ProtectedDirective = "\t.protected\t"; diff --git a/lib/MC/MCAsmInfoCOFF.cpp b/lib/MC/MCAsmInfoCOFF.cpp index 23b0dd77916..1b27bf026ec 100644 --- a/lib/MC/MCAsmInfoCOFF.cpp +++ b/lib/MC/MCAsmInfoCOFF.cpp @@ -25,6 +25,7 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() { HiddenDirective = NULL; PrivateGlobalPrefix = "L"; // Prefix for private global symbols WeakRefDirective = "\t.weak\t"; + LinkOnceDirective = "\t.linkonce same_size\n"; SetDirective = "\t.set\t"; // Set up DWARF directives diff --git a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp index 358bb70e2cb..a0954110577 100644 --- a/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp +++ b/lib/Target/X86/AsmPrinter/X86AsmPrinter.cpp @@ -727,12 +727,16 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) { case GlobalValue::WeakAnyLinkage: case GlobalValue::WeakODRLinkage: case GlobalValue::LinkerPrivateLinkage: - if (Subtarget->isTargetDarwin()) { + if (const char *WeakDef = MAI->getWeakDefDirective()) { + // .globl _foo OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global); - O << MAI->getWeakDefDirective() << *GVarSym << '\n'; - } else if (Subtarget->isTargetCygMing()) { + // .weak_definition _foo + O << WeakDef << *GVarSym << '\n'; + } else if (const char *LinkOnce = MAI->getLinkOnceDirective()) { + // .globl _foo OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global); - O << "\t.linkonce same_size\n"; + // .linkonce same_size + O << LinkOnce; } else O << "\t.weak\t" << *GVarSym << '\n'; break; @@ -741,7 +745,8 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) { // FIXME: appending linkage variables should go into a section of // their name or something. For now, just emit them as external. case GlobalValue::ExternalLinkage: - // If external or appending, declare as a global symbol + // If external or appending, declare as a global symbol. + // .globl _foo OutStreamer.EmitSymbolAttribute(GVarSym, MCStreamer::Global); break; case GlobalValue::PrivateLinkage: @@ -753,7 +758,7 @@ void X86AsmPrinter::PrintGlobalVariable(const GlobalVariable* GVar) { EmitAlignment(AlignLog, GVar); O << *GVarSym << ":"; - if (VerboseAsm){ + if (VerboseAsm) { O.PadToColumn(MAI->getCommentColumn()); O << MAI->getCommentString() << ' '; WriteAsOperand(O, GVar, /*PrintType=*/false, GVar->getParent());