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