diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-12-01 09:13:26 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-12-01 09:13:26 +0000 |
commit | 5fb2c76d599717900305e500222fd4c997061455 (patch) | |
tree | f03653bc2d44f1adaeac12555aeaec94337688b9 /llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | |
parent | fa54c0b6fb1770bf723e28b83ca9bf92c5a6e034 (diff) | |
download | bcm5719-llvm-5fb2c76d599717900305e500222fd4c997061455.tar.gz bcm5719-llvm-5fb2c76d599717900305e500222fd4c997061455.zip |
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.
llvm-svn: 32069
Diffstat (limited to 'llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index fdc335d4cf4..0998c29226a 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/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<GlobalValue>(C)) + if (GV->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(Mang->getValueName(GV)); + EmitGlobalConstant(C); O << '\n'; } |