From 8752ce61e1ba3973e0082085c1c3c9b8069ea2b7 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Fri, 1 Dec 2006 20:47:11 +0000 Subject: [PATCH] Add weak reference directive. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32091 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetAsmInfo.h | 7 +++++++ lib/Target/PowerPC/PPCAsmPrinter.cpp | 12 +++++++----- lib/Target/PowerPC/PPCTargetAsmInfo.cpp | 1 + lib/Target/TargetAsmInfo.cpp | 1 + lib/Target/X86/X86AsmPrinter.cpp | 8 ++------ lib/Target/X86/X86TargetAsmInfo.cpp | 2 ++ 6 files changed, 20 insertions(+), 11 deletions(-) diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h index 28c144afa47..050949eeb55 100644 --- a/include/llvm/Target/TargetAsmInfo.h +++ b/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/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 1b9e94a1995..abbcc572555 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/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/lib/Target/PowerPC/PPCTargetAsmInfo.cpp b/lib/Target/PowerPC/PPCTargetAsmInfo.cpp index f8848f592c5..1e380091448 100644 --- a/lib/Target/PowerPC/PPCTargetAsmInfo.cpp +++ b/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/lib/Target/TargetAsmInfo.cpp b/lib/Target/TargetAsmInfo.cpp index 2b4f2f79c8e..8b818fb3ea4 100644 --- a/lib/Target/TargetAsmInfo.cpp +++ b/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/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index b92a087859d..722697527c3 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/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/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index 4d44b7d591e..ed9f1ac3132 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/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";