AsmPrinter.h revision 7751ad92daeea5a3502fbc266ae814baec5c03e6
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; 28c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen class GCMetadataPrinter; 29ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner class GlobalVariable; 308b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov class GlobalAlias; 312d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng class MachineConstantPoolEntry; 32d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng class MachineConstantPoolValue; 3306816127fd35d4942a092479e9f30279eb050b0bEvan Cheng class MachineModuleInfo; 34563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class Mangler; 35b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov class Section; 36563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class TargetAsmInfo; 3784bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner class Type; 38cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson class raw_ostream; 39a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 40563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// AsmPrinter - This class is intended to be used as a driving class for all 41563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// asm writers. 42a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 431997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 44794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 45347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// FunctionNumber - This provides a unique ID for each function emitted in 46347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// this translation unit. It is autoincremented by SetupMachineFunction, 47347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// and can be accessed with getFunctionNumber() and 48347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber(). 49347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// 50347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng unsigned FunctionNumber; 51347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 5206816127fd35d4942a092479e9f30279eb050b0bEvan Cheng /// MachineModuleInfo - This is needed because printDeclare() has to insert 5306816127fd35d4942a092479e9f30279eb050b0bEvan Cheng /// DebugVariable entries into the dwarf table. This is a short term hack 5406816127fd35d4942a092479e9f30279eb050b0bEvan Cheng /// that ought be fixed soon. 5506816127fd35d4942a092479e9f30279eb050b0bEvan Cheng MachineModuleInfo *MMI; 56c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 57c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen // GCMetadataPrinters - The garbage collection metadata printer table. 585eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen typedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type; 59c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen typedef gcp_map_type::iterator gcp_iterator; 60c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen gcp_map_type GCMetadataPrinters; 61c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 6215404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola protected: 6315404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola // Necessary for external weak linkage support 6415404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola std::set<const GlobalValue*> ExtWeakSymbols; 6515404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 66b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey public: 67a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 68a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 69cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &O; 70a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 71a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 72a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 73a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 74563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 75563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// Target Asm Printer information. 76563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// 77a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey const TargetAsmInfo *TAI; 78a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 79da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// Target Register Information. 80da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// 81da47e6e0d003c873da960361549e57ee4617c301Evan Cheng const TargetRegisterInfo *TRI; 82da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 83a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 84a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 85a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 86a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 87a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 88a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 89a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 90a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 9197e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 9289d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// CurrentSection - The current section we are emitting to. This is 9389d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// controlled and used by the SwitchSection method. 9489d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey std::string CurrentSection; 95d7ca416d6c9ae1966e0df8193112e3c5f430a053Anton Korobeynikov const Section* CurrentSection_; 96fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 97fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng /// IsInTextSection - True if the current section we are emitting to is a 98fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng /// text section. 99fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool IsInTextSection; 100b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 101b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey protected: 102cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson AsmPrinter(raw_ostream &o, TargetMachine &TM, const TargetAsmInfo *T); 103ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 104a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey public: 105c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen virtual ~AsmPrinter(); 106c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 107f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToTextSection - Switch to the specified section of the executable 108f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 109e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// explicitly requested section, we switch to the section indicated for the 110e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// global instead of NewSection. 111e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 112e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// If the new section is an empty string, this method forgets what the 113e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// current section is, but does not emit a .section directive. 114e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 115f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit executable code. 116f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 117b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToTextSection(const char *NewSection, const GlobalValue *GV = NULL); 118d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner 119f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToDataSection - Switch to the specified section of the executable 120f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 121f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// explicitly requested section, we switch to the section indicated for the 122f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// global instead of NewSection. 123f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 124f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// If the new section is an empty string, this method forgets what the 125f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// current section is, but does not emit a .section directive. 126f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 127f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit data. For most assemblers, this 128f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// is the same as the SwitchToTextSection method, but not all assemblers 129f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// are the same. 130f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 131b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToDataSection(const char *NewSection, const GlobalValue *GV = NULL); 132b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 133b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov /// SwitchToSection - Switch to the specified section of the executable if 134b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov /// we are not already in it! 135b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov void SwitchToSection(const Section* NS); 136b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 137a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// getGlobalLinkName - Returns the asm/link name of of the specified 138a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// global variable. Should be overridden by each target asm printer to 139a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// generate the appropriate value. 14099e41eed6d8b89b2ba4807625d13d08d85ea493dJim Laskey virtual const std::string getGlobalLinkName(const GlobalVariable *GV) const; 141a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 142bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// EmitExternalGlobal - Emit the external reference to a global variable. 143bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// Should be overridden if an indirect reference should be used. 144bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey virtual void EmitExternalGlobal(const GlobalVariable *GV); 145bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 1466e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// getCurrentFunctionEHName - Called to return (and cache) the 1476e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// CurrentFnEHName. 1486e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// 149ce613280f987584df15ada06c5cf4809b203da46Bill Wendling std::string getCurrentFunctionEHName(const MachineFunction *MF); 1506e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling 151a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey protected: 152ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// getAnalysisUsage - Record analysis usage. 153ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// 154ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen void getAnalysisUsage(AnalysisUsage &AU) const; 155ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 156a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 157a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 158a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 159a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 160a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 161a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 162a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 163a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 1643ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1653ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// PrintSpecial - Print information related to the specified machine instr 1663ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// that is independent of the operand, and may be independent of the instr 1673ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// itself. This can be useful for portably encoding the comment character 1683ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// or other bits of target-specific knowledge into the asmstrings. The 1693ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// syntax used is ${:comment}. Targets can override this to add support 1703ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// for their own strange codes. 1713ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner virtual void PrintSpecial(const MachineInstr *MI, const char *Code); 17247cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 17347cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 17447cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// instruction, using the specified assembler variant. Targets should 175b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// override this to format as appropriate. This method can return true if 17647cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// the operand is erroneous. 17747cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 178f483e58212d018f8b2ec760f59089e72defab5cfChris Lattner unsigned AsmVariant, const char *ExtraCode); 179b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 180b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// PrintAsmMemoryOperand - Print the specified operand of MI, an INLINEASM 181b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// instruction, using the specified assembler variant as an address. 182b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// Targets should override this to format as appropriate. This method can 183b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// return true if the operand is erroneous. 184b44b5094110508e2381615b15077b388364f7e8aChris Lattner virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 185b44b5094110508e2381615b15077b388364f7e8aChris Lattner unsigned AsmVariant, 186b44b5094110508e2381615b15077b388364f7e8aChris Lattner const char *ExtraCode); 187b44b5094110508e2381615b15077b388364f7e8aChris Lattner 1886fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// SetupMachineFunction - This should be called when a new MachineFunction 189a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 1906fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void SetupMachineFunction(MachineFunction &MF); 19197e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 192347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// getFunctionNumber - Return a unique ID for the current function. 193347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// 194347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng unsigned getFunctionNumber() const { return FunctionNumber; } 195347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 196347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber - Increase Function Number. AsmPrinters should 197347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// not normally call this, as the counter is automatically bumped by 198347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// SetupMachineFunction. 199347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng void IncrementFunctionNumber() { FunctionNumber++; } 200347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 201ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitConstantPool - Print to the current output stream assembly 202ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// representations of the constants in the constant pool MCP. This is 203ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// used to print out constants which have been "spilled to memory" by 204ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// the code generator. 205ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// 2062d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng void EmitConstantPool(MachineConstantPool *MCP); 207a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 20837efe6764568a3829fee26aba532283131d1a104Nate Begeman /// EmitJumpTableInfo - Print assembly representations of the jump tables 20937efe6764568a3829fee26aba532283131d1a104Nate Begeman /// used by the current function to the current output stream. 21037efe6764568a3829fee26aba532283131d1a104Nate Begeman /// 2111da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner void EmitJumpTableInfo(MachineJumpTableInfo *MJTI, MachineFunction &MF); 21237efe6764568a3829fee26aba532283131d1a104Nate Begeman 213ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitSpecialLLVMGlobal - Check to see if the specified global is a 214ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// special global used by LLVM. If so, emit it and return true, otherwise 215ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// do nothing and return false. 216ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 217a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 218f9e56198a39a08272c072211722b3c97ef88853cJim Laskey public: 219f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 220f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// LEB 128 number encoding. 221f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 222f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintULEB128 - Print a series of hexidecimal values(separated by commas) 223f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing an unsigned leb128 value. 224f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintULEB128(unsigned Value) const; 225f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 226f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintSLEB128 - Print a series of hexidecimal values(separated by commas) 227f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing a signed leb128 value. 228f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintSLEB128(int Value) const; 229f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 230f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 231f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // Emission and print routines 232f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // 233f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 234f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintHex - Print a value as a hexidecimal value. 235f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 236f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintHex(int Value) const; 237f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 238f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EOL - Print a newline character to asm stream. If a comment is present 239f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// then it will be printed first. Comments should not contain '\n'. 240bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey void EOL() const; 241f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EOL(const std::string &Comment) const; 24225995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson void EOL(const char* Comment) const; 243f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 244f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 245f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// unsigned leb128 value. 246f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitULEB128Bytes(unsigned Value) const; 247f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 248f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitSLEB128Bytes - print an assembler byte data directive to compose a 249f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// signed leb128 value. 250f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitSLEB128Bytes(int Value) const; 251f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 252f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt8 - Emit a byte directive and value. 253f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 254f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt8(int Value) const; 255f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 256f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt16 - Emit a short directive and value. 257f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 258f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt16(int Value) const; 259f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 260f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt32 - Emit a long directive and value. 261f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 262f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt32(int Value) const; 263f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 264f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt64 - Emit a long long directive and value. 265f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 266f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt64(uint64_t Value) const; 267f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 268f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitString - Emit a string with quotes and a null terminator. 269f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// Special characters are emitted properly. 270181b6c9cb5def44658d15848e34c5c45d973f065Reid Spencer /// @verbatim (Eg. '\t') @endverbatim 271f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitString(const std::string &String) const; 272f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 273189f80dc253664627253b2d2cb07d0714feb12baDan Gohman /// EmitFile - Emit a .file directive. 274189f80dc253664627253b2d2cb07d0714feb12baDan Gohman void EmitFile(unsigned Number, const std::string &Name) const; 275189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 276f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 277f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 2786fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitAlignment - Emit an alignment directive to the specified power of 279bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 280a1ab72daadbdc5b499ce7e7e97c4b80efad46736Chris Lattner /// byte alignment. If a global value is specified, and if that global has 2813a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// an explicit alignment requested, it will unconditionally override the 2823a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// alignment request. However, if ForcedAlignBits is specified, this value 2833a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// has final say: the ultimate alignment will be the max of ForcedAlignBits 28405548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// and the alignment computed with NumBits and the global. If UseFillExpr 28505548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// is true, it also emits an optional second value FillValue which the 28605548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// assembler uses to fill gaps to match alignment for text sections if the 28705548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// has specified a non-zero fill value. 2883a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2893a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// The algorithm is: 2903a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = NumBits; 2913a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// if (GV && GV->hasalignment) Align = GV->getalignment(); 2923a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = std::max(Align, ForcedAlignBits); 2933a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2943a4205367dc845d4cd804b47e061f8281777c9daChris Lattner void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0, 29505548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits = 0, 29605548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr = true) const; 297bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 2981b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// printLabel - This method prints a local label used by debug and 2991b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// exception handling tables. 3001b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(const MachineInstr *MI) const; 3011b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(unsigned Id) const; 3021b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 303a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// printDeclare - This method prints a local variable declaration used by 304a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// debug tables. 305a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng void printDeclare(const MachineInstr *MI) const; 306a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 307f9e56198a39a08272c072211722b3c97ef88853cJim Laskey protected: 3086fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitZeros - Emit a block of zeros. 30930bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// 310c6a057b04db506152c98355b51ba15d82a15b90aJeff Cohen void EmitZeros(uint64_t NumZeros) const; 311c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 312c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// EmitString - Emit a zero-byte-terminated string constant. 313c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// 314c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen virtual void EmitString(const ConstantArray *CVA) const; 31530bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner 3166fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitConstantValueOnly - Print out the specified constant, without a 317a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 3186fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void EmitConstantValueOnly(const Constant *CV); 31946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 3206fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitGlobalConstant - Print a general LLVM constant to the .s file. 321a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands void EmitGlobalConstant(const Constant* CV); 322d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 323d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 324ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 325e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// printInlineAsm - This method formats and prints the specified machine 326e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// instruction that is an inline asm. 327e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner void printInlineAsm(const MachineInstr *MI) const; 328da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 329da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// printImplicitDef - This method prints the specified machine instruction 330da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// that is an implicit def. 331da47e6e0d003c873da960361549e57ee4617c301Evan Cheng virtual void printImplicitDef(const MachineInstr *MI) const; 33237efe6764568a3829fee26aba532283131d1a104Nate Begeman 33337efe6764568a3829fee26aba532283131d1a104Nate Begeman /// printBasicBlockLabel - This method prints the label for the specified 33437efe6764568a3829fee26aba532283131d1a104Nate Begeman /// MachineBasicBlock 335cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman virtual void printBasicBlockLabel(const MachineBasicBlock *MBB, 336fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool printAlign = false, 337cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printColon = false, 338cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printComment = true) const; 33952a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 340cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// printPICJumpTableSetLabel - This method prints a set label for the 341cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// specified MachineBasicBlock for a jumptable entry. 342cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, 343cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 344cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 345cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 3469de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov virtual void printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 3479de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 3489de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const; 3499de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 350d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// printDataDirective - This method prints the asm directive for the 351d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// specified type. 352d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng void printDataDirective(const Type *type); 353d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 354c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// printSuffixedName - This prints a name with preceding 355c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// getPrivateGlobalPrefix and the specified suffix, handling quoted names 356c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// correctly. 357ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng void printSuffixedName(const char *Name, const char *Suffix, 358ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng const char *Prefix = 0); 359ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng void printSuffixedName(const std::string &Name, const char* Suffix); 360c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen 361f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// printVisibility - This prints visibility information about symbol, if 362f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// this is suported by the target. 363f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov void printVisibility(const std::string& Name, unsigned Visibility) const; 364f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov 3657751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov /// printOffset - This is just convenient handler for printing offsets. 3667751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov void printOffset(int64_t Offset) const; 3677751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov 368ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner private: 36961e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen const GlobalValue *findGlobalValue(const Constant* CV); 370cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner void EmitLLVMUsedList(Constant *List); 371ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner void EmitXXStructorList(Constant *List); 3725eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); 373a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 374a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 375a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 376a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 377