X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FAlpha%2FAlphaAsmPrinter.cpp;h=133f6c6039359f3fff485cc21b4f506f6439ebf0;hb=b8973bd8f50d7321635e1e07b81a880a0828d185;hp=922a465457ac1e9d22c21bed9c2931955c18685b;hpb=01269524ce08523a06f736e16df84bf536cfe901;p=oota-llvm.git diff --git a/lib/Target/Alpha/AlphaAsmPrinter.cpp b/lib/Target/Alpha/AlphaAsmPrinter.cpp index 922a465457a..133f6c60393 100644 --- a/lib/Target/Alpha/AlphaAsmPrinter.cpp +++ b/lib/Target/Alpha/AlphaAsmPrinter.cpp @@ -1,10 +1,10 @@ //===-- AlphaAsmPrinter.cpp - Alpha LLVM assembly writer ------------------===// -// +// // The LLVM Compiler Infrastructure // // This file was developed by the LLVM research group and is distributed under // the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// //===----------------------------------------------------------------------===// // // This file contains a printer that converts from our internal representation @@ -14,17 +14,15 @@ #include "Alpha.h" #include "AlphaInstrInfo.h" +#include "AlphaTargetMachine.h" #include "llvm/Module.h" +#include "llvm/Type.h" #include "llvm/Assembly/Writer.h" -#include "llvm/CodeGen/MachineConstantPool.h" -#include "llvm/CodeGen/ValueTypes.h" #include "llvm/CodeGen/AsmPrinter.h" - #include "llvm/Target/TargetMachine.h" - #include "llvm/Support/Mangler.h" #include "llvm/ADT/Statistic.h" - +#include using namespace llvm; namespace { @@ -35,10 +33,12 @@ namespace { /// Unique incrementer for label values for referencing Global values. /// unsigned LabelNumber; - - AlphaAsmPrinter(std::ostream &o, TargetMachine &tm) - : AsmPrinter(o, tm), LabelNumber(0) - { } + + AlphaAsmPrinter(std::ostream &o, TargetMachine &tm) + : AsmPrinter(o, tm), LabelNumber(0) { + AlignmentIsInBytes = false; + PrivateGlobalPrefix = "$"; + } /// We name each basic block in a Function with a unique number, so /// that we can consistently refer to them later. This is cleared @@ -46,17 +46,17 @@ namespace { /// typedef std::map ValueMapTy; ValueMapTy NumberForBB; + std::string CurSection; virtual const char *getPassName() const { return "Alpha Assembly Printer"; } bool printInstruction(const MachineInstr *MI); void printOp(const MachineOperand &MO, bool IsCallOp = false); - void printConstantPool(MachineConstantPool *MCP); - void printOperand(const MachineInstr *MI, int opNum, MVT::ValueType VT); + void printOperand(const MachineInstr *MI, int opNum); void printBaseOffsetPair (const MachineInstr *MI, int i, bool brackets=true); void printMachineInstruction(const MachineInstr *MI); - bool runOnMachineFunction(MachineFunction &F); + bool runOnMachineFunction(MachineFunction &F); bool doInitialization(Module &M); bool doFinalization(Module &M); }; @@ -74,7 +74,7 @@ FunctionPass *llvm::createAlphaCodePrinterPass (std::ostream &o, #include "AlphaGenAsmWriter.inc" -void AlphaAsmPrinter::printOperand(const MachineInstr *MI, int opNum, MVT::ValueType VT) +void AlphaAsmPrinter::printOperand(const MachineInstr *MI, int opNum) { const MachineOperand &MO = MI->getOperand(opNum); if (MO.getType() == MachineOperand::MO_MachineRegister) { @@ -91,7 +91,7 @@ void AlphaAsmPrinter::printOperand(const MachineInstr *MI, int opNum, MVT::Value void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) { const MRegisterInfo &RI = *TM.getRegisterInfo(); int new_symbol; - + switch (MO.getType()) { case MachineOperand::MO_VirtualRegister: if (Value *V = MO.getVRegValueOrNull()) { @@ -114,27 +114,34 @@ void AlphaAsmPrinter::printOp(const MachineOperand &MO, bool IsCallOp) { std::cerr << "Shouldn't use addPCDisp() when building Alpha MachineInstrs"; abort(); return; - + case MachineOperand::MO_MachineBasicBlock: { MachineBasicBlock *MBBOp = MO.getMachineBasicBlock(); - O << "$LBB" << Mang->getValueName(MBBOp->getParent()->getFunction()) + O << PrivateGlobalPrefix << "LBB" + << Mang->getValueName(MBBOp->getParent()->getFunction()) << "_" << MBBOp->getNumber() << "\t" << CommentString << " " << MBBOp->getBasicBlock()->getName(); return; } case MachineOperand::MO_ConstantPoolIndex: - O << "$CPI" << CurrentFnName << "_" << MO.getConstantPoolIndex(); + O << PrivateGlobalPrefix << "CPI" << getFunctionNumber() << "_" + << MO.getConstantPoolIndex(); return; case MachineOperand::MO_ExternalSymbol: O << MO.getSymbolName(); return; - case MachineOperand::MO_GlobalAddress: - O << Mang->getValueName(MO.getGlobal()); + case MachineOperand::MO_GlobalAddress: + //Abuse PCrel to specify pcrel calls + //calls are the only thing that use this flag +// if (MO.isPCRelative()) +// O << PrivateGlobalPrefix << Mang->getValueName(MO.getGlobal()) << "..ng"; +// else + O << Mang->getValueName(MO.getGlobal()); return; - + default: O << ""; return; @@ -148,7 +155,7 @@ void AlphaAsmPrinter::printMachineInstruction(const MachineInstr *MI) { ++EmittedInsts; if (printInstruction(MI)) return; // Printer was automatically generated - + assert(0 && "Unhandled instruction in asm writer!"); abort(); return; @@ -159,22 +166,17 @@ void AlphaAsmPrinter::printMachineInstruction(const MachineInstr *MI) { /// method to print assembly for each instruction. /// bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) { - setupMachineFunction(MF); + SetupMachineFunction(MF); O << "\n\n"; - if (CurrentFnName.compare("main") == 0) - { - O << "\n\n#HACK\n\t.text\n\t.ent __main\n__main:\n\tret $31,($26),1\n\t.end __main\n#ENDHACK\n\n"; - } - // Print out constants referenced by the function - printConstantPool(MF.getConstantPool()); + EmitConstantPool(MF.getConstantPool()); // Print out labels for the function. - O << "\t.text\n"; - emitAlignment(2); - O << "\t.globl\t" << CurrentFnName << "\n"; - O << "\t.ent\t" << CurrentFnName << "\n"; + SwitchSection("\t.section .text", MF.getFunction()); + EmitAlignment(4); + O << "\t.globl " << CurrentFnName << "\n"; + O << "\t.ent " << CurrentFnName << "\n"; O << CurrentFnName << ":\n"; @@ -182,8 +184,8 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) { for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); I != E; ++I) { // Print a label for the basic block. - O << "$LBB" << CurrentFnName << "_" << I->getNumber() << ":\t" - << CommentString << " " << I->getBasicBlock()->getName() << "\n"; + O << PrivateGlobalPrefix << "LBB" << CurrentFnName << "_" << I->getNumber() + << ":\t" << CommentString << " " << I->getBasicBlock()->getName() << "\n"; for (MachineBasicBlock::const_iterator II = I->begin(), E = I->end(); II != E; ++II) { // Print the assembly for the instruction. @@ -193,59 +195,28 @@ bool AlphaAsmPrinter::runOnMachineFunction(MachineFunction &MF) { } ++LabelNumber; - O << "\t.end\t" << CurrentFnName << "\n"; + O << "\t.end " << CurrentFnName << "\n"; // We didn't modify anything. return false; } - -/// printConstantPool - Print to the current output stream assembly -/// representations of the constants in the constant pool MCP. This is -/// used to print out constants which have been "spilled to memory" by -/// the code generator. -/// -void AlphaAsmPrinter::printConstantPool(MachineConstantPool *MCP) { - const std::vector &CP = MCP->getConstants(); - const TargetData &TD = TM.getTargetData(); - - if (CP.empty()) return; - - abort(); -// for (unsigned i = 0, e = CP.size(); i != e; ++i) { -// O << "\t.section\t.rodata\n"; -// emitAlignment(TD.getTypeAlignmentShift(CP[i]->getType())); -// O << ".CPI" << CurrentFnName << "_" << i << ":\t\t\t\t\t" << CommentString -// << *CP[i] << "\n"; -// //emitGlobalConstant(CP[i]); -// } -} - bool AlphaAsmPrinter::doInitialization(Module &M) { AsmPrinter::doInitialization(M); - O << "\t.arch ev56\n"; + if(TM.getSubtarget().hasF2I() + || TM.getSubtarget().hasCT()) + O << "\t.arch ev6\n"; + else + O << "\t.arch ev56\n"; + O << "\t.set noat\n"; return false; } - - -// SwitchSection - Switch to the specified section of the executable if we are -// not already in it! -// -static void SwitchSection(std::ostream &OS, std::string &CurSection, - const char *NewSection) { - if (CurSection != NewSection) { - CurSection = NewSection; - if (!CurSection.empty()) - OS << "\t" << NewSection << "\n"; - } -} bool AlphaAsmPrinter::doFinalization(Module &M) { const TargetData &TD = TM.getTargetData(); - std::string CurSection; - - for (Module::const_giterator I = M.gbegin(), E = M.gend(); I != E; ++I) + + for (Module::const_global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) if (I->hasInitializer()) { // External global require no code O << "\n\n"; std::string name = Mang->getValueName(I); @@ -253,13 +224,13 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { unsigned Size = TD.getTypeSize(C->getType()); unsigned Align = TD.getTypeAlignmentShift(C->getType()); - if (C->isNullValue() && + if (C->isNullValue() && (I->hasLinkOnceLinkage() || I->hasInternalLinkage() || I->hasWeakLinkage() /* FIXME: Verify correct */)) { - SwitchSection(O, CurSection, ".data"); + SwitchSection("\t.section .data", I); if (I->hasInternalLinkage()) O << "\t.local " << name << "\n"; - + O << "\t.comm " << name << "," << TD.getTypeSize(C->getType()) << "," << (1 << Align); O << "\t\t# "; @@ -271,8 +242,8 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { case GlobalValue::WeakLinkage: // FIXME: Verify correct for weak. // Nonnull linkonce -> weak O << "\t.weak " << name << "\n"; - SwitchSection(O, CurSection, ""); O << "\t.section\t.llvm.linkonce.d." << name << ",\"aw\",@progbits\n"; + SwitchSection("", I); break; case GlobalValue::AppendingLinkage: // FIXME: appending linkage variables should go into a section of @@ -282,17 +253,15 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { O << "\t.globl " << name << "\n"; // FALL THROUGH case GlobalValue::InternalLinkage: - if (C->isNullValue()) - SwitchSection(O, CurSection, ".bss"); - else - SwitchSection(O, CurSection, ".data"); + SwitchSection(C->isNullValue() ? "\t.section .bss" : + "\t.section .data", I); break; case GlobalValue::GhostLinkage: - std::cerr << "GhostLinkage cannot appear in X86AsmPrinter!\n"; + std::cerr << "GhostLinkage cannot appear in AlphaAsmPrinter!\n"; abort(); } - emitAlignment(Align); + EmitAlignment(Align); O << "\t.type " << name << ",@object\n"; O << "\t.size " << name << "," << Size << "\n"; O << name << ":\t\t\t\t# "; @@ -300,7 +269,7 @@ bool AlphaAsmPrinter::doFinalization(Module &M) { O << " = "; WriteAsOperand(O, C, false, false, &M); O << "\n"; - emitGlobalConstant(C); + EmitGlobalConstant(C); } }