AsmPrinter.h revision 664044b2bddc82ed26e7a71015a084c75a645e50
1a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===-- llvm/CodeGen/AsmPrinter.h - AsmPrinter Framework --------*- C++ -*-===// 2a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 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. 7a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 8a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner//===----------------------------------------------------------------------===// 9a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// 10a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// This class is intended to be used as a base class for target-specific 11a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// asmwriters. This class primarily takes care of printing global constants, 12a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner// which are printed in a very similar way across all targets. 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" 21a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 22a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 23a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Constant; 24a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Mangler; 25a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 26a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 27a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner protected: 28a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 29a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 30a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::ostream &O; 31a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 32a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 33a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 34a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 35a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 36a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 37a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 38a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 39a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 40a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 41a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 42a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 43a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 44a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 4546d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner //===------------------------------------------------------------------===// 46f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner // Properties to be set by the derived class ctor, used to configure the 47f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner // asmwriter. 48f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner 49b6e678b1c8ff07e3ba681f1f365762ef8c4d84f7Chris Lattner /// CommentString - This indicates the comment character used by the 5075585268a7761acfce320d1f4da059bea82d2ecdChris Lattner /// assembler. 51b6e678b1c8ff07e3ba681f1f365762ef8c4d84f7Chris Lattner const char *CommentString; // Defaults to "#" 5275585268a7761acfce320d1f4da059bea82d2ecdChris Lattner 53af2bf0ab306f7a9a3fe2af028656514f7ef53143Chris Lattner /// GlobalPrefix - If this is set to a non-empty string, it is prepended 54af2bf0ab306f7a9a3fe2af028656514f7ef53143Chris Lattner /// onto all global symbols. This is often used for "_" or ".". 5575585268a7761acfce320d1f4da059bea82d2ecdChris Lattner const char *GlobalPrefix; // Defaults to "" 56f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner 57855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// GlobalVarAddrPrefix/Suffix - If these are nonempty, these strings 58855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// will enclose any GlobalVariable (that isn't a function) 59855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// 60855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina const char *GlobalVarAddrPrefix; // Defaults to "" 61855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina const char *GlobalVarAddrSuffix; // Defaults to "" 62855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina 63855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// FunctionAddrPrefix/Suffix - If these are nonempty, these strings 64855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// will enclose any GlobalVariable that points to a function. 65855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// For example, this is used by the IA64 backend to materialize 66855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// function descriptors, by decorating the ".data8" object with the 67855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// @fptr( ) link-relocation operator. 68855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina /// 69855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina const char *FunctionAddrPrefix; // Defaults to "" 70855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina const char *FunctionAddrSuffix; // Defaults to "" 71855a51974134e818232e52d63a2c3b2b48c8e244Duraid Madina 7246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// ZeroDirective - this should be set to the directive used to get some 7346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// number of zero bytes emitted to the current section. Common cases are 7446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// "\t.zero\t" and "\t.space\t". If this is set to null, the 7546d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// Data*bitsDirective's will be used to emit zero bytes. 7646d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *ZeroDirective; // Defaults to "\t.zero\t" 7746d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 7846d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// AsciiDirective - This directive allows emission of an ascii string with 7946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// the standard C escape characters embedded into it. 8046d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *AsciiDirective; 8146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 8246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// DataDirectives - These directives are used to output some unit of 8346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// integer data to the current section. If a data directive is set to 8446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// null, smaller data directives will be used to emit the large sizes. 8546d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data8bitsDirective; // Defaults to "\t.byte\t" 8646d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data16bitsDirective; // Defaults to "\t.short\t" 8746d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data32bitsDirective; // Defaults to "\t.long\t" 8846d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data64bitsDirective; // Defaults to "\t.quad\t" 8946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 90bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// AlignDirective - The directive used to emit round up to an alignment 91bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// boundary. 92bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// 93bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner const char *AlignDirective; // Defaults to "\t.align\t" 94bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 95bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// AlignmentIsInBytes - If this is true (the default) then the asmprinter 96bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// emits ".align N" directives, where N is the number of bytes to align to. 97bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// Otherwise, it emits ".align log2(N)", e.g. 3 to align to an 8 byte 98bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// boundary. 99bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner bool AlignmentIsInBytes; // Defaults to true 100bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 101f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner AsmPrinter(std::ostream &o, TargetMachine &tm) 10246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner : O(o), TM(tm), 103b6e678b1c8ff07e3ba681f1f365762ef8c4d84f7Chris Lattner CommentString("#"), 10446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner GlobalPrefix(""), 105664044b2bddc82ed26e7a71015a084c75a645e50Duraid Madina GlobalVarAddrPrefix(""), 106664044b2bddc82ed26e7a71015a084c75a645e50Duraid Madina GlobalVarAddrSuffix(""), 107664044b2bddc82ed26e7a71015a084c75a645e50Duraid Madina FunctionAddrPrefix(""), 108664044b2bddc82ed26e7a71015a084c75a645e50Duraid Madina FunctionAddrSuffix(""), 10946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner ZeroDirective("\t.zero\t"), 11046d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner AsciiDirective("\t.ascii\t"), 11146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner Data8bitsDirective("\t.byte\t"), 11246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner Data16bitsDirective("\t.short\t"), 113800ade1e19df83d1bd300e7bb0f5e64e43f20b66Chris Lattner Data32bitsDirective("\t.long\t"), 114bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner Data64bitsDirective("\t.quad\t"), 115bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner AlignDirective("\t.align\t"), 116bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner AlignmentIsInBytes(true) { 117bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner } 118a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 119a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 120a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 121a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 122a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 123a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 124a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 125a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 126a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 127a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 128a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// setupMachineFunction - This should be called when a new MachineFunction 129a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 130a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner void setupMachineFunction(MachineFunction &MF); 131a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 132bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// emitAlignment - Emit an alignment directive to the specified power of 133bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// two boundary. For example, if you pass in 3 here, you will get an 8 134bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner /// byte alignment. 135bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner void emitAlignment(unsigned NumBits) const; 136bfddc2030a7e67b9e0c42276525d6932375ff261Chris Lattner 13730bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// emitZeros - Emit a block of zeros. 13830bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner /// 139190f3ba2aa58dc2e73a5f90dff15015a1ffa226bChris Lattner void emitZeros(uint64_t NumZeros) const; 14030bad4af40d0126f888f601fb46d01e2b39dbc43Chris Lattner 141a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// emitConstantValueOnly - Print out the specified constant, without a 142a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 143a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner void emitConstantValueOnly(const Constant *CV); 14446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 14546d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// emitGlobalConstant - Print a general LLVM constant to the .s file. 14646d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// 14746d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner void emitGlobalConstant(const Constant* CV); 148a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 149a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 150a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 151a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 152