AsmPrinter.h revision b11caedd6f36afc6518cf0ea9bbff6500fd77334
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" 22a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 23a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 248c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman class BlockAddress; 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; 50c99fd879c0f4bbc56c29d508fec7935e6cbd7ed0Devang Patel class MDNode; 51c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel class DwarfWriter; 52563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class Mangler; 53af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner class MCAsmInfo; 54f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner class TargetLoweringObjectFile; 551efd4fd56b3bc21b85ab921c6f77807afc02ecb5Benjamin Kramer class Twine; 5684bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner class Type; 5771847813bc419f7a0667468136a07429c6d9f164David Greene class formatted_raw_ostream; 58a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 59563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// AsmPrinter - This class is intended to be used as a driving class for all 60563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// asm writers. 61a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 621997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 63794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 64c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen // GCMetadataPrinters - The garbage collection metadata printer table. 655eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen typedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type; 66c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen typedef gcp_map_type::iterator gcp_iterator; 67c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen gcp_map_type GCMetadataPrinters; 6867e59834fc1dca7e357c40af2e5144f3d62f5133David Greene 692d320867494351031216d76c5b3e6a2789461881Chris Lattner /// If VerboseAsm is set, a pointer to the loop info for this 70b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene /// function. 71b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene /// 72b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene MachineLoopInfo *LI; 73b71d1b2fe2c0673005283b48be2f37c750ce367bDavid Greene 74dc62ea0f1c6eb0673f39c543f1936ce125efdb30Chris Lattner public: 750de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner /// MMI - If available, this is a pointer to the current MachineModuleInfo. 760de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner MachineModuleInfo *MMI; 770de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner 78dc62ea0f1c6eb0673f39c543f1936ce125efdb30Chris Lattner protected: 790de1fc4f416b3e94749ca84cdaede55b040a8b60Chris Lattner /// DW - If available, this is a pointer to the current dwarf writer. 80cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling DwarfWriter *DW; 81014700c1a8cba203fd21ff129426ba8a426ab244David Greene 82b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey public: 83e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene /// Flags to specify different kinds of comments to output in 84e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene /// assembly code. These flags carry semantic information not 85e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene /// otherwise easily derivable from the IR text. 86e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene /// 87e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene enum CommentFlag { 88e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene ReloadReuse = 0x1 89e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene }; 90e55abe5cd0fbc1977a661251214ef01df6ec0b34David Greene 91a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 92a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 9371847813bc419f7a0667468136a07429c6d9f164David Greene formatted_raw_ostream &O; 94a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 95a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 96a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 97a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 98563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 99f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner /// getObjFileLowering - Return information about object file lowering. 10038c398808cff7defdf013fa750dfac8e66302975Chris Lattner TargetLoweringObjectFile &getObjFileLowering() const; 101f0144127b98425d214e59e4a1a4b342b78e3642bChris Lattner 102563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// Target Asm Printer information. 103563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// 10433adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattner const MCAsmInfo *MAI; 105a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 106da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// Target Register Information. 107da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// 108da47e6e0d003c873da960361549e57ee4617c301Evan Cheng const TargetRegisterInfo *TRI; 109da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 1102b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// OutContext - This is the context for the output file that we are 1112b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// streaming. This owns all of the global MC-related objects for the 1122b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// generated translation unit. 1132b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner MCContext &OutContext; 1142b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 1152b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// OutStreamer - This is the MCStreamer object for the file we are 1162b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// generating. This contains the transient state for the current 1172b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// translation unit that we are generating (such as the current section 1182b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner /// etc). 1192b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner MCStreamer &OutStreamer; 1202b2954f00ba02ca1a902f47080cd9f06aebc0378Chris Lattner 12157f0db833dc30404f1f5d28b23df326e520698ecBill Wendling /// The current machine function. 12257f0db833dc30404f1f5d28b23df326e520698ecBill Wendling const MachineFunction *MF; 12357f0db833dc30404f1f5d28b23df326e520698ecBill Wendling 124a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 125a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 126a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 127a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 128412c3a5bc9e70fe8579551216786e70d323a3dd5Chris Lattner /// The symbol for the current function. This is recalculated at the 129a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 130a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 1315957c84e09b177aecf8b430c33fd75a36575fb57Chris Lattner MCSymbol *CurrentFnSym; 13297e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 133290c2f56ce551ebcf4480ac2944986fe4bb339e9Chris Lattner /// getCurrentSection() - Return the current section we are emitting to. 134dabf07c70a5e13a4560d75667fa5c7db28921a92Chris Lattner const MCSection *getCurrentSection() const; 135290c2f56ce551ebcf4480ac2944986fe4bb339e9Chris Lattner 13642bf74be1402df7409efbea089310d4c276fde37Evan Cheng 13742bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// VerboseAsm - Emit comments in assembly output if this is true. 13842bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 13942bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool VerboseAsm; 14042bf74be1402df7409efbea089310d4c276fde37Evan Cheng 141bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson /// Private state for PrintSpecial() 142bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson // Assign a unique ID to this machine instruction. 143bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson mutable const MachineInstr *LastMI; 144bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson mutable const Function *LastFn; 145bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson mutable unsigned Counter; 146a8dbf36f3f88917b101d7ab9d253ba2fe6e396b4Owen Anderson 147af0e2726835e096e32c30c1b88cc7a6232a6ef69Devang Patel // Private state for processDebugLoc() 148c99fd879c0f4bbc56c29d508fec7935e6cbd7ed0Devang Patel mutable const MDNode *PrevDLT; 149bd58edf59128d2acb5ae48c76ef8a108fd587db2Owen Anderson 150b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey protected: 15171847813bc419f7a0667468136a07429c6d9f164David Greene explicit AsmPrinter(formatted_raw_ostream &o, TargetMachine &TM, 152af76e592c7f9deff0e55c13dbb4a34f07f1c7f64Chris Lattner const MCAsmInfo *T, bool V); 153ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 154a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey public: 155c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen virtual ~AsmPrinter(); 15642bf74be1402df7409efbea089310d4c276fde37Evan Cheng 15742bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// isVerbose - Return true if assembly output should contain comments. 15842bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 15942bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool isVerbose() const { return VerboseAsm; } 16042bf74be1402df7409efbea089310d4c276fde37Evan Cheng 1613fb2b1ede30193b59a651328a946174196b20610Jim Grosbach /// getFunctionNumber - Return a unique ID for the current function. 1623fb2b1ede30193b59a651328a946174196b20610Jim Grosbach /// 163b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner unsigned getFunctionNumber() const; 1643fb2b1ede30193b59a651328a946174196b20610Jim Grosbach 165a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey protected: 166ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// getAnalysisUsage - Record analysis usage. 167ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// 168ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen void getAnalysisUsage(AnalysisUsage &AU) const; 169ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 170a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 171a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 172a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 173a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 174a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 175812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson /// EmitStartOfAsmFile - This virtual method can be overridden by targets 176812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson /// that want to emit something at the start of their file. 1774c269e2feb230d4380c0b3cd72da517bd2222023Eric Christopher virtual void EmitStartOfAsmFile(Module &) {} 178812209a58c5520c604bc9279aa069e5ae066e860Bob Wilson 179bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner /// EmitEndOfAsmFile - This virtual method can be overridden by targets that 180bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner /// want to emit something at the end of their file. 1814c269e2feb230d4380c0b3cd72da517bd2222023Eric Christopher virtual void EmitEndOfAsmFile(Module &) {} 182bd23d5fda85e38c88dfa668a99777cd05c524822Chris Lattner 183a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 184a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 185a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 1863ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1873ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// PrintSpecial - Print information related to the specified machine instr 1883ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// that is independent of the operand, and may be independent of the instr 1893ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// itself. This can be useful for portably encoding the comment character 1903ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// or other bits of target-specific knowledge into the asmstrings. The 1913ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// syntax used is ${:comment}. Targets can override this to add support 1923ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// for their own strange codes. 1933e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner virtual void PrintSpecial(const MachineInstr *MI, const char *Code) const; 19447cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 19547cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 19647cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// instruction, using the specified assembler variant. Targets should 197b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// override this to format as appropriate. This method can return true if 19847cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// the operand is erroneous. 19947cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 200f483e58212d018f8b2ec760f59089e72defab5cfChris Lattner unsigned AsmVariant, const char *ExtraCode); 201b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 202b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// PrintAsmMemoryOperand - Print the specified operand of MI, an INLINEASM 203b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// instruction, using the specified assembler variant as an address. 204b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// Targets should override this to format as appropriate. This method can 205b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// return true if the operand is erroneous. 206b44b5094110508e2381615b15077b388364f7e8aChris Lattner virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 207b44b5094110508e2381615b15077b388364f7e8aChris Lattner unsigned AsmVariant, 208b44b5094110508e2381615b15077b388364f7e8aChris Lattner const char *ExtraCode); 209b44b5094110508e2381615b15077b388364f7e8aChris Lattner 2106fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// SetupMachineFunction - This should be called when a new MachineFunction 211a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 2126fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void SetupMachineFunction(MachineFunction &MF); 21397e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 214b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner /// EmitFunctionHeader - This method emits the header for the current 215b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner /// function. 216b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner void EmitFunctionHeader(); 217b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner 218ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitConstantPool - Print to the current output stream assembly 219ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// representations of the constants in the constant pool MCP. This is 220ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// used to print out constants which have been "spilled to memory" by 221ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// the code generator. 222ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// 223b11caedd6f36afc6518cf0ea9bbff6500fd77334Chris Lattner void EmitConstantPool(const MachineConstantPool *MCP); 224a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 22537efe6764568a3829fee26aba532283131d1a104Nate Begeman /// EmitJumpTableInfo - Print assembly representations of the jump tables 22637efe6764568a3829fee26aba532283131d1a104Nate Begeman /// used by the current function to the current output stream. 22737efe6764568a3829fee26aba532283131d1a104Nate Begeman /// 22844e87255e9b7a9d8ecb558690db1181882c08045Chris Lattner void EmitJumpTableInfo(MachineFunction &MF); 22937efe6764568a3829fee26aba532283131d1a104Nate Begeman 23048d64ba9d846229339b2431b298620cb8a01ffc5Chris Lattner /// EmitGlobalVariable - Emit the specified global variable to the .s file. 23174bfe21b50c14c15f55ce3bd5857d65b588fae3cChris Lattner virtual void EmitGlobalVariable(const GlobalVariable *GV); 23248d64ba9d846229339b2431b298620cb8a01ffc5Chris Lattner 233ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitSpecialLLVMGlobal - Check to see if the specified global is a 234ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// special global used by LLVM. If so, emit it and return true, otherwise 235ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// do nothing and return false. 236ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 23787370b8301fa39ee54bdcaae0618fd565e808466Devang Patel 238f9e56198a39a08272c072211722b3c97ef88853cJim Laskey public: 239f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 240f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // Emission and print routines 241f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // 242f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 243f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt8 - Emit a byte directive and value. 244f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 245f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt8(int Value) const; 246f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 247f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt16 - Emit a short directive and value. 248f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 249f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt16(int Value) const; 250f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 251f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt32 - Emit a long directive and value. 252f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 253f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt32(int Value) const; 254f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 255f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt64 - Emit a long long directive and value. 256f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 257f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt64(uint64_t Value) const; 258f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 259f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 260f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 2616fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitAlignment - Emit an alignment directive to the specified power of 262bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 263a1ab72daadbdc5b499ce7e7e97c4b80efad46736Chris Lattner /// byte alignment. If a global value is specified, and if that global has 2643a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// an explicit alignment requested, it will unconditionally override the 2653a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// alignment request. However, if ForcedAlignBits is specified, this value 2663a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// has final say: the ultimate alignment will be the max of ForcedAlignBits 26705548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// and the alignment computed with NumBits and the global. If UseFillExpr 26805548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// is true, it also emits an optional second value FillValue which the 26905548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// assembler uses to fill gaps to match alignment for text sections if the 27005548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// has specified a non-zero fill value. 2713a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2723a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// The algorithm is: 2733a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = NumBits; 2743a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// if (GV && GV->hasalignment) Align = GV->getalignment(); 2753a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = std::max(Align, ForcedAlignBits); 2763a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2773a4205367dc845d4cd804b47e061f8281777c9daChris Lattner void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0, 27805548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits = 0, 27905548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr = true) const; 280bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 2811b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// printLabel - This method prints a local label used by debug and 2821b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// exception handling tables. 2831b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(const MachineInstr *MI) const; 2841b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(unsigned Id) const; 2851b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 286a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// printDeclare - This method prints a local variable declaration used by 287a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// debug tables. 288a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng void printDeclare(const MachineInstr *MI) const; 289a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 290fe7b16fe6529a6890adf94ce3ccc463ea939992aDavid Greene /// EmitComments - Pretty-print comments for instructions 291fe7b16fe6529a6890adf94ce3ccc463ea939992aDavid Greene void EmitComments(const MachineInstr &MI) const; 292fe7b16fe6529a6890adf94ce3ccc463ea939992aDavid Greene 2936b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner /// GetGlobalValueSymbol - Return the MCSymbol for the specified global 2946b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner /// value. 2956b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner MCSymbol *GetGlobalValueSymbol(const GlobalValue *GV) const; 2966b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner 2977a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner /// GetSymbolWithGlobalValueBase - Return the MCSymbol for a symbol with 298d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner /// global value name as its base, with the specified suffix, and where the 2997a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner /// symbol is forced to have private linkage if ForcePrivate is true. 3007a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner MCSymbol *GetSymbolWithGlobalValueBase(const GlobalValue *GV, 3017a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner StringRef Suffix, 3027a2ba94d03b43f41b54872dacd7b2250dde4c7bdChris Lattner bool ForcePrivate = true) const; 303d588b97cc9acf778282ab10efa4f298cead1215aChris Lattner 3046b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner /// GetExternalSymbolSymbol - Return the MCSymbol for the specified 3056b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner /// ExternalSymbol. 3066b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner MCSymbol *GetExternalSymbolSymbol(StringRef Sym) const; 3076b04edee11c2bb35a48b1c42f867b4ba8cdfff97Chris Lattner 3083924868a957d5a6d468b61741cbb7db77324d1f6Chris Lattner /// GetCPISymbol - Return the symbol for the specified constant pool entry. 3093924868a957d5a6d468b61741cbb7db77324d1f6Chris Lattner MCSymbol *GetCPISymbol(unsigned CPID) const; 3103924868a957d5a6d468b61741cbb7db77324d1f6Chris Lattner 3113924868a957d5a6d468b61741cbb7db77324d1f6Chris Lattner /// GetJTISymbol - Return the symbol for the specified jump table entry. 3123924868a957d5a6d468b61741cbb7db77324d1f6Chris Lattner MCSymbol *GetJTISymbol(unsigned JTID, bool isLinkerPrivate = false) const; 3133924868a957d5a6d468b61741cbb7db77324d1f6Chris Lattner 314798d1256595dcc0f5d4423572f856d239f7de0e6Chris Lattner /// GetJTSetSymbol - Return the symbol for the specified jump table .set 315798d1256595dcc0f5d4423572f856d239f7de0e6Chris Lattner /// FIXME: privatize to AsmPrinter. 316798d1256595dcc0f5d4423572f856d239f7de0e6Chris Lattner MCSymbol *GetJTSetSymbol(unsigned UID, unsigned MBBID) const; 317798d1256595dcc0f5d4423572f856d239f7de0e6Chris Lattner 3188c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman /// GetBlockAddressSymbol - Return the MCSymbol used to satisfy BlockAddress 3198c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman /// uses of the specified basic block. 32029cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman MCSymbol *GetBlockAddressSymbol(const BlockAddress *BA, 32129cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman const char *Suffix = "") const; 3228c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman MCSymbol *GetBlockAddressSymbol(const Function *F, 32329cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman const BasicBlock *BB, 32429cbade25aa094ca9a149a96a8614cf6f3247480Dan Gohman const char *Suffix = "") const; 3258c2b52552c90f39e4b2fed43e309e599e742b6acDan Gohman 32670a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner /// EmitBasicBlockStart - This method prints the label for the specified 32770a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner /// MachineBasicBlock, an alignment (if present) and a comment describing 32870a54c07a0807bf89d1a8b4414e53298c376eb61Chris Lattner /// it if appropriate. 329662316c997e4eb8c3fdec6999b3e9da03620847aChris Lattner void EmitBasicBlockStart(const MachineBasicBlock *MBB) const; 33091093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner 33191093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner 33291093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner // Data emission. 33391093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner 33491093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner /// EmitGlobalConstant - Print a general LLVM constant to the .s file. 33591093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner void EmitGlobalConstant(const Constant* CV, unsigned AddrSpace = 0); 33691093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner 33791093ecf0fed6f007e08f1a4531cdb6f438672a2Chris Lattner protected: 338d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 339cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis 340cd76240f3d0f6c5f8c80e4762a8fe3a4de22e059Argyrios Kyrtzidis /// processDebugLoc - Processes the debug information of each machine 341af0e2726835e096e32c30c1b88cc7a6232a6ef69Devang Patel /// instruction's DebugLoc. 342af0e2726835e096e32c30c1b88cc7a6232a6ef69Devang Patel void processDebugLoc(const MachineInstr *MI, bool BeforePrintingInsn); 343ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 344e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// printInlineAsm - This method formats and prints the specified machine 345e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// instruction that is an inline asm. 346e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner void printInlineAsm(const MachineInstr *MI) const; 347da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 348da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// printImplicitDef - This method prints the specified machine instruction 349da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// that is an implicit def. 350b38a308616508e96f18f3bbd7914c8ed859a3b38Dan Gohman void printImplicitDef(const MachineInstr *MI) const; 351ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen 352ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen /// printKill - This method prints the specified kill machine instruction. 353b38a308616508e96f18f3bbd7914c8ed859a3b38Dan Gohman void printKill(const MachineInstr *MI) const; 354ad68264f590f05db3731a452fc91dc22bc75167dJakob Stoklund Olesen 355f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// printVisibility - This prints visibility information about symbol, if 356f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// this is suported by the target. 357152a29bfa6fa505182658d046bc75626e10d67c3Chris Lattner void printVisibility(MCSymbol *Sym, unsigned Visibility) const; 35853d4d78d9a2c26a67ac8f6e81cc149702103fc2cChris Lattner 3597751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov /// printOffset - This is just convenient handler for printing offsets. 3607751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov void printOffset(int64_t Offset) const; 361014700c1a8cba203fd21ff129426ba8a426ab244David Greene 362ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner private: 3636bf1def1598f9c7a699ce4874e7d2575212b4232Chris Lattner void EmitJumpTableEntry(const MachineJumpTableInfo *MJTI, 3646bf1def1598f9c7a699ce4874e7d2575212b4232Chris Lattner const MachineBasicBlock *MBB, 3656bf1def1598f9c7a699ce4874e7d2575212b4232Chris Lattner unsigned uid) const; 366cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner void EmitLLVMUsedList(Constant *List); 367ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner void EmitXXStructorList(Constant *List); 3685eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); 369a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 370a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 371a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 372a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 373