From: Evan Cheng Date: Fri, 1 Dec 2006 09:13:26 +0000 (+0000) Subject: A initialized global variable cannot be extern weak. However, if a global value's... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=81cf60fceb411b5cc8a161d4332c5c9d0784f326;p=oota-llvm.git A initialized global variable cannot be extern weak. However, if a global value's initializer is itself a external weak symbol, emit the weak reference. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32069 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index fdc335d4cf4..0998c29226a 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -605,6 +605,9 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { } else { switch (I->getLinkage()) { case GlobalValue::LinkOnceLinkage: + case GlobalValue::ExternalWeakLinkage: + O << "\t.weak_reference " << name << "\n"; + break; case GlobalValue::WeakLinkage: O << "\t.globl " << name << '\n' << "\t.weak_definition " << name << '\n'; @@ -635,6 +638,13 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { EmitAlignment(Align, I); O << name << ":\t\t\t\t; '" << I->getName() << "'\n"; + + // If the initializer is a extern weak symbol, remember to emit the weak + // reference! + if (const GlobalValue *GV = dyn_cast(C)) + if (GV->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(Mang->getValueName(GV)); + EmitGlobalConstant(C); O << '\n'; } diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index a37cbb5406b..b92a087859d 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -177,17 +177,6 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { O << "\t\t" << TAI->getCommentString() << " " << I->getName() << "\n"; } else { switch (I->getLinkage()) { - case GlobalValue::ExternalWeakLinkage: - if (Subtarget->isTargetDarwin()) { - assert(0 && "External weak linkage for Darwin not implemented yet"); - } else if (Subtarget->isTargetCygwin()) { - // There is no external weak linkage on Mingw32 platform. - // Defaulting just to external - O << "\t.globl " << name << "\n"; - } else { - O << "\t.weak " << name << "\n"; - break; - } case GlobalValue::LinkOnceLinkage: case GlobalValue::WeakLinkage: if (Subtarget->isTargetDarwin()) { @@ -257,6 +246,12 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { if (TAI->hasDotTypeDotSizeDirective()) O << "\t.size " << name << ", " << Size << "\n"; + // If the initializer is a extern weak symbol, remember to emit the weak + // reference! + if (const GlobalValue *GV = dyn_cast(C)) + if (GV->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(Mang->getValueName(GV)); + EmitGlobalConstant(C); O << '\n'; }