diff --git a/llvm/include/llvm/Target/TargetAsmInfo.h b/llvm/include/llvm/Target/TargetAsmInfo.h index 28c144afa478..050949eeb558 100644 --- a/llvm/include/llvm/Target/TargetAsmInfo.h +++ b/llvm/include/llvm/Target/TargetAsmInfo.h @@ -211,6 +211,10 @@ namespace llvm { /// as being used somehow that the assembler can't see. This prevents dead /// code elimination on some targets. const char *UsedDirective; // Defaults to null. + + /// WeakRefDirective - This directive, if non-null, is used to decalre a + /// global as being a weak undefined symbol. + const char *WeakRefDirective; // Defaults to null. //===--- Dwarf Emission Directives -----------------------------------===// @@ -422,6 +426,9 @@ namespace llvm { const char *getUsedDirective() const { return UsedDirective; } + const char *getWeakRefDirective() const { + return WeakRefDirective; + } bool hasLEB128() const { return HasLEB128; } diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 1b9e94a19959..abbcc5725556 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -647,11 +647,13 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { } } - if (ExtWeakSymbols.begin() != ExtWeakSymbols.end()) - SwitchToDataSection(""); - for (std::set::iterator i = ExtWeakSymbols.begin(), - e = ExtWeakSymbols.end(); i != e; ++i) { - O << "\t.weak_reference " << *i << "\n"; + if (TAI->getWeakRefDirective()) { + if (ExtWeakSymbols.begin() != ExtWeakSymbols.end()) + SwitchToDataSection(""); + for (std::set::iterator i = ExtWeakSymbols.begin(), + e = ExtWeakSymbols.end(); i != e; ++i) { + O << TAI->getWeakRefDirective() << *i << "\n"; + } } bool isPPC64 = TD->getPointerSizeInBits() == 64; diff --git a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index f8848f592c55..1e3800914481 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetAsmInfo.cpp @@ -33,6 +33,7 @@ DarwinTargetAsmInfo::DarwinTargetAsmInfo(const PPCTargetMachine &TM) { StaticCtorsSection = ".mod_init_func"; StaticDtorsSection = ".mod_term_func"; UsedDirective = "\t.no_dead_strip\t"; + WeakRefDirective = "\t.weak_reference\t"; InlineAsmStart = "# InlineAsm Start"; InlineAsmEnd = "# InlineAsm End"; diff --git a/llvm/lib/Target/TargetAsmInfo.cpp b/llvm/lib/Target/TargetAsmInfo.cpp index 2b4f2f79c8e9..8b818fb3ea47 100644 --- a/llvm/lib/Target/TargetAsmInfo.cpp +++ b/llvm/lib/Target/TargetAsmInfo.cpp @@ -61,6 +61,7 @@ TargetAsmInfo::TargetAsmInfo() : COMMDirectiveTakesAlignment(true), HasDotTypeDotSizeDirective(true), UsedDirective(0), + WeakRefDirective(0), HasLEB128(false), HasDotLoc(false), HasDotFile(false), diff --git a/llvm/lib/Target/X86/X86AsmPrinter.cpp b/llvm/lib/Target/X86/X86AsmPrinter.cpp index b92a087859d8..722697527c3c 100644 --- a/llvm/lib/Target/X86/X86AsmPrinter.cpp +++ b/llvm/lib/Target/X86/X86AsmPrinter.cpp @@ -278,16 +278,12 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { O << "\t.ascii \" -export:" << *i << "\"\n"; } - if (!Subtarget->isTargetCygwin()) { - // There is no external weak linkage on Mingw32 platform. - // Defaulting to external + if (TAI->getWeakRefDirective()) { if (ExtWeakSymbols.begin() != ExtWeakSymbols.end()) SwitchToDataSection(""); - for (std::set::iterator i = ExtWeakSymbols.begin(), e = ExtWeakSymbols.end(); i != e; ++i) { - O << (Subtarget->isTargetDarwin() ? "\t.weak_reference" : "\t.weak") - << " " << *i << "\n"; + O << TAI->getWeakRefDirective() << *i << "\n"; } } diff --git a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp index 4d44b7d591e6..ed9f1ac31327 100644 --- a/llvm/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetAsmInfo.cpp @@ -62,6 +62,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { InlineAsmEnd = "# InlineAsm End"; SetDirective = "\t.set"; UsedDirective = "\t.no_dead_strip\t"; + WeakRefDirective = "\t.weak_reference\t"; NeedsSet = true; DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug"; @@ -86,6 +87,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { // HasDotFile - True if target asm supports .file directives. // bool HasDotFile; // Defaults to false. PrivateGlobalPrefix = "."; // Prefix for private global symbols + WeakRefDirective = "\t.weak\t"; DwarfRequiresFrameSection = false; DwarfAbbrevSection = "\t.section\t.debug_abbrev,\"\",@progbits"; DwarfInfoSection = "\t.section\t.debug_info,\"\",@progbits";