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