diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index 59323a5c1a0..2262de8f4ab 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -59,8 +59,7 @@ namespace llvm { public: /// DW - If available, this is a pointer to the current dwarf writer. DwarfWriter *DW; - - + /// Target machine description. /// TargetMachine &TM; @@ -219,6 +218,16 @@ namespace llvm { assert(0 && "EmitInstruction not implemented"); } + virtual void EmitFunctionEntryLabel(); + + virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); + + /// isBlockOnlyReachableByFallthough - Return true if the basic block has + /// exactly one predecessor and the control transfer mechanism between + /// the predecessor and this block is a fall-through. + virtual bool + isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const; + //===------------------------------------------------------------------===// // Lowering Routines. //===------------------------------------------------------------------===// @@ -276,51 +285,15 @@ namespace llvm { void EmitBasicBlockStart(const MachineBasicBlock *MBB) const; - // Data emission. - /// EmitGlobalConstant - Print a general LLVM constant to the .s file. void EmitGlobalConstant(const Constant *CV, unsigned AddrSpace = 0); - protected: - virtual void EmitFunctionEntryLabel(); - - virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); - - /// printOffset - This is just convenient handler for printing offsets. - void printOffset(int64_t Offset, raw_ostream &OS) const; - - /// isBlockOnlyReachableByFallthough - Return true if the basic block has - /// exactly one predecessor and the control transfer mechanism between - /// the predecessor and this block is a fall-through. - virtual bool - isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const; - - private: - /// EmitImplicitDef - This method emits the specified machine instruction - /// that is an implicit def. - void EmitImplicitDef(const MachineInstr *MI) const; - - /// EmitKill - This method emits the specified kill machine instruction. - void EmitKill(const MachineInstr *MI) const; - - /// EmitVisibility - This emits visibility information about symbol, if - /// this is suported by the target. - void EmitVisibility(MCSymbol *Sym, unsigned Visibility) const; - - void EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const; - - void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, - const MachineBasicBlock *MBB, - unsigned uid) const; - void EmitLLVMUsedList(Constant *List); - void EmitXXStructorList(Constant *List); - GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); - - //===------------------------------------------------------------------===// // Emission Helper Routines. //===------------------------------------------------------------------===// public: + /// printOffset - This is just convenient handler for printing offsets. + void printOffset(int64_t Offset, raw_ostream &OS) const; /// EmitInt8 - Emit a byte directive and value. /// @@ -388,6 +361,23 @@ namespace llvm { /// EmitInlineAsm - This method formats and emits the specified machine /// instruction that is an inline asm. void EmitInlineAsm(const MachineInstr *MI) const; + + //===------------------------------------------------------------------===// + // Internal Implementation Details + //===------------------------------------------------------------------===// + + /// EmitVisibility - This emits visibility information about symbol, if + /// this is suported by the target. + void EmitVisibility(MCSymbol *Sym, unsigned Visibility) const; + + void EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const; + + void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, + const MachineBasicBlock *MBB, + unsigned uid) const; + void EmitLLVMUsedList(Constant *List); + void EmitXXStructorList(Constant *List); + GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); }; } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index eb937ec0cdd..62207f2fcd4 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -401,6 +401,28 @@ static void EmitComments(const MachineInstr &MI, raw_ostream &CommentOS) { } } +/// EmitImplicitDef - This method emits the specified machine instruction +/// that is an implicit def. +static void EmitImplicitDef(const MachineInstr *MI, AsmPrinter &AP) { + unsigned RegNo = MI->getOperand(0).getReg(); + AP.OutStreamer.AddComment(Twine("implicit-def: ") + + AP.TM.getRegisterInfo()->getName(RegNo)); + AP.OutStreamer.AddBlankLine(); +} + +static void EmitKill(const MachineInstr *MI, AsmPrinter &AP) { + std::string Str = "kill:"; + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { + const MachineOperand &Op = MI->getOperand(i); + assert(Op.isReg() && "KILL instruction must have only register operands"); + Str += ' '; + Str += AP.TM.getRegisterInfo()->getName(Op.getReg()); + Str += (Op.isDef() ? "" : ""); + } + AP.OutStreamer.AddComment(Str); + AP.OutStreamer.AddBlankLine(); +} + /// EmitFunctionBody - This method emits the body and trailer for a @@ -442,10 +464,10 @@ void AsmPrinter::EmitFunctionBody() { EmitInlineAsm(II); break; case TargetOpcode::IMPLICIT_DEF: - EmitImplicitDef(II); + if (isVerbose()) EmitImplicitDef(II, *this); break; case TargetOpcode::KILL: - EmitKill(II); + if (isVerbose()) EmitKill(II, *this); break; default: EmitInstruction(II); @@ -1324,31 +1346,6 @@ void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const { } -/// EmitImplicitDef - This method emits the specified machine instruction -/// that is an implicit def. -void AsmPrinter::EmitImplicitDef(const MachineInstr *MI) const { - if (!isVerbose()) return; - unsigned RegNo = MI->getOperand(0).getReg(); - OutStreamer.AddComment(Twine("implicit-def: ") + - TM.getRegisterInfo()->getName(RegNo)); - OutStreamer.AddBlankLine(); -} - -void AsmPrinter::EmitKill(const MachineInstr *MI) const { - if (!isVerbose()) return; - - std::string Str = "kill:"; - for (unsigned n = 0, e = MI->getNumOperands(); n != e; ++n) { - const MachineOperand &Op = MI->getOperand(n); - assert(Op.isReg() && "KILL instruction must have only register operands"); - Str += ' '; - Str += TM.getRegisterInfo()->getName(Op.getReg()); - Str += (Op.isDef() ? "" : ""); - } - OutStreamer.AddComment(Str); - OutStreamer.AddBlankLine(); -} - MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const { return MMI->getAddrLabelSymbol(BA->getBasicBlock()); }