AsmPrinter.h revision 812209a58c5520c604bc9279aa069e5ae066e860
1a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===-- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework --------*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 3a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// The LLVM Compiler Infrastructure 4a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 8a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 9a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 10563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// This file contains a class to be used as the base class for target specific 11563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// asm writers. This class primarily handles common functionality used by 12563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey// all asm writers. 13a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 14a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 15a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 16a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#ifndef LLVM_CODEGEN_ASMPRINTER_H 17a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#define LLVM_CODEGEN_ASMPRINTER_H 18a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 19a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#include "llvm/CodeGen/MachineFunctionPass.h" 20fe37ab335be5632eab561d49984c95cb06b946d4David Greene#include "llvm/Support/DebugLoc.h" 2198a366d547772010e94609e4584489b3e5ce0043Bill Wendling#include "llvm/Target/TargetMachine.h" 22dd061f6085e7492089befa7ed88dd0669ccb049aChris Lattner#include "llvm/ADT/DenseMap.h" 23a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 24a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 255eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen class GCStrategy; 26a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Constant; 27c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen class ConstantArray; 28fe37ab335be5632eab561d49984c95cb06b946d4David Greene class ConstantFP; 2900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman class ConstantInt; 3000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman class ConstantStruct; 3100d448a341175556ebd86af68219f5b90b7145a3Dan Gohman class ConstantVector; 32c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen class GCMetadataPrinter; 33fe37ab335be5632eab561d49984c95cb06b946d4David Greene class GlobalValue; 34ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner class GlobalVariable; 35fe37ab335be5632eab561d49984c95cb06b946d4David Greene class MachineBasicBlock; 36fe37ab335be5632eab561d49984c95cb06b946d4David Greene class MachineFunction; 37fe37ab335be5632eab561d49984c95cb06b946d4David Greene class MachineInstr; 38b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene class MachineLoopInfo; 39b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene class MachineLoop; 40fe37ab335be5632eab561d49984c95cb06b946d4David Greene class MachineConstantPool; 412d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng class MachineConstantPoolEntry; 42d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng class MachineConstantPoolValue; 43fe37ab335be5632eab561d49984c95cb06b946d4David Greene class MachineJumpTableInfo; 440de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner class MachineModuleInfo; 45014700c1a8cba203fd21ff129426ba8a426ab244David Greene class MCInst; 462b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner class MCContext; 47a87dea4f8c546ca748f1777a8d1cabcc06515d91Chris Lattner class MCSection; 482b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner class MCStreamer; 497cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner class MCSymbol; 50c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel class DwarfWriter; 51563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class Mangler; 52af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner class MCAsmInfo; 53f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner class TargetLoweringObjectFile; 5484bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner class Type; 5571847813bc419f7a0667468136a07429c6d9f164David Greene class formatted_raw_ostream; 56a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 57563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// AsmPrinter - This class is intended to be used as a driving class for all 58563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// asm writers. 59a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 601997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 61794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 62347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// FunctionNumber - This provides a unique ID for each function emitted in 63347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// this translation unit. It is autoincremented by SetupMachineFunction, 64347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// and can be accessed with getFunctionNumber() and 65347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber(). 66347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// 67347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng unsigned FunctionNumber; 68347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 69c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen // GCMetadataPrinters - The garbage collection metadata printer table. 705eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen typedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type; 71c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen typedef gcp_map_type::iterator gcp_iterator; 72c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen gcp_map_type GCMetadataPrinters; 7367e59834fc1dca7e357c40af2e5144f3d62f5133David Greene 742d320867494351031216d76c5b3e6a2789461881Chris Lattner /// If VerboseAsm is set, a pointer to the loop info for this 75b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene /// function. 76b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene /// 77b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene MachineLoopInfo *LI; 78b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 79dc62ea0f1c6eb0673f39c543f1936ce125efdb30Chris Lattner public: 800de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner /// MMI - If available, this is a pointer to the current MachineModuleInfo. 810de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner MachineModuleInfo *MMI; 820de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner 83dc62ea0f1c6eb0673f39c543f1936ce125efdb30Chris Lattner protected: 840de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner /// DW - If available, this is a pointer to the current dwarf writer. 85cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling DwarfWriter *DW; 86014700c1a8cba203fd21ff129426ba8a426ab244David Greene 87b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey public: 88a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 89a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 9071847813bc419f7a0667468136a07429c6d9f164David Greene formatted_raw_ostream &O; 91a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 92a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 93a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 94a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 95563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 96f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner /// getObjFileLowering - Return information about object file lowering. 9738c398808cff7defdf013fa750dfac8e66302975Chris Lattner TargetLoweringObjectFile &getObjFileLowering() const; 98f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 99563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// Target Asm Printer information. 100563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// 10133adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner const MCAsmInfo *MAI; 102a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 103da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// Target Register Information. 104da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// 105da47e6e0d003c873da960361549e57ee4617c301Evan Cheng const TargetRegisterInfo *TRI; 106da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 1072b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// OutContext - This is the context for the output file that we are 1082b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// streaming. This owns all of the global MC-related objects for the 1092b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// generated translation unit. 1102b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner MCContext &OutContext; 1112b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 1122b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// OutStreamer - This is the MCStreamer object for the file we are 1132b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// generating. This contains the transient state for the current 1142b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// translation unit that we are generating (such as the current section 1152b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// etc). 1162b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner MCStreamer &OutStreamer; 1172b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 11857f0db833dc30404f1f5d28b23df326e520698ecBill Wendling /// The current machine function. 11957f0db833dc30404f1f5d28b23df326e520698ecBill Wendling const MachineFunction *MF; 12057f0db833dc30404f1f5d28b23df326e520698ecBill Wendling 121a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 122a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 123a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 124a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 125a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 126a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 127a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 128a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 12997e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 130290c2f56ce551ebcf4480ac2944986fe4bb339e9Chris Lattner /// getCurrentSection() - Return the current section we are emitting to. 131dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattner const MCSection *getCurrentSection() const; 132290c2f56ce551ebcf4480ac2944986fe4bb339e9Chris Lattner 13342bf74be1402df7409efbea089310d4c276fde37Evan Cheng 13442bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// VerboseAsm - Emit comments in assembly output if this is true. 13542bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 13642bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool VerboseAsm; 13742bf74be1402df7409efbea089310d4c276fde37Evan Cheng 138bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson /// Private state for PrintSpecial() 139bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson // Assign a unique ID to this machine instruction. 140bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson mutable const MachineInstr *LastMI; 141bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson mutable const Function *LastFn; 142bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson mutable unsigned Counter; 143a8dbf36f3f88917b101d7ab9d253ba2fe6e396b4Owen Anderson 144a8dbf36f3f88917b101d7ab9d253ba2fe6e396b4Owen Anderson // Private state for processDebugLock() 145a8dbf36f3f88917b101d7ab9d253ba2fe6e396b4Owen Anderson mutable DebugLocTuple PrevDLT; 146bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson 147b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey protected: 14871847813bc419f7a0667468136a07429c6d9f164David Greene explicit AsmPrinter(formatted_raw_ostream &o, TargetMachine &TM, 149af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *T, bool V); 150ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 151a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey public: 152c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen virtual ~AsmPrinter(); 15342bf74be1402df7409efbea089310d4c276fde37Evan Cheng 15442bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// isVerbose - Return true if assembly output should contain comments. 15542bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 15642bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool isVerbose() const { return VerboseAsm; } 15742bf74be1402df7409efbea089310d4c276fde37Evan Cheng 1583fb2b1ede30193b59a651328a946174196b20610Jim Grosbach /// getFunctionNumber - Return a unique ID for the current function. 1593fb2b1ede30193b59a651328a946174196b20610Jim Grosbach /// 1603fb2b1ede30193b59a651328a946174196b20610Jim Grosbach unsigned getFunctionNumber() const { return FunctionNumber; } 1613fb2b1ede30193b59a651328a946174196b20610Jim Grosbach 162a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey protected: 163ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// getAnalysisUsage - Record analysis usage. 164ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// 165ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen void getAnalysisUsage(AnalysisUsage &AU) const; 166ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 167a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 168a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 169a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 170a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 171a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 172812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson /// EmitStartOfAsmFile - This virtual method can be overridden by targets 173812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson /// that want to emit something at the start of their file. 174812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson virtual void EmitStartOfAsmFile(Module &M) {} 175812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson 176bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner /// EmitEndOfAsmFile - This virtual method can be overridden by targets that 177bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner /// want to emit something at the end of their file. 178bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner virtual void EmitEndOfAsmFile(Module &M) {} 179bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner 180a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 181a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 182a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 1833ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1843ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// PrintSpecial - Print information related to the specified machine instr 1853ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// that is independent of the operand, and may be independent of the instr 1863ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// itself. This can be useful for portably encoding the comment character 1873ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// or other bits of target-specific knowledge into the asmstrings. The 1883ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// syntax used is ${:comment}. Targets can override this to add support 1893ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// for their own strange codes. 1903e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner virtual void PrintSpecial(const MachineInstr *MI, const char *Code) const; 19147cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 19247cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 19347cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// instruction, using the specified assembler variant. Targets should 194b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// override this to format as appropriate. This method can return true if 19547cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// the operand is erroneous. 19647cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 197f483e58212d018f8b2ec760f59089e72defab5cfChris Lattner unsigned AsmVariant, const char *ExtraCode); 198b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 199b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// PrintAsmMemoryOperand - Print the specified operand of MI, an INLINEASM 200b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// instruction, using the specified assembler variant as an address. 201b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// Targets should override this to format as appropriate. This method can 202b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// return true if the operand is erroneous. 203b44b5094110508e2381615b15077b388364f7e8aChris Lattner virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 204b44b5094110508e2381615b15077b388364f7e8aChris Lattner unsigned AsmVariant, 205b44b5094110508e2381615b15077b388364f7e8aChris Lattner const char *ExtraCode); 206b44b5094110508e2381615b15077b388364f7e8aChris Lattner 20740bbebde9d250b875a47a688d0c6552834ada48fChris Lattner /// PrintGlobalVariable - Emit the specified global variable and its 20840bbebde9d250b875a47a688d0c6552834ada48fChris Lattner /// initializer to the output stream. 20940bbebde9d250b875a47a688d0c6552834ada48fChris Lattner virtual void PrintGlobalVariable(const GlobalVariable *GV) = 0; 210bef8768bd0576eec0470a80e3039cd5d1fd50c6bDavid Greene 2116fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// SetupMachineFunction - This should be called when a new MachineFunction 212a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 2136fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void SetupMachineFunction(MachineFunction &MF); 21497e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 215347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber - Increase Function Number. AsmPrinters should 216347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// not normally call this, as the counter is automatically bumped by 217347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// SetupMachineFunction. 218347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng void IncrementFunctionNumber() { FunctionNumber++; } 219347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 220ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitConstantPool - Print to the current output stream assembly 221ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// representations of the constants in the constant pool MCP. This is 222ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// used to print out constants which have been "spilled to memory" by 223ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// the code generator. 224ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// 2252d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng void EmitConstantPool(MachineConstantPool *MCP); 226a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 22737efe6764568a3829fee26aba532283131d1a104Nate Begeman /// EmitJumpTableInfo - Print assembly representations of the jump tables 22837efe6764568a3829fee26aba532283131d1a104Nate Begeman /// used by the current function to the current output stream. 22937efe6764568a3829fee26aba532283131d1a104Nate Begeman /// 2301da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner void EmitJumpTableInfo(MachineJumpTableInfo *MJTI, MachineFunction &MF); 23137efe6764568a3829fee26aba532283131d1a104Nate Begeman 232ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitSpecialLLVMGlobal - Check to see if the specified global is a 233ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// special global used by LLVM. If so, emit it and return true, otherwise 234ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// do nothing and return false. 235ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 23687370b8301fa39ee54bdcaae0618fd565e808466Devang Patel 237f9e56198a39a08272c072211722b3c97ef88853cJim Laskey public: 238f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 239f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// LEB 128 number encoding. 240f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 241f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintULEB128 - Print a series of hexidecimal values(separated by commas) 242f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing an unsigned leb128 value. 243f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintULEB128(unsigned Value) const; 244f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 245f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintSLEB128 - Print a series of hexidecimal values(separated by commas) 246f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing a signed leb128 value. 247f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintSLEB128(int Value) const; 248f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 249f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 250f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // Emission and print routines 251f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // 252f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 253f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintHex - Print a value as a hexidecimal value. 254f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 255f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintHex(int Value) const; 256f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 257f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EOL - Print a newline character to asm stream. If a comment is present 258f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// then it will be printed first. Comments should not contain '\n'. 259bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey void EOL() const; 260f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EOL(const std::string &Comment) const; 26125995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson void EOL(const char* Comment) const; 262b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling void EOL(const char *Comment, unsigned Encoding) const; 263b5abecded7573de0747f9f529a52561741bed0a2Bill Wendling 264f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 265f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// unsigned leb128 value. 266f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitULEB128Bytes(unsigned Value) const; 267f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 268f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitSLEB128Bytes - print an assembler byte data directive to compose a 269f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// signed leb128 value. 270f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitSLEB128Bytes(int Value) const; 271f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 272f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt8 - Emit a byte directive and value. 273f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 274f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt8(int Value) const; 275f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 276f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt16 - Emit a short directive and value. 277f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 278f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt16(int Value) const; 279f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 280f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt32 - Emit a long directive and value. 281f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 282f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt32(int Value) const; 283f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 284f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt64 - Emit a long long directive and value. 285f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 286f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt64(uint64_t Value) const; 287f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 288f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitString - Emit a string with quotes and a null terminator. 289f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// Special characters are emitted properly. 290181b6c9cb5def44658d15848e34c5c45d973f065Reid Spencer /// @verbatim (Eg. '\t') @endverbatim 291f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitString(const std::string &String) const; 292f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling void EmitString(const char *String, unsigned Size) const; 293f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling 294189f80dc253664627253b2d2cb07d0714feb12baDan Gohman /// EmitFile - Emit a .file directive. 295189f80dc253664627253b2d2cb07d0714feb12baDan Gohman void EmitFile(unsigned Number, const std::string &Name) const; 296189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 297f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 298f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 2996fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitAlignment - Emit an alignment directive to the specified power of 300bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 301a1ab72daadbdc5b499ce7e7e97c4b80efad46736Chris Lattner /// byte alignment. If a global value is specified, and if that global has 3023a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// an explicit alignment requested, it will unconditionally override the 3033a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// alignment request. However, if ForcedAlignBits is specified, this value 3043a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// has final say: the ultimate alignment will be the max of ForcedAlignBits 30505548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// and the alignment computed with NumBits and the global. If UseFillExpr 30605548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// is true, it also emits an optional second value FillValue which the 30705548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// assembler uses to fill gaps to match alignment for text sections if the 30805548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// has specified a non-zero fill value. 3093a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 3103a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// The algorithm is: 3113a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = NumBits; 3123a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// if (GV && GV->hasalignment) Align = GV->getalignment(); 3133a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = std::max(Align, ForcedAlignBits); 3143a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 3153a4205367dc845d4cd804b47e061f8281777c9daChris Lattner void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0, 31605548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits = 0, 31705548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr = true) const; 318bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 3191b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// printLabel - This method prints a local label used by debug and 3201b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// exception handling tables. 3211b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(const MachineInstr *MI) const; 3221b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(unsigned Id) const; 3231b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 324a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// printDeclare - This method prints a local variable declaration used by 325a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// debug tables. 326a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng void printDeclare(const MachineInstr *MI) const; 327a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 328fe7b16fe6529a6890adf94ce3ccc463ea939992aDavid Greene /// EmitComments - Pretty-print comments for instructions 329fe7b16fe6529a6890adf94ce3ccc463ea939992aDavid Greene void EmitComments(const MachineInstr &MI) const; 330b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene /// EmitComments - Pretty-print comments for basic blocks 331b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene void EmitComments(const MachineBasicBlock &MBB) const; 332fe7b16fe6529a6890adf94ce3ccc463ea939992aDavid Greene 3337cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner /// GetMBBSymbol - Return the MCSymbol corresponding to the specified basic 3347cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner /// block label. 3357cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner MCSymbol *GetMBBSymbol(unsigned MBBID) const; 3367cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner 33770a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner /// EmitBasicBlockStart - This method prints the label for the specified 33870a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner /// MachineBasicBlock, an alignment (if present) and a comment describing 33970a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner /// it if appropriate. 340662316c997e4eb8c3fdec6999b3e9da03620847aChris Lattner void EmitBasicBlockStart(const MachineBasicBlock *MBB) const; 341f9e56198a39a08272c072211722b3c97ef88853cJim Laskey protected: 3426fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitZeros - Emit a block of zeros. 34330bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// 344c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitZeros(uint64_t NumZeros, unsigned AddrSpace = 0) const; 345c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 346c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// EmitString - Emit a zero-byte-terminated string constant. 347c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// 348c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen virtual void EmitString(const ConstantArray *CVA) const; 34930bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner 3506fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitConstantValueOnly - Print out the specified constant, without a 351a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 352a10f15949d6ca25eb67514cce69d42626efa6380Sanjiv Gupta void EmitConstantValueOnly(const Constant *CV); 35346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 3546fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitGlobalConstant - Print a general LLVM constant to the .s file. 355c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstant(const Constant* CV, unsigned AddrSpace = 0); 356d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 357d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 358cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis 359cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis /// processDebugLoc - Processes the debug information of each machine 360cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis /// instruction's DebugLoc. 361cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis void processDebugLoc(DebugLoc DL); 362ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 363e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// printInlineAsm - This method formats and prints the specified machine 364e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// instruction that is an inline asm. 365e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner void printInlineAsm(const MachineInstr *MI) const; 366da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 367da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// printImplicitDef - This method prints the specified machine instruction 368da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// that is an implicit def. 369da47e6e0d003c873da960361549e57ee4617c301Evan Cheng virtual void printImplicitDef(const MachineInstr *MI) const; 37037efe6764568a3829fee26aba532283131d1a104Nate Begeman 3717cb384dcca3f1ccfc993182ee4b972f7fffc8ffaChris Lattner 372cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// printPICJumpTableSetLabel - This method prints a set label for the 373cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// specified MachineBasicBlock for a jumptable entry. 374cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, 375cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 376cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 377cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 3789de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov virtual void printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 3799de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 3809de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const; 3819de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 382d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// printDataDirective - This method prints the asm directive for the 383d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// specified type. 384c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void printDataDirective(const Type *type, unsigned AddrSpace = 0); 385d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 386f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// printVisibility - This prints visibility information about symbol, if 387f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// this is suported by the target. 388f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov void printVisibility(const std::string& Name, unsigned Visibility) const; 389f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov 3907751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov /// printOffset - This is just convenient handler for printing offsets. 3917751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov void printOffset(int64_t Offset) const; 392014700c1a8cba203fd21ff129426ba8a426ab244David Greene 393ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner private: 394cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner void EmitLLVMUsedList(Constant *List); 395ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner void EmitXXStructorList(Constant *List); 396c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstantStruct(const ConstantStruct* CVS, 397c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace); 398d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta void EmitGlobalConstantArray(const ConstantArray* CVA, unsigned AddrSpace); 39900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantVector(const ConstantVector* CP); 400c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstantFP(const ConstantFP* CFP, unsigned AddrSpace); 401c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstantLargeInt(const ConstantInt* CI, unsigned AddrSpace); 4025eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); 403a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 404a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 405a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 406a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 407