From: Rafael Espindola Date: Wed, 6 Dec 2006 13:35:10 +0000 (+0000) Subject: print weak references X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=392b1b2ef3ace82b5104ba4c9280fc7957c669d4;p=oota-llvm.git print weak references git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32276 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 093dd6db17c..5eadee20db1 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -63,6 +63,8 @@ namespace { : AsmPrinter(O, TM, T) { } + std::set ExtWeakSymbols; + /// We name each basic block in a Function with a unique number, so /// that we can consistently refer to them later. This is cleared /// at the beginning of each call to runOnMachineFunction(). @@ -127,7 +129,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { break; case Function::WeakLinkage: case Function::LinkOnceLinkage: - O << "\t.weak\t" << CurrentFnName << "\n"; + O << TAI->getWeakRefDirective() << CurrentFnName << "\n"; break; } EmitAlignment(2, F); @@ -244,6 +246,9 @@ void ARMAsmPrinter::printOperand(const MachineInstr *MI, int opNum) { GlobalValue *GV = MO.getGlobal(); std::string Name = Mang->getValueName(GV); O << Name; + if (GV->hasExternalWeakLinkage()) { + ExtWeakSymbols.insert(Name); + } } break; case MachineOperand::MO_ExternalSymbol: @@ -325,6 +330,13 @@ bool ARMAsmPrinter::doFinalization(Module &M) { } } + if (ExtWeakSymbols.begin() != ExtWeakSymbols.end()) + SwitchToDataSection(""); + for (std::set::iterator i = ExtWeakSymbols.begin(), + e = ExtWeakSymbols.end(); i != e; ++i) { + O << TAI->getWeakRefDirective() << *i << "\n"; + } + AsmPrinter::doFinalization(M); return false; // success } diff --git a/lib/Target/ARM/ARMTargetAsmInfo.cpp b/lib/Target/ARM/ARMTargetAsmInfo.cpp index 90db4666763..510c0092ff5 100644 --- a/lib/Target/ARM/ARMTargetAsmInfo.cpp +++ b/lib/Target/ARM/ARMTargetAsmInfo.cpp @@ -23,4 +23,5 @@ ARMTargetAsmInfo::ARMTargetAsmInfo(const ARMTargetMachine &TM) { CommentString = "@"; ConstantPoolSection = "\t.text\n"; AlignmentIsInBytes = false; + WeakRefDirective = "\t.weak\t"; } diff --git a/test/CodeGen/ARM/weak.ll b/test/CodeGen/ARM/weak.ll index 682da8c42bb..049b1ebbe70 100644 --- a/test/CodeGen/ARM/weak.ll +++ b/test/CodeGen/ARM/weak.ll @@ -1,5 +1,6 @@ ; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm && -; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep .weak +; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep .weak.*f && +; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep .weak.*h implementation ; Functions: @@ -7,3 +8,11 @@ weak uint %f() { entry: unreachable } + +void %g() { +entry: + tail call void %h( ) + ret void +} + +declare extern_weak void %h()