AsmPrinter.h revision a10f15949d6ca25eb67514cce69d42626efa6380
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 54c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel /// DW -This is needed because printDeclare() has to insert 55c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel /// DbgVariable entries into the dwarf table. This is a short term hack 5606816127fd35d4942a092479e9f30279eb050b0bEvan Cheng /// that ought be fixed soon. 57c48c550e1322aebfbe35c7570891619db43bdb9bDevang Patel DwarfWriter *DW; 58c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 59c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen // GCMetadataPrinters - The garbage collection metadata printer table. 605eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen typedef DenseMap<GCStrategy*,GCMetadataPrinter*> gcp_map_type; 61c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen typedef gcp_map_type::iterator gcp_iterator; 62c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen gcp_map_type GCMetadataPrinters; 63c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 6415404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola protected: 6515404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola // Necessary for external weak linkage support 6615404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola std::set<const GlobalValue*> ExtWeakSymbols; 6715404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 68b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey public: 69a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 70a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 71cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson raw_ostream &O; 72a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 73a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 74a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 75a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 76563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 77563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// Target Asm Printer information. 78563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// 79a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey const TargetAsmInfo *TAI; 80a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 81da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// Target Register Information. 82da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// 83da47e6e0d003c873da960361549e57ee4617c301Evan Cheng const TargetRegisterInfo *TRI; 84da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 85a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 86a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 87a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 88a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 89a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 90a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 91a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 92a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 9397e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 9489d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// CurrentSection - The current section we are emitting to. This is 9589d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// controlled and used by the SwitchSection method. 9689d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey std::string CurrentSection; 97d7ca416d6c9ae1966e0df8193112e3c5f430a053Anton Korobeynikov const Section* CurrentSection_; 98fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng 99fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng /// IsInTextSection - True if the current section we are emitting to is a 100fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng /// text section. 101fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool IsInTextSection; 102b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 103b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey protected: 104cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson AsmPrinter(raw_ostream &o, TargetMachine &TM, const TargetAsmInfo *T); 105ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 106a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey public: 107c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen virtual ~AsmPrinter(); 108c317a60c2714a5b90700a11ba646285cb754a5d3Gordon Henriksen 109f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToTextSection - Switch to the specified section of the executable 110f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 111e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// explicitly requested section, we switch to the section indicated for the 112e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// global instead of NewSection. 113e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 114e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// If the new section is an empty string, this method forgets what the 115e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// current section is, but does not emit a .section directive. 116e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 117f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit executable code. 118f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 119b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToTextSection(const char *NewSection, const GlobalValue *GV = NULL); 120d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner 121f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToDataSection - Switch to the specified section of the executable 122f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 123f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// explicitly requested section, we switch to the section indicated for the 124f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// global instead of NewSection. 125f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 126f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// If the new section is an empty string, this method forgets what the 127f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// current section is, but does not emit a .section directive. 128f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 129f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit data. For most assemblers, this 130f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// is the same as the SwitchToTextSection method, but not all assemblers 131f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// are the same. 132f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 133b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToDataSection(const char *NewSection, const GlobalValue *GV = NULL); 134b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 135b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov /// SwitchToSection - Switch to the specified section of the executable if 136b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov /// we are not already in it! 137b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov void SwitchToSection(const Section* NS); 138b5a32e2e8ce2f3de3a340c5a2dfcd3a159968466Anton Korobeynikov 139a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// getGlobalLinkName - Returns the asm/link name of of the specified 140a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// global variable. Should be overridden by each target asm printer to 141a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// generate the appropriate value. 14299e41eed6d8b89b2ba4807625d13d08d85ea493dJim Laskey virtual const std::string getGlobalLinkName(const GlobalVariable *GV) const; 143a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 144bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// EmitExternalGlobal - Emit the external reference to a global variable. 145bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// Should be overridden if an indirect reference should be used. 146bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey virtual void EmitExternalGlobal(const GlobalVariable *GV); 147bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 1486e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// getCurrentFunctionEHName - Called to return (and cache) the 1496e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// CurrentFnEHName. 1506e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// 151ce613280f987584df15ada06c5cf4809b203da46Bill Wendling std::string getCurrentFunctionEHName(const MachineFunction *MF); 1526e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling 153a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey protected: 154ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// getAnalysisUsage - Record analysis usage. 155ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen /// 156ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen void getAnalysisUsage(AnalysisUsage &AU) const; 157ce2247755e56f99a2377b64a1a9d393726582b85Gordon Henriksen 158a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 159a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 160a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 161a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 162a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 163a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 164a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 165a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 1663ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1673ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// PrintSpecial - Print information related to the specified machine instr 1683ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// that is independent of the operand, and may be independent of the instr 1693ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// itself. This can be useful for portably encoding the comment character 1703ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// or other bits of target-specific knowledge into the asmstrings. The 1713ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// syntax used is ${:comment}. Targets can override this to add support 1723ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// for their own strange codes. 1733ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner virtual void PrintSpecial(const MachineInstr *MI, const char *Code); 17447cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 17547cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 17647cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// instruction, using the specified assembler variant. Targets should 177b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// override this to format as appropriate. This method can return true if 17847cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// the operand is erroneous. 17947cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 180f483e58212d018f8b2ec760f59089e72defab5cfChris Lattner unsigned AsmVariant, const char *ExtraCode); 181b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 182b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// PrintAsmMemoryOperand - Print the specified operand of MI, an INLINEASM 183b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// instruction, using the specified assembler variant as an address. 184b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// Targets should override this to format as appropriate. This method can 185b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// return true if the operand is erroneous. 186b44b5094110508e2381615b15077b388364f7e8aChris Lattner virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 187b44b5094110508e2381615b15077b388364f7e8aChris Lattner unsigned AsmVariant, 188b44b5094110508e2381615b15077b388364f7e8aChris Lattner const char *ExtraCode); 189b44b5094110508e2381615b15077b388364f7e8aChris Lattner 1906fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// SetupMachineFunction - This should be called when a new MachineFunction 191a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 1926fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void SetupMachineFunction(MachineFunction &MF); 19397e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 194347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// getFunctionNumber - Return a unique ID for the current function. 195347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// 196347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng unsigned getFunctionNumber() const { return FunctionNumber; } 197347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 198347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// IncrementFunctionNumber - Increase Function Number. AsmPrinters should 199347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// not normally call this, as the counter is automatically bumped by 200347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng /// SetupMachineFunction. 201347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng void IncrementFunctionNumber() { FunctionNumber++; } 202347d39f1fd8ad825a7ec5b8a3dce816723a56d42Evan Cheng 203ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitConstantPool - Print to the current output stream assembly 204ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// representations of the constants in the constant pool MCP. This is 205ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// used to print out constants which have been "spilled to memory" by 206ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// the code generator. 207ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// 2082d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng void EmitConstantPool(MachineConstantPool *MCP); 209a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 21037efe6764568a3829fee26aba532283131d1a104Nate Begeman /// EmitJumpTableInfo - Print assembly representations of the jump tables 21137efe6764568a3829fee26aba532283131d1a104Nate Begeman /// used by the current function to the current output stream. 21237efe6764568a3829fee26aba532283131d1a104Nate Begeman /// 2131da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner void EmitJumpTableInfo(MachineJumpTableInfo *MJTI, MachineFunction &MF); 21437efe6764568a3829fee26aba532283131d1a104Nate Begeman 215ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitSpecialLLVMGlobal - Check to see if the specified global is a 216ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// special global used by LLVM. If so, emit it and return true, otherwise 217ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// do nothing and return false. 218ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 219a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 220f9e56198a39a08272c072211722b3c97ef88853cJim Laskey public: 221f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 222f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// LEB 128 number encoding. 223f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 224f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintULEB128 - Print a series of hexidecimal values(separated by commas) 225f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing an unsigned leb128 value. 226f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintULEB128(unsigned Value) const; 227f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 228f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintSLEB128 - Print a series of hexidecimal values(separated by commas) 229f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing a signed leb128 value. 230f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintSLEB128(int Value) const; 231f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 232f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 233f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // Emission and print routines 234f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // 235f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 236f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintHex - Print a value as a hexidecimal value. 237f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 238f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintHex(int Value) const; 239f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 240f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EOL - Print a newline character to asm stream. If a comment is present 241f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// then it will be printed first. Comments should not contain '\n'. 242bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey void EOL() const; 243f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EOL(const std::string &Comment) const; 24425995093e785f4794b3590f3df70fbfe834a00a1Owen Anderson void EOL(const char* Comment) const; 245f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 246f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 247f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// unsigned leb128 value. 248f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitULEB128Bytes(unsigned Value) const; 249f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 250f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitSLEB128Bytes - print an assembler byte data directive to compose a 251f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// signed leb128 value. 252f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitSLEB128Bytes(int Value) const; 253f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 254f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt8 - Emit a byte directive and value. 255f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 256f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt8(int Value) const; 257f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 258f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt16 - Emit a short directive and value. 259f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 260f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt16(int Value) const; 261f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 262f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt32 - Emit a long directive and value. 263f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 264f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt32(int Value) const; 265f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 266f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt64 - Emit a long long directive and value. 267f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 268f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt64(uint64_t Value) const; 269f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 270f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitString - Emit a string with quotes and a null terminator. 271f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// Special characters are emitted properly. 272181b6c9cb5def44658d15848e34c5c45d973f065Reid Spencer /// @verbatim (Eg. '\t') @endverbatim 273f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitString(const std::string &String) const; 274f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 275189f80dc253664627253b2d2cb07d0714feb12baDan Gohman /// EmitFile - Emit a .file directive. 276189f80dc253664627253b2d2cb07d0714feb12baDan Gohman void EmitFile(unsigned Number, const std::string &Name) const; 277189f80dc253664627253b2d2cb07d0714feb12baDan Gohman 278f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 279f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 2806fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitAlignment - Emit an alignment directive to the specified power of 281bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 282a1ab72daadbdc5b499ce7e7e97c4b80efad46736Chris Lattner /// byte alignment. If a global value is specified, and if that global has 2833a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// an explicit alignment requested, it will unconditionally override the 2843a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// alignment request. However, if ForcedAlignBits is specified, this value 2853a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// has final say: the ultimate alignment will be the max of ForcedAlignBits 28605548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// and the alignment computed with NumBits and the global. If UseFillExpr 28705548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// is true, it also emits an optional second value FillValue which the 28805548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// assembler uses to fill gaps to match alignment for text sections if the 28905548eb174dd694b651de334b73197a62e5071f1Evan Cheng /// has specified a non-zero fill value. 2903a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2913a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// The algorithm is: 2923a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = NumBits; 2933a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// if (GV && GV->hasalignment) Align = GV->getalignment(); 2943a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = std::max(Align, ForcedAlignBits); 2953a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2963a4205367dc845d4cd804b47e061f8281777c9daChris Lattner void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0, 29705548eb174dd694b651de334b73197a62e5071f1Evan Cheng unsigned ForcedAlignBits = 0, 29805548eb174dd694b651de334b73197a62e5071f1Evan Cheng bool UseFillExpr = true) const; 299bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 3001b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// printLabel - This method prints a local label used by debug and 3011b08bbca5592351a940bcd164bdec724ee954326Evan Cheng /// exception handling tables. 3021b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(const MachineInstr *MI) const; 3031b08bbca5592351a940bcd164bdec724ee954326Evan Cheng void printLabel(unsigned Id) const; 3041b08bbca5592351a940bcd164bdec724ee954326Evan Cheng 305a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// printDeclare - This method prints a local variable declaration used by 306a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng /// debug tables. 307a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng void printDeclare(const MachineInstr *MI) const; 308a844bdeab31ef04221e7ef59a8467893584cc14dEvan Cheng 309f9e56198a39a08272c072211722b3c97ef88853cJim Laskey protected: 3106fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitZeros - Emit a block of zeros. 31130bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// 312c6a057b04db506152c98355b51ba15d82a15b90aJeff Cohen void EmitZeros(uint64_t NumZeros) const; 313c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 314c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// EmitString - Emit a zero-byte-terminated string constant. 315c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// 316c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen virtual void EmitString(const ConstantArray *CVA) const; 31730bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner 3186fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitConstantValueOnly - Print out the specified constant, without a 319a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 320a10f15949d6ca25eb67514cce69d42626efa6380Sanjiv Gupta void EmitConstantValueOnly(const Constant *CV); 32146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 3226fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitGlobalConstant - Print a general LLVM constant to the .s file. 323a0fcc08e6542a0376917b5c76a0af3eb2650c535Duncan Sands void EmitGlobalConstant(const Constant* CV); 324d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 325d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 326ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 327e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// printInlineAsm - This method formats and prints the specified machine 328e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// instruction that is an inline asm. 329e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner void printInlineAsm(const MachineInstr *MI) const; 330da47e6e0d003c873da960361549e57ee4617c301Evan Cheng 331da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// printImplicitDef - This method prints the specified machine instruction 332da47e6e0d003c873da960361549e57ee4617c301Evan Cheng /// that is an implicit def. 333da47e6e0d003c873da960361549e57ee4617c301Evan Cheng virtual void printImplicitDef(const MachineInstr *MI) const; 33437efe6764568a3829fee26aba532283131d1a104Nate Begeman 33537efe6764568a3829fee26aba532283131d1a104Nate Begeman /// printBasicBlockLabel - This method prints the label for the specified 33637efe6764568a3829fee26aba532283131d1a104Nate Begeman /// MachineBasicBlock 337cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman virtual void printBasicBlockLabel(const MachineBasicBlock *MBB, 338fb8075d03f5c87bd57dcc9c5f2304f6b13c55aadEvan Cheng bool printAlign = false, 339cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printColon = false, 340cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printComment = true) const; 34152a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 342cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// printPICJumpTableSetLabel - This method prints a set label for the 343cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng /// specified MachineBasicBlock for a jumptable entry. 344cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, 345cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 346cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng virtual void printPICJumpTableSetLabel(unsigned uid, unsigned uid2, 347cc41586b9d79532172b37e1f44a9077da4b73fc9Evan Cheng const MachineBasicBlock *MBB) const; 3489de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov virtual void printPICJumpTableEntry(const MachineJumpTableInfo *MJTI, 3499de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov const MachineBasicBlock *MBB, 3509de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov unsigned uid) const; 3519de1934099f4eedaeb2f3a023411b2cd3e0e1eaeAnton Korobeynikov 352d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// printDataDirective - This method prints the asm directive for the 353d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// specified type. 354d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng void printDataDirective(const Type *type); 355d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 356c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// printSuffixedName - This prints a name with preceding 357c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// getPrivateGlobalPrefix and the specified suffix, handling quoted names 358c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen /// correctly. 359ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng void printSuffixedName(const char *Name, const char *Suffix, 360ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng const char *Prefix = 0); 361ab8faba2fb17e540751adf75161a25b18c94b818Evan Cheng void printSuffixedName(const std::string &Name, const char* Suffix); 362c215b3ef5d9627f5fb6fe9034e46bc29ae592916Dale Johannesen 363f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// printVisibility - This prints visibility information about symbol, if 364f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov /// this is suported by the target. 365f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov void printVisibility(const std::string& Name, unsigned Visibility) const; 366f5b6a47bb57fb5ffc734416d4d5d993e1a06273bAnton Korobeynikov 3677751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov /// printOffset - This is just convenient handler for printing offsets. 3687751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov void printOffset(int64_t Offset) const; 3697751ad92daeea5a3502fbc266ae814baec5c03e6Anton Korobeynikov 370ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner private: 37161e6093dc8d92def3dfe0b379df83f70b0558247Dale Johannesen const GlobalValue *findGlobalValue(const Constant* CV); 372cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner void EmitLLVMUsedList(Constant *List); 373ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner void EmitXXStructorList(Constant *List); 37400d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantStruct(const ConstantStruct* CVS); 37500d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantArray(const ConstantArray* CVA); 37600d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantVector(const ConstantVector* CP); 37700d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantFP(const ConstantFP* CFP); 37800d448a341175556ebd86af68219f5b90b7145a3Dan Gohman void EmitGlobalConstantLargeInt(const ConstantInt* CI); 3795eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen GCMetadataPrinter *GetOrCreateGCPrinter(GCStrategy *C); 380a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 381a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 382a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 383a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 384