X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FARM%2FARMAsmPrinter.cpp;h=e57a7685077820bfd3a32e421843bb4c9f75e1ff;hb=f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8;hp=51a0f883d2ddb10874df8a4b7fca49c9056c93f2;hpb=f819a4999aedd00368c850c1707e7ed0d59b4ace;p=oota-llvm.git diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 51a0f883d2d..e57a7685077 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -18,7 +18,6 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Module.h" -#include "llvm/Assembly/Writer.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineConstantPool.h" @@ -32,11 +31,10 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/MathExtras.h" #include -#include using namespace llvm; namespace { - Statistic<> EmittedInsts("asm-printer", "Number of machine instrs printed"); + Statistic EmittedInsts("asm-printer", "Number of machine instrs printed"); static const char *ARMCondCodeToString(ARMCC::CondCodes CC) { switch (CC) { @@ -64,6 +62,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(). @@ -128,7 +128,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) { break; case Function::WeakLinkage: case Function::LinkOnceLinkage: - assert(0 && "Not implemented"); + O << TAI->getWeakRefDirective() << CurrentFnName << "\n"; break; } EmitAlignment(2, F); @@ -245,6 +245,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: @@ -292,6 +295,7 @@ bool ARMAsmPrinter::doFinalization(Module &M) { unsigned Align = TD->getTypeAlignment(C->getType()); if (C->isNullValue() && + !I->hasSection() && (I->hasLinkOnceLinkage() || I->hasInternalLinkage() || I->hasWeakLinkage())) { SwitchToDataSection(".data", I); @@ -300,9 +304,6 @@ bool ARMAsmPrinter::doFinalization(Module &M) { O << "\t.comm " << name << "," << TD->getTypeSize(C->getType()) << "," << (unsigned)TD->getTypeAlignment(C->getType()); - O << "\t\t"; - O << TAI->getCommentString() << " "; - WriteAsOperand(O, I, true, true, &M); O << "\n"; } else { switch (I->getLinkage()) { @@ -329,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 }