X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FAsmPrinter%2FAsmPrinter.cpp;h=5f730e03c6f5181a4fa839c81d27c5d34a943126;hb=618f17702d09795279717827eeb06632d6ef49e4;hp=68fd77c0bdb5a97ac915835019171e291c98fc4f;hpb=14c38ec2afeaf25c53a50c2c65116aca8c889401;p=oota-llvm.git diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 68fd77c0bdb..5f730e03c6f 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -25,6 +25,7 @@ #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/DebugInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" @@ -53,34 +54,16 @@ using namespace llvm; STATISTIC(EmittedInsts, "Number of machine instrs printed"); -static cl::opt -AsmVerbose("asm-verbose", cl::desc("Add comments to directives."), - cl::init(cl::BOU_UNSET)); - -static bool getVerboseAsm(bool VDef) { - switch (AsmVerbose) { - default: - case cl::BOU_UNSET: return VDef; - case cl::BOU_TRUE: return true; - case cl::BOU_FALSE: return false; - } -} - char AsmPrinter::ID = 0; AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, - const MCAsmInfo *T, bool VDef) + MCContext &Ctx, MCStreamer &Streamer, + const MCAsmInfo *T) : MachineFunctionPass(&ID), O(o), TM(tm), MAI(T), TRI(tm.getRegisterInfo()), - - OutContext(*new MCContext()), - // FIXME: Pass instprinter to streamer. - OutStreamer(*createAsmStreamer(OutContext, O, *T, - TM.getTargetData()->isLittleEndian(), - getVerboseAsm(VDef), 0)), - + OutContext(Ctx), OutStreamer(Streamer), LastMI(0), LastFn(0), Counter(~0U), PrevDLT(NULL) { DW = 0; MMI = 0; - VerboseAsm = getVerboseAsm(VDef); + VerboseAsm = Streamer.isVerboseAsm(); } AsmPrinter::~AsmPrinter() { @@ -344,6 +327,8 @@ void AsmPrinter::EmitFunctionEntryLabel() { /// EmitFunctionBody - This method emits the body and trailer for a /// function. void AsmPrinter::EmitFunctionBody() { + // Emit target-specific gunk before the function body. + EmitFunctionBodyStart(); // Print out code for the function. bool HasAnyRealCode = false; @@ -362,11 +347,27 @@ void AsmPrinter::EmitFunctionBody() { // FIXME: Clean up processDebugLoc. processDebugLoc(II, true); - EmitInstruction(II); - + switch (II->getOpcode()) { + case TargetInstrInfo::DBG_LABEL: + case TargetInstrInfo::EH_LABEL: + case TargetInstrInfo::GC_LABEL: + printLabelInst(II); + break; + case TargetInstrInfo::INLINEASM: + printInlineAsm(II); + break; + case TargetInstrInfo::IMPLICIT_DEF: + printImplicitDef(II); + break; + case TargetInstrInfo::KILL: + printKill(II); + break; + default: + EmitInstruction(II); + break; + } if (VerboseAsm) EmitComments(*II); - O << '\n'; // FIXME: Clean up processDebugLoc. processDebugLoc(II, false); @@ -374,12 +375,13 @@ void AsmPrinter::EmitFunctionBody() { } // If the function is empty and the object file uses .subsections_via_symbols, - // then we need to emit *some* thing to the function body to prevent the - // labels from collapsing together. - if (MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) { - // FIXME: EmitByte(0). - O << "\tnop\n"; - } + // then we need to emit *something* to the function body to prevent the + // labels from collapsing together. Just emit a 0 byte. + if (MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) + OutStreamer.EmitIntValue(0, 1, 0/*addrspace*/); + + // Emit target-specific gunk after the function body. + EmitFunctionBodyEnd(); if (MAI->hasDotTypeDotSizeDirective()) O << "\t.size\t" << *CurrentFnSym << ", .-" << *CurrentFnSym << '\n'; @@ -390,6 +392,8 @@ void AsmPrinter::EmitFunctionBody() { // Print out jump tables referenced by the function. EmitJumpTableInfo(); + + OutStreamer.AddBlankLine(); } @@ -884,15 +888,16 @@ static const MCExpr *LowerConstant(const Constant *CV, AsmPrinter &AP) { } switch (CE->getOpcode()) { - case Instruction::ZExt: - case Instruction::SExt: - case Instruction::FPTrunc: - case Instruction::FPExt: - case Instruction::UIToFP: - case Instruction::SIToFP: - case Instruction::FPToUI: - case Instruction::FPToSI: - default: llvm_unreachable("FIXME: Don't support this constant cast expr"); + default: + // If the code isn't optimized, there may be outstanding folding + // opportunities. Attempt to fold the expression using TargetData as a + // last resort before giving up. + if (Constant *C = ConstantFoldConstantExpression(CE, AP.TM.getTargetData())) + return LowerConstant(C, AP); +#ifndef NDEBUG + CE->dump(); +#endif + llvm_unreachable("FIXME: Don't support this constant expr"); case Instruction::GetElementPtr: { const TargetData &TD = *AP.TM.getTargetData(); // Generate a symbolic expression for the byte address @@ -1117,6 +1122,7 @@ static void EmitGlobalConstantLargeInt(const ConstantInt *CI, void AsmPrinter::EmitGlobalConstant(const Constant *CV, unsigned AddrSpace) { if (isa(CV) || isa(CV)) { uint64_t Size = TM.getTargetData()->getTypeAllocSize(CV->getType()); + if (Size == 0) Size = 1; // An empty "_foo:" followed by a section is undef. return OutStreamer.EmitZeros(Size, AddrSpace); } @@ -1424,7 +1430,7 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const { } } } - O << "\n\t" << MAI->getCommentString() << MAI->getInlineAsmEnd(); + O << "\n\t" << MAI->getCommentString() << MAI->getInlineAsmEnd() << '\n'; } /// printImplicitDef - This method prints the specified machine instruction @@ -1433,7 +1439,7 @@ void AsmPrinter::printImplicitDef(const MachineInstr *MI) const { if (!VerboseAsm) return; O.PadToColumn(MAI->getCommentColumn()); O << MAI->getCommentString() << " implicit-def: " - << TRI->getName(MI->getOperand(0).getReg()); + << TRI->getName(MI->getOperand(0).getReg()) << '\n'; } void AsmPrinter::printKill(const MachineInstr *MI) const { @@ -1445,12 +1451,14 @@ void AsmPrinter::printKill(const MachineInstr *MI) const { assert(op.isReg() && "KILL instruction must have only register operands"); O << ' ' << TRI->getName(op.getReg()) << (op.isDef() ? "" : ""); } + O << '\n'; } /// printLabel - This method prints a local label used by debug and /// exception handling tables. -void AsmPrinter::printLabel(const MachineInstr *MI) const { +void AsmPrinter::printLabelInst(const MachineInstr *MI) const { printLabel(MI->getOperand(0).getImm()); + O << '\n'; } void AsmPrinter::printLabel(unsigned Id) const { @@ -1578,7 +1586,7 @@ static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop, } } -/// EmitComments - Pretty-print comments for basic blocks. +/// PrintBasicBlockLoopComments - Pretty-print comments for basic blocks. static void PrintBasicBlockLoopComments(const MachineBasicBlock &MBB, const MachineLoopInfo *LI, const AsmPrinter &AP) { @@ -1714,8 +1722,6 @@ void AsmPrinter::EmitComments(const MachineInstr &MI) const { if (!VerboseAsm) return; - bool Newline = false; - if (!MI.getDebugLoc().isUnknown()) { DILocation DLT = MF->getDILocation(MI.getDebugLoc()); @@ -1731,7 +1737,7 @@ void AsmPrinter::EmitComments(const MachineInstr &MI) const { O << ':' << DLT.getLineNumber(); if (DLT.getColumnNumber() != 0) O << ':' << DLT.getColumnNumber(); - Newline = true; + O << '\n'; } // Check for spills and reloads @@ -1746,37 +1752,29 @@ void AsmPrinter::EmitComments(const MachineInstr &MI) const { if (TM.getInstrInfo()->isLoadFromStackSlotPostFE(&MI, FI)) { if (FrameInfo->isSpillSlotObjectIndex(FI)) { MMO = *MI.memoperands_begin(); - if (Newline) O << '\n'; O.PadToColumn(MAI->getCommentColumn()); - O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Reload"; - Newline = true; + O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Reload\n"; } } else if (TM.getInstrInfo()->hasLoadFromStackSlot(&MI, MMO, FI)) { if (FrameInfo->isSpillSlotObjectIndex(FI)) { - if (Newline) O << '\n'; O.PadToColumn(MAI->getCommentColumn()); O << MAI->getCommentString() << ' ' - << MMO->getSize() << "-byte Folded Reload"; - Newline = true; + << MMO->getSize() << "-byte Folded Reload\n"; } } else if (TM.getInstrInfo()->isStoreToStackSlotPostFE(&MI, FI)) { if (FrameInfo->isSpillSlotObjectIndex(FI)) { MMO = *MI.memoperands_begin(); - if (Newline) O << '\n'; O.PadToColumn(MAI->getCommentColumn()); - O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Spill"; - Newline = true; + O << MAI->getCommentString() << ' ' << MMO->getSize() << "-byte Spill\n"; } } else if (TM.getInstrInfo()->hasStoreToStackSlot(&MI, MMO, FI)) { if (FrameInfo->isSpillSlotObjectIndex(FI)) { - if (Newline) O << '\n'; O.PadToColumn(MAI->getCommentColumn()); O << MAI->getCommentString() << ' ' - << MMO->getSize() << "-byte Folded Spill"; - Newline = true; + << MMO->getSize() << "-byte Folded Spill\n"; } } @@ -1785,9 +1783,8 @@ void AsmPrinter::EmitComments(const MachineInstr &MI) const { if (TM.getInstrInfo()->isMoveInstr(MI, SrcReg, DstReg, SrcSubIdx, DstSubIdx)) { if (MI.getAsmPrinterFlag(ReloadReuse)) { - if (Newline) O << '\n'; O.PadToColumn(MAI->getCommentColumn()); - O << MAI->getCommentString() << " Reload Reuse"; + O << MAI->getCommentString() << " Reload Reuse\n"; } } }