AsmPrinter.h revision d3d965714b89c5d5aeb65fb5ce06e081f0b3c049
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" 20190f3ba2aa58dc2e73a5f90dff15015a1ffa226bChris Lattner#include "llvm/Support/DataTypes.h" 21c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen#include "llvm/ADT/DenseMap.h" 2215404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola#include <set> 23a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 24a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 255eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen class GCStrategy; 26a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Constant; 27c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen class ConstantArray; 2800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman class ConstantInt; 2900d448a341175556ebd86af68219f5b90b7145a3Dan Gohman class ConstantStruct; 3000d448a341175556ebd86af68219f5b90b7145a3Dan Gohman class ConstantVector; 31c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen class GCMetadataPrinter; 32ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner class GlobalVariable; 332d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng class MachineConstantPoolEntry; 34d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng class MachineConstantPoolValue; 35c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel class DwarfWriter; 36563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class Mangler; 37b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov class Section; 38563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class TargetAsmInfo; 3984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner class Type; 40cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson class raw_ostream; 41a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 42563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// AsmPrinter - This class is intended to be used as a driving class for all 43563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// asm writers. 44a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 451997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 46794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 47347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// FunctionNumber - This provides a unique ID for each function emitted in 48347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// this translation unit. It is autoincremented by SetupMachineFunction, 49347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// and can be accessed with getFunctionNumber() and 50347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber(). 51347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// 52347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng unsigned FunctionNumber; 53347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 54c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen // GCMetadataPrinters - The garbage collection metadata printer table. 555eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen typedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type; 56c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen typedef gcp_map_type::iterator gcp_iterator; 57c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen gcp_map_type GCMetadataPrinters; 58c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 5915404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola protected: 60cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling /// DW -This is needed because printDeclare() has to insert 61cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling /// DbgVariable entries into the dwarf table. This is a short term hack 62cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling /// that ought be fixed soon. 63cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling DwarfWriter *DW; 64cb819f13d785ff6efcacfbd7d0fa9f3f67e5494dBill Wendling 6515404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola // Necessary for external weak linkage support 6615404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola std::set<const GlobalValue*> ExtWeakSymbols; 6715404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 68c69d56f1154342a57c9bdd4c17a10333e3520127Bill Wendling /// Fast - Generating code via fast instruction selection. 69c69d56f1154342a57c9bdd4c17a10333e3520127Bill Wendling bool Fast; 70b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey public: 71a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 72a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 73cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &O; 74a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 75a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 76a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 77a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 78563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 79563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// Target Asm Printer information. 80563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// 81a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey const TargetAsmInfo *TAI; 82a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 83da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// Target Register Information. 84da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// 85da47e6e0d003c873da960361549e57ee4617c301Evan Cheng const TargetRegisterInfo *TRI; 86da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 8757f0db833dc30404f1f5d28b23df326e520698ecBill Wendling /// The current machine function. 8857f0db833dc30404f1f5d28b23df326e520698ecBill Wendling const MachineFunction *MF; 8957f0db833dc30404f1f5d28b23df326e520698ecBill Wendling 90a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 91a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 92a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 93a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 94a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 95a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 96a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 97a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 9897e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 9989d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// CurrentSection - The current section we are emitting to. This is 10089d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// controlled and used by the SwitchSection method. 10189d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey std::string CurrentSection; 102d7ca416d6c9ae1966e0df8193112e3c5f430a053Anton Korobeynikov const Section* CurrentSection_; 103fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 104fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng /// IsInTextSection - True if the current section we are emitting to is a 105fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng /// text section. 106fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool IsInTextSection; 10742bf74be1402df7409efbea089310d4c276fde37Evan Cheng 10842bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// VerboseAsm - Emit comments in assembly output if this is true. 10942bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 11042bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool VerboseAsm; 11142bf74be1402df7409efbea089310d4c276fde37Evan Cheng 112b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey protected: 113c69d56f1154342a57c9bdd4c17a10333e3520127Bill Wendling AsmPrinter(raw_ostream &o, TargetMachine &TM, 114c69d56f1154342a57c9bdd4c17a10333e3520127Bill Wendling const TargetAsmInfo *T, bool F, bool V); 115ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 116a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey public: 117c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen virtual ~AsmPrinter(); 11842bf74be1402df7409efbea089310d4c276fde37Evan Cheng 11942bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// isVerbose - Return true if assembly output should contain comments. 12042bf74be1402df7409efbea089310d4c276fde37Evan Cheng /// 12142bf74be1402df7409efbea089310d4c276fde37Evan Cheng bool isVerbose() const { return VerboseAsm; } 12242bf74be1402df7409efbea089310d4c276fde37Evan Cheng 123f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToTextSection - Switch to the specified section of the executable 124f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 125e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// explicitly requested section, we switch to the section indicated for the 126e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// global instead of NewSection. 127e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 128e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// If the new section is an empty string, this method forgets what the 129e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// current section is, but does not emit a .section directive. 130e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 131f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit executable code. 132f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 133b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToTextSection(const char *NewSection, const GlobalValue *GV = NULL); 134d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner 135f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToDataSection - Switch to the specified section of the executable 136f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 137f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// explicitly requested section, we switch to the section indicated for the 138f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// global instead of NewSection. 139f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 140f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// If the new section is an empty string, this method forgets what the 141f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// current section is, but does not emit a .section directive. 142f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 143f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit data. For most assemblers, this 144f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// is the same as the SwitchToTextSection method, but not all assemblers 145f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// are the same. 146f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 147b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToDataSection(const char *NewSection, const GlobalValue *GV = NULL); 148b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 149b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov /// SwitchToSection - Switch to the specified section of the executable if 150b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov /// we are not already in it! 151b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov void SwitchToSection(const Section* NS); 152b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 153a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// getGlobalLinkName - Returns the asm/link name of of the specified 154a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// global variable. Should be overridden by each target asm printer to 155a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// generate the appropriate value. 1567d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling virtual const std::string &getGlobalLinkName(const GlobalVariable *GV, 1577d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string &LinkName) const; 158a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 159bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// EmitExternalGlobal - Emit the external reference to a global variable. 160bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// Should be overridden if an indirect reference should be used. 161bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey virtual void EmitExternalGlobal(const GlobalVariable *GV); 162bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 1636e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// getCurrentFunctionEHName - Called to return (and cache) the 1646e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// CurrentFnEHName. 1656e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// 1667d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling const std::string &getCurrentFunctionEHName(const MachineFunction *MF, 1677d16e85bfc2c6423c81ce87a177bf3b1b1012a04Bill Wendling std::string &FuncEHName) const; 1686e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling 169a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey protected: 170ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// getAnalysisUsage - Record analysis usage. 171ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// 172ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen void getAnalysisUsage(AnalysisUsage &AU) const; 173ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 174a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 175a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 176a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 177a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 178a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 179a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 180a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 181a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 1823ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1833ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// PrintSpecial - Print information related to the specified machine instr 1843ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// that is independent of the operand, and may be independent of the instr 1853ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// itself. This can be useful for portably encoding the comment character 1863ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// or other bits of target-specific knowledge into the asmstrings. The 1873ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// syntax used is ${:comment}. Targets can override this to add support 1883ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// for their own strange codes. 1893e0cc2634e861b789850b5103efcc8898bf14c4cChris Lattner virtual void PrintSpecial(const MachineInstr *MI, const char *Code) const; 19047cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 19147cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 19247cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// instruction, using the specified assembler variant. Targets should 193b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// override this to format as appropriate. This method can return true if 19447cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// the operand is erroneous. 19547cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 196f483e58212d018f8b2ec760f59089e72defab5cfChris Lattner unsigned AsmVariant, const char *ExtraCode); 197b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 198b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// PrintAsmMemoryOperand - Print the specified operand of MI, an INLINEASM 199b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// instruction, using the specified assembler variant as an address. 200b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// Targets should override this to format as appropriate. This method can 201b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// return true if the operand is erroneous. 202b44b5094110508e2381615b15077b388364f7e8aChris Lattner virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 203b44b5094110508e2381615b15077b388364f7e8aChris Lattner unsigned AsmVariant, 204b44b5094110508e2381615b15077b388364f7e8aChris Lattner const char *ExtraCode); 205b44b5094110508e2381615b15077b388364f7e8aChris Lattner 2066fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// SetupMachineFunction - This should be called when a new MachineFunction 207a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 2086fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void SetupMachineFunction(MachineFunction &MF); 20997e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 210347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// getFunctionNumber - Return a unique ID for the current function. 211347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// 212347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng unsigned getFunctionNumber() const { return FunctionNumber; } 213347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 214347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber - Increase Function Number. AsmPrinters should 215347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// not normally call this, as the counter is automatically bumped by 216347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// SetupMachineFunction. 217347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng void IncrementFunctionNumber() { FunctionNumber++; } 218347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 219ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitConstantPool - Print to the current output stream assembly 220ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// representations of the constants in the constant pool MCP. This is 221ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// used to print out constants which have been "spilled to memory" by 222ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// the code generator. 223ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// 2242d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng void EmitConstantPool(MachineConstantPool *MCP); 225a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 22637efe6764568a3829fee26aba532283131d1a104Nate Begeman /// EmitJumpTableInfo - Print assembly representations of the jump tables 22737efe6764568a3829fee26aba532283131d1a104Nate Begeman /// used by the current function to the current output stream. 22837efe6764568a3829fee26aba532283131d1a104Nate Begeman /// 2291da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner void EmitJumpTableInfo(MachineJumpTableInfo *MJTI, MachineFunction &MF); 23037efe6764568a3829fee26aba532283131d1a104Nate Begeman 231ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitSpecialLLVMGlobal - Check to see if the specified global is a 232ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// special global used by LLVM. If so, emit it and return true, otherwise 233ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// do nothing and return false. 234ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 235a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 236f9e56198a39a08272c072211722b3c97ef88853cJim Laskey public: 237f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 238f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// LEB 128 number encoding. 239f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 240f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintULEB128 - Print a series of hexidecimal values(separated by commas) 241f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing an unsigned leb128 value. 242f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintULEB128(unsigned Value) const; 243f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 244f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintSLEB128 - Print a series of hexidecimal values(separated by commas) 245f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing a signed leb128 value. 246f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintSLEB128(int Value) const; 247f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 248f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 249f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // Emission and print routines 250f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // 251f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 252f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintHex - Print a value as a hexidecimal value. 253f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 254f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintHex(int Value) const; 255f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 256f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EOL - Print a newline character to asm stream. If a comment is present 257f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// then it will be printed first. Comments should not contain '\n'. 258bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey void EOL() const; 259f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EOL(const std::string &Comment) const; 26025995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson void EOL(const char* Comment) const; 261f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 262f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 263f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// unsigned leb128 value. 264f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitULEB128Bytes(unsigned Value) const; 265f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 266f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitSLEB128Bytes - print an assembler byte data directive to compose a 267f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// signed leb128 value. 268f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitSLEB128Bytes(int Value) const; 269f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 270f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt8 - Emit a byte directive and value. 271f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 272f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt8(int Value) const; 273f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 274f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt16 - Emit a short directive and value. 275f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 276f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt16(int Value) const; 277f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 278f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt32 - Emit a long directive and value. 279f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 280f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt32(int Value) const; 281f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 282f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt64 - Emit a long long directive and value. 283f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 284f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt64(uint64_t Value) const; 285f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 286f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitString - Emit a string with quotes and a null terminator. 287f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// Special characters are emitted properly. 288181b6c9cb5def44658d15848e34c5c45d973f065Reid Spencer /// @verbatim (Eg. '\t') @endverbatim 289f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitString(const std::string &String) const; 290f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling void EmitString(const char *String, unsigned Size) const; 291f34be827ac3bb257939e31575fcfc9ef27b94306Bill Wendling 292189f80dc253664627253b2d2cb07d0714feb12baDan Gohman /// EmitFile - Emit a .file directive. 293189f80dc253664627253b2d2cb07d0714feb12baDan Gohman void EmitFile(unsigned Number, const std::string &Name) const; 294189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 295f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 296f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 2976fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitAlignment - Emit an alignment directive to the specified power of 298bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 299a1ab72daadbdc5b499ce7e7e97c4b80efad46736Chris Lattner /// byte alignment. If a global value is specified, and if that global has 3003a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// an explicit alignment requested, it will unconditionally override the 3013a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// alignment request. However, if ForcedAlignBits is specified, this value 3023a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// has final say: the ultimate alignment will be the max of ForcedAlignBits 30305548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// and the alignment computed with NumBits and the global. If UseFillExpr 30405548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// is true, it also emits an optional second value FillValue which the 30505548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// assembler uses to fill gaps to match alignment for text sections if the 30605548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// has specified a non-zero fill value. 3073a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 3083a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// The algorithm is: 3093a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = NumBits; 3103a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// if (GV && GV->hasalignment) Align = GV->getalignment(); 3113a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = std::max(Align, ForcedAlignBits); 3123a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 3133a4205367dc845d4cd804b47e061f8281777c9daChris Lattner void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0, 31405548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits = 0, 31505548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr = true) const; 316bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 3171b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// printLabel - This method prints a local label used by debug and 3181b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// exception handling tables. 3191b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(const MachineInstr *MI) const; 3201b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(unsigned Id) const; 3211b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 322a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// printDeclare - This method prints a local variable declaration used by 323a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// debug tables. 324a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng void printDeclare(const MachineInstr *MI) const; 325a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 326f9e56198a39a08272c072211722b3c97ef88853cJim Laskey protected: 3276fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitZeros - Emit a block of zeros. 32830bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// 329c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitZeros(uint64_t NumZeros, unsigned AddrSpace = 0) const; 330c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 331c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// EmitString - Emit a zero-byte-terminated string constant. 332c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// 333c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen virtual void EmitString(const ConstantArray *CVA) const; 33430bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner 3356fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitConstantValueOnly - Print out the specified constant, without a 336a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 337a10f15949d6ca25eb67514cce69d42626efa6380Sanjiv Gupta void EmitConstantValueOnly(const Constant *CV); 33846d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 3396fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitGlobalConstant - Print a general LLVM constant to the .s file. 340c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstant(const Constant* CV, unsigned AddrSpace = 0); 341d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 342d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 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. 350da47e6e0d003c873da960361549e57ee4617c301Evan Cheng virtual void printImplicitDef(const MachineInstr *MI) const; 35137efe6764568a3829fee26aba532283131d1a104Nate Begeman 35237efe6764568a3829fee26aba532283131d1a104Nate Begeman /// printBasicBlockLabel - This method prints the label for the specified 35337efe6764568a3829fee26aba532283131d1a104Nate Begeman /// MachineBasicBlock 354cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman virtual void printBasicBlockLabel(const MachineBasicBlock *MBB, 355fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool printAlign = false, 356cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printColon = false, 357cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printComment = true) const; 35852a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 359cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// printPICJumpTableSetLabel - This method prints a set label for the 360cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// specified MachineBasicBlock for a jumptable entry. 361cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, 362cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 363cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 364cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 3659de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov virtual void printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 3669de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 3679de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const; 3689de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 369d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// printDataDirective - This method prints the asm directive for the 370d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// specified type. 371c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void printDataDirective(const Type *type, unsigned AddrSpace = 0); 372d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 373c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// printSuffixedName - This prints a name with preceding 374c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// getPrivateGlobalPrefix and the specified suffix, handling quoted names 375c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// correctly. 376ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng void printSuffixedName(const char *Name, const char *Suffix, 377ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng const char *Prefix = 0); 378ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng void printSuffixedName(const std::string &Name, const char* Suffix); 379c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen 380f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// printVisibility - This prints visibility information about symbol, if 381f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// this is suported by the target. 382f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov void printVisibility(const std::string& Name, unsigned Visibility) const; 383f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov 3847751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov /// printOffset - This is just convenient handler for printing offsets. 3857751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov void printOffset(int64_t Offset) const; 3867751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov 387ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner private: 38861e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen const GlobalValue *findGlobalValue(const Constant* CV); 389cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner void EmitLLVMUsedList(Constant *List); 390ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner void EmitXXStructorList(Constant *List); 391c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstantStruct(const ConstantStruct* CVS, 392c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta unsigned AddrSpace); 393d3d965714b89c5d5aeb65fb5ce06e081f0b3c049Sanjiv Gupta void EmitGlobalConstantArray(const ConstantArray* CVA, unsigned AddrSpace); 39400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantVector(const ConstantVector* CP); 395c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstantFP(const ConstantFP* CFP, unsigned AddrSpace); 396c8d7bc850ddf5a5df503a173b0bc0f8c03ffec96Sanjiv Gupta void EmitGlobalConstantLargeInt(const ConstantInt* CI, unsigned AddrSpace); 3975eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); 398a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 399a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 400a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 401a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 402