summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-12-01 09:13:26 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-12-01 09:13:26 +0000
commit5fb2c76d599717900305e500222fd4c997061455 (patch)
treef03653bc2d44f1adaeac12555aeaec94337688b9 /llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
parentfa54c0b6fb1770bf723e28b83ca9bf92c5a6e034 (diff)
downloadbcm5719-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.cpp10
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';
}
OpenPOWER on IntegriCloud