AsmPrinter.h revision ce613280f987584df15ada06c5cf4809b203da46
1a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===-- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework --------*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 3a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// The LLVM Compiler Infrastructure 4a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 5a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// This file was developed by the LLVM research group and is distributed under 6a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// the University of Illinois Open Source 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" 2115404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola#include <set> 22a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 23a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 24a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Constant; 25c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen class ConstantArray; 26ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner class GlobalVariable; 278b0a8c84da2030ee8f4440d5b60a8033de691222Anton Korobeynikov class GlobalAlias; 282d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng class MachineConstantPoolEntry; 29d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng class MachineConstantPoolValue; 30563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class Mangler; 31563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey class TargetAsmInfo; 32563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 33a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 34563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// AsmPrinter - This class is intended to be used as a driving class for all 35563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// asm writers. 36a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 371997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patel static char ID; 38794fd75c67a2cdc128d67342c6d88a504d186896Devang Patel 39d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner /// FunctionNumber - This provides a unique ID for each function emitted in 40d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner /// this translation unit. It is autoincremented by SetupMachineFunction, 41d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner /// and can be accessed with getFunctionNumber() and 42d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner /// IncrementFunctionNumber(). 43d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner /// 44d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner unsigned FunctionNumber; 45a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey 4615404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola protected: 4715404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola // Necessary for external weak linkage support 4815404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola std::set<const GlobalValue*> ExtWeakSymbols; 4915404d060ba8b604c03b9223a0f2e2abcd0fddedRafael Espindola 50b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey public: 51a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 52a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 53a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::ostream &O; 54a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 55a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 56a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 57a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 58563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey 59563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// Target Asm Printer information. 60563321a2582851c653d0863e8e0bba3d483734f9Jim Laskey /// 61a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey const TargetAsmInfo *TAI; 62a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 63a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 64a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 65a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 66a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 67a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 68a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 69a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 70a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 7197e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 7289d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// CurrentSection - The current section we are emitting to. This is 7389d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey /// controlled and used by the SwitchSection method. 7489d67faf30ed1a8b5364f53c9a0f5e07a9a0719cJim Laskey std::string CurrentSection; 75b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 76b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey protected: 77a0f3d17daac73c9c71aad497b298cbe82848f726Jim Laskey AsmPrinter(std::ostream &o, TargetMachine &TM, const TargetAsmInfo *T); 78ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 79a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey public: 80f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToTextSection - Switch to the specified section of the executable 81f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 82e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// explicitly requested section, we switch to the section indicated for the 83e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// global instead of NewSection. 84e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 85e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// If the new section is an empty string, this method forgets what the 86e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// current section is, but does not emit a .section directive. 87e2b1f1188fd8c28977b5cf2a6842fc7bbb008713Chris Lattner /// 88f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit executable code. 89f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 90b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToTextSection(const char *NewSection, const GlobalValue *GV = NULL); 91d5ab7e1c54c961b447395f17b569acdf18776c5aChris Lattner 92f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// SwitchToDataSection - Switch to the specified section of the executable 93f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// if we are not already in it! If GV is non-null and if the global has an 94f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// explicitly requested section, we switch to the section indicated for the 95f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// global instead of NewSection. 96f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 97f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// If the new section is an empty string, this method forgets what the 98f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// current section is, but does not emit a .section directive. 99f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 100f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// This method is used when about to emit data. For most assemblers, this 101f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// is the same as the SwitchToTextSection method, but not all assemblers 102f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// are the same. 103f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner /// 104b52cf1f1947513c1079a08763594fbb5721e80b5Anton Korobeynikov void SwitchToDataSection(const char *NewSection, const GlobalValue *GV = NULL); 105f668ffc4c2cf3da8ef0948b316d971c4b41b0e05Chris Lattner 106a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// getGlobalLinkName - Returns the asm/link name of of the specified 107a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// global variable. Should be overridden by each target asm printer to 108a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey /// generate the appropriate value. 10999e41eed6d8b89b2ba4807625d13d08d85ea493dJim Laskey virtual const std::string getGlobalLinkName(const GlobalVariable *GV) const; 110a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 111bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// EmitExternalGlobal - Emit the external reference to a global variable. 112bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey /// Should be overridden if an indirect reference should be used. 113bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey virtual void EmitExternalGlobal(const GlobalVariable *GV); 114bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey 1156e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// getCurrentFunctionEHName - Called to return (and cache) the 1166e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// CurrentFnEHName. 1176e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling /// 118ce613280f987584df15ada06c5cf4809b203da46Bill Wendling std::string getCurrentFunctionEHName(const MachineFunction *MF); 1196e19896999f9297db38e1a1a66d9bef0e2f09776Bill Wendling 120a7cea6f599418a579ab5ce66413fba7efa8bf581Jim Laskey protected: 121a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 122a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 123a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 124a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 125a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 126a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 127a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 128a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 1293ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner 1303ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// PrintSpecial - Print information related to the specified machine instr 1313ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// that is independent of the operand, and may be independent of the instr 1323ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// itself. This can be useful for portably encoding the comment character 1333ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// or other bits of target-specific knowledge into the asmstrings. The 1343ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// syntax used is ${:comment}. Targets can override this to add support 1353ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner /// for their own strange codes. 1363ce9b67e0c0f171c6d09c19407930ce6989f1b9dChris Lattner virtual void PrintSpecial(const MachineInstr *MI, const char *Code); 13747cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 13847cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// PrintAsmOperand - Print the specified operand of MI, an INLINEASM 13947cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// instruction, using the specified assembler variant. Targets should 140b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// override this to format as appropriate. This method can return true if 14147cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// the operand is erroneous. 14247cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 143f483e58212d018f8b2ec760f59089e72defab5cfChris Lattner unsigned AsmVariant, const char *ExtraCode); 144b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 145b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// PrintAsmMemoryOperand - Print the specified operand of MI, an INLINEASM 146b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// instruction, using the specified assembler variant as an address. 147b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// Targets should override this to format as appropriate. This method can 148b44b5094110508e2381615b15077b388364f7e8aChris Lattner /// return true if the operand is erroneous. 149b44b5094110508e2381615b15077b388364f7e8aChris Lattner virtual bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, 150b44b5094110508e2381615b15077b388364f7e8aChris Lattner unsigned AsmVariant, 151b44b5094110508e2381615b15077b388364f7e8aChris Lattner const char *ExtraCode); 152b44b5094110508e2381615b15077b388364f7e8aChris Lattner 1531279b7c2a9849b499d5997d7efb5c0d6e902ca62Chris Lattner /// getSectionForFunction - Return the section that we should emit the 1541279b7c2a9849b499d5997d7efb5c0d6e902ca62Chris Lattner /// specified function body into. This defaults to 'TextSection'. This 1551279b7c2a9849b499d5997d7efb5c0d6e902ca62Chris Lattner /// should most likely be overridden by the target to put linkonce/weak 1561279b7c2a9849b499d5997d7efb5c0d6e902ca62Chris Lattner /// functions into special sections. 1571279b7c2a9849b499d5997d7efb5c0d6e902ca62Chris Lattner virtual std::string getSectionForFunction(const Function &F) const; 1581279b7c2a9849b499d5997d7efb5c0d6e902ca62Chris Lattner 1596fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// SetupMachineFunction - This should be called when a new MachineFunction 160a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 1616fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void SetupMachineFunction(MachineFunction &MF); 16297e32e3239c0f065698f8c004b2b3009162f5ed6Chris Lattner 16347cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// getFunctionNumber - Return a unique ID for the current function. 16447cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// 16547cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner unsigned getFunctionNumber() const { return FunctionNumber; } 16647cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 16747cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// IncrementFunctionNumber - Increase Function Number. AsmPrinters should 16847cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// not normally call this, as the counter is automatically bumped by 16947cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner /// SetupMachineFunction. 17047cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner void IncrementFunctionNumber() { FunctionNumber++; } 17147cf4eda9faa3c0b063337d0eb4ea83aba8cb329Chris Lattner 172ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitConstantPool - Print to the current output stream assembly 173ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// representations of the constants in the constant pool MCP. This is 174ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// used to print out constants which have been "spilled to memory" by 175ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// the code generator. 176ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// 1772d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng void EmitConstantPool(MachineConstantPool *MCP); 178a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 17937efe6764568a3829fee26aba532283131d1a104Nate Begeman /// EmitJumpTableInfo - Print assembly representations of the jump tables 18037efe6764568a3829fee26aba532283131d1a104Nate Begeman /// used by the current function to the current output stream. 18137efe6764568a3829fee26aba532283131d1a104Nate Begeman /// 1821da31ee472b9615d7329c656e2cc17c419ed7c95Chris Lattner void EmitJumpTableInfo(MachineJumpTableInfo *MJTI, MachineFunction &MF); 18337efe6764568a3829fee26aba532283131d1a104Nate Begeman 184ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// EmitSpecialLLVMGlobal - Check to see if the specified global is a 185ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// special global used by LLVM. If so, emit it and return true, otherwise 186ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner /// do nothing and return false. 187ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner bool EmitSpecialLLVMGlobal(const GlobalVariable *GV); 188a1a19f803c8fef05db627a8b73c909a50306e9d6Jim Laskey 189f9e56198a39a08272c072211722b3c97ef88853cJim Laskey public: 190f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 191f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// LEB 128 number encoding. 192f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 193f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintULEB128 - Print a series of hexidecimal values(separated by commas) 194f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing an unsigned leb128 value. 195f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintULEB128(unsigned Value) const; 196f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 197f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// SizeULEB128 - Compute the number of bytes required for an unsigned 198f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// leb128 value. 199f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey static unsigned SizeULEB128(unsigned Value); 200f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 201f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintSLEB128 - Print a series of hexidecimal values(separated by commas) 202f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// representing a signed leb128 value. 203f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintSLEB128(int Value) const; 204f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 205f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// SizeSLEB128 - Compute the number of bytes required for a signed leb128 206f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// value. 207f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey static unsigned SizeSLEB128(int Value); 208f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 209f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 210f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // Emission and print routines 211f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey // 212f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 213f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// PrintHex - Print a value as a hexidecimal value. 214f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 215f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void PrintHex(int Value) const; 216f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 217f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EOL - Print a newline character to asm stream. If a comment is present 218f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// then it will be printed first. Comments should not contain '\n'. 219bda9b0ec7bd6974cebf751ecd23c5434b34054e9Jim Laskey void EOL() const; 220f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EOL(const std::string &Comment) const; 221f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 222f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an 223f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// unsigned leb128 value. 224f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitULEB128Bytes(unsigned Value) const; 225f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 226f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitSLEB128Bytes - print an assembler byte data directive to compose a 227f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// signed leb128 value. 228f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitSLEB128Bytes(int Value) const; 229f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 230f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt8 - Emit a byte directive and value. 231f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 232f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt8(int Value) const; 233f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 234f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt16 - Emit a short directive and value. 235f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 236f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt16(int Value) const; 237f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 238f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt32 - Emit a long directive and value. 239f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 240f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt32(int Value) const; 241f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 242f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitInt64 - Emit a long long directive and value. 243f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// 244f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitInt64(uint64_t Value) const; 245f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 246f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// EmitString - Emit a string with quotes and a null terminator. 247f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey /// Special characters are emitted properly. 248181b6c9cb5def44658d15848e34c5c45d973f065Reid Spencer /// @verbatim (Eg. '\t') @endverbatim 249f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey void EmitString(const std::string &String) const; 250f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 251f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey //===------------------------------------------------------------------===// 252f1cdea1d021068f5c9e118d68321ce28fcea63faJim Laskey 2536fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitAlignment - Emit an alignment directive to the specified power of 254bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 255a1ab72daadbdc5b499ce7e7e97c4b80efad46736Chris Lattner /// byte alignment. If a global value is specified, and if that global has 2563a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// an explicit alignment requested, it will unconditionally override the 2573a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// alignment request. However, if ForcedAlignBits is specified, this value 2583a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// has final say: the ultimate alignment will be the max of ForcedAlignBits 25973a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng /// and the alignment computed with NumBits and the global. If UseFillExpr 26073a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng /// is true, it also emits an optional second value FillValue which the 26173a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng /// assembler uses to fill gaps to match alignment. 2623a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2633a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// The algorithm is: 2643a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = NumBits; 2653a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// if (GV && GV->hasalignment) Align = GV->getalignment(); 2663a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// Align = std::max(Align, ForcedAlignBits); 2673a4205367dc845d4cd804b47e061f8281777c9daChris Lattner /// 2683a4205367dc845d4cd804b47e061f8281777c9daChris Lattner void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0, 26973a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng unsigned ForcedAlignBits = 0, bool UseFillExpr = false, 27073a259a9d1814912255aee6c185c5aeb7bb581baEvan Cheng unsigned FillValue = 0) const; 271bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 272f9e56198a39a08272c072211722b3c97ef88853cJim Laskey protected: 2736fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitZeros - Emit a block of zeros. 27430bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// 275c6a057b04db506152c98355b51ba15d82a15b90aJeff Cohen void EmitZeros(uint64_t NumZeros) const; 276c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen 277c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// EmitString - Emit a zero-byte-terminated string constant. 278c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen /// 279c884db47f1a1d5449b749e6528292451e49025e4Jeff Cohen virtual void EmitString(const ConstantArray *CVA) const; 28030bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner 2816fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitConstantValueOnly - Print out the specified constant, without a 282a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 2836fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void EmitConstantValueOnly(const Constant *CV); 28446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 2856fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner /// EmitGlobalConstant - Print a general LLVM constant to the .s file. 28646d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// 2876fe3acce749ee2b3714009064626f6c53b06dfb4Chris Lattner void EmitGlobalConstant(const Constant* CV); 288d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 289d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV); 290ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner 291e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// printInlineAsm - This method formats and prints the specified machine 292e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner /// instruction that is an inline asm. 293e736ed19478f05811f08a56706e07fa4ab865401Chris Lattner void printInlineAsm(const MachineInstr *MI) const; 29437efe6764568a3829fee26aba532283131d1a104Nate Begeman 2951ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey /// printLabel - This method prints a local label used by debug and 2961ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey /// exception handling tables. 2971ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey void printLabel(const MachineInstr *MI) const; 2981ee29257428960fede862fcfdbe80d5d007927e9Jim Laskey 29937efe6764568a3829fee26aba532283131d1a104Nate Begeman /// printBasicBlockLabel - This method prints the label for the specified 30037efe6764568a3829fee26aba532283131d1a104Nate Begeman /// MachineBasicBlock 301cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman virtual void printBasicBlockLabel(const MachineBasicBlock *MBB, 302cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printColon = false, 303cdf38c4edb892c356cfaa3c09c57728bc8d6bfd0Nate Begeman bool printComment = true) const; 30452a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman 30552a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman /// printSetLabel - This method prints a set label for the specified 30652a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman /// MachineBasicBlock 30752a51e38dc312aa262b0d771419afe1785f3cb22Nate Begeman void printSetLabel(unsigned uid, const MachineBasicBlock *MBB) const; 30841349c10cbb166c58a20896e4761455f001c611eEvan Cheng void printSetLabel(unsigned uid, unsigned uid2, 30941349c10cbb166c58a20896e4761455f001c611eEvan Cheng const MachineBasicBlock *MBB) const; 310d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 311d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// printDataDirective - This method prints the asm directive for the 312d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng /// specified type. 313d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng void printDataDirective(const Type *type); 314d6594ae54cfde4db4d30272192645c0a45fb9902Evan Cheng 315ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner private: 316cb05af852f1d346ac07b84c74a930a5cdbd6d427Chris Lattner void EmitLLVMUsedList(Constant *List); 317ed13893ff729bc3b91697f6d80a3ba303782efccChris Lattner void EmitXXStructorList(Constant *List); 3182d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng void EmitConstantPool(unsigned Alignment, const char *Section, 3192d2cec1e9e93a388bd8448f4bad661ac89a49de3Evan Cheng std::vector<std::pair<MachineConstantPoolEntry,unsigned> > &CP); 320b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey 321a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 322a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 323a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 324a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 325