AsmPrinter.h revision 75585268a7761acfce320d1f4da059bea82d2ecd
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" 20a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 21a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattnernamespace llvm { 22a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Constant; 23a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class Mangler; 24a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 25a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner class AsmPrinter : public MachineFunctionPass { 26a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner protected: 27a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Output stream on which we're printing assembly code. 28a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 29a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::ostream &O; 30a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 31a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Target machine description. 32a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 33a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner TargetMachine &TM; 34a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 35a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Name-mangler for global names. 36a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 37a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner Mangler *Mang; 38a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 39a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// Cache of mangled name for current function. This is recalculated at the 40a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// beginning of each call to runOnMachineFunction(). 41a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// 42a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner std::string CurrentFnName; 43a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 4446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner //===------------------------------------------------------------------===// 45f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner // Properties to be set by the derived class ctor, used to configure the 46f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner // asmwriter. 47f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner 4875585268a7761acfce320d1f4da059bea82d2ecdChris Lattner /// CommentChar - This indicates the comment character used by the 4975585268a7761acfce320d1f4da059bea82d2ecdChris Lattner /// assembler. 5075585268a7761acfce320d1f4da059bea82d2ecdChris Lattner const char *CommentChar; 5175585268a7761acfce320d1f4da059bea82d2ecdChris Lattner 52af2bf0ab306f7a9a3fe2af028656514f7ef53143Chris Lattner /// GlobalPrefix - If this is set to a non-empty string, it is prepended 53af2bf0ab306f7a9a3fe2af028656514f7ef53143Chris Lattner /// onto all global symbols. This is often used for "_" or ".". 5475585268a7761acfce320d1f4da059bea82d2ecdChris Lattner const char *GlobalPrefix; // Defaults to "" 55f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner 5646d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// ZeroDirective - this should be set to the directive used to get some 5746d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// number of zero bytes emitted to the current section. Common cases are 5846d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// "\t.zero\t" and "\t.space\t". If this is set to null, the 5946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// Data*bitsDirective's will be used to emit zero bytes. 6046d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *ZeroDirective; // Defaults to "\t.zero\t" 6146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 6246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// AsciiDirective - This directive allows emission of an ascii string with 6346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// the standard C escape characters embedded into it. 6446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *AsciiDirective; 6546d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 6646d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// DataDirectives - These directives are used to output some unit of 6746d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// integer data to the current section. If a data directive is set to 6846d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// null, smaller data directives will be used to emit the large sizes. 6946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data8bitsDirective; // Defaults to "\t.byte\t" 7046d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data16bitsDirective; // Defaults to "\t.short\t" 7146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data32bitsDirective; // Defaults to "\t.long\t" 7246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner const char *Data64bitsDirective; // Defaults to "\t.quad\t" 7346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 74f1cb7953947900035edd090ad4b81b1b2bb48791Chris Lattner AsmPrinter(std::ostream &o, TargetMachine &tm) 7546d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner : O(o), TM(tm), 7675585268a7761acfce320d1f4da059bea82d2ecdChris Lattner CommentChar("#"), 7746d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner GlobalPrefix(""), 7846d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner ZeroDirective("\t.zero\t"), 7946d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner AsciiDirective("\t.ascii\t"), 8046d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner Data8bitsDirective("\t.byte\t"), 8146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner Data16bitsDirective("\t.short\t"), 82800ade1e19df83d1bd300e7bb0f5e64e43f20b66Chris Lattner Data32bitsDirective("\t.long\t"), 8346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner Data64bitsDirective("\t.quad\t") { } 84a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 85a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doInitialization - Set up the AsmPrinter when we are working on a new 86a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// module. If your pass overrides this, it must make sure to explicitly 87a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// call this implementation. 88a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doInitialization(Module &M); 89a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 90a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// doFinalization - Shut down the asmprinter. If you override this in your 91a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// pass, you must make sure to call it explicitly. 92a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner bool doFinalization(Module &M); 93a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 94a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// setupMachineFunction - This should be called when a new MachineFunction 95a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// is being processed from runOnMachineFunction. 96a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner void setupMachineFunction(MachineFunction &MF); 97a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 98a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// emitConstantValueOnly - Print out the specified constant, without a 99a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner /// storage class. Only constants of first-class type are allowed here. 100a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner void emitConstantValueOnly(const Constant *CV); 10146d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner 10246d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// emitGlobalConstant - Print a general LLVM constant to the .s file. 10346d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner /// 10446d6126e669ab83383d47fb465d2a7d0c60169e5Chris Lattner void emitGlobalConstant(const Constant* CV); 105a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner }; 106a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner} 107a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner 108a80ba71efe5be5012128e2db0dd29b024e00105aChris Lattner#endif 109