diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-12-01 07:56:37 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-12-01 07:56:37 +0000 |
commit | 1c45a6687399d57d8da234d61f936ee37a108a45 (patch) | |
tree | 5add929022634f4a78c8aa1cca2bd25abc0127a1 /lib/Target/PowerPC/PPCAsmPrinter.cpp | |
parent | 6d7d310519ad3010a3830eef3d3eed1068e411a1 (diff) | |
download | external_llvm-1c45a6687399d57d8da234d61f936ee37a108a45.zip external_llvm-1c45a6687399d57d8da234d61f936ee37a108a45.tar.gz external_llvm-1c45a6687399d57d8da234d61f936ee37a108a45.tar.bz2 |
Darwin PPC external weak linkage support.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32068 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/PowerPC/PPCAsmPrinter.cpp')
-rw-r--r-- | lib/Target/PowerPC/PPCAsmPrinter.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index b5962ea..fdc335d 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -52,6 +52,9 @@ namespace { std::set<std::string> FnStubs, GVStubs; const PPCSubtarget &Subtarget; + // Necessary for external weak linkage support + std::set<std::string> ExtWeakSymbols; + PPCAsmPrinter(std::ostream &O, TargetMachine &TM, const TargetAsmInfo *T) : AsmPrinter(O, TM, T), Subtarget(TM.getSubtarget<PPCSubtarget>()) { } @@ -159,6 +162,8 @@ namespace { std::string Name = Mang->getValueName(GV); FnStubs.insert(Name); O << "L" << Name << "$stub"; + if (GV->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(Name); return; } } @@ -330,8 +335,10 @@ void PPCAsmPrinter::printOp(const MachineOperand &MO) { return; } } - O << Name; + + if (GV->hasExternalWeakLinkage()) + ExtWeakSymbols.insert(Name); return; } @@ -633,6 +640,13 @@ bool DarwinAsmPrinter::doFinalization(Module &M) { } } + if (ExtWeakSymbols.begin() != ExtWeakSymbols.end()) + SwitchToDataSection(""); + for (std::set<std::string>::iterator i = ExtWeakSymbols.begin(), + e = ExtWeakSymbols.end(); i != e; ++i) { + O << "\t.weak_reference " << *i << "\n"; + } + bool isPPC64 = TD->getPointerSizeInBits() == 64; // Output stubs for dynamically-linked functions |