Canonicalize header guards into a common format.
[oota-llvm.git] / lib / IR / AsmWriter.h
1 //===-- llvm/IR/AsmWriter.h - Printing LLVM IR as an assembly file - C++ --===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This files defines the interface for the AssemblyWriter class used to print
11 // LLVM IR and various helper classes that are used in printing.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_LIB_IR_ASMWRITER_H
16 #define LLVM_LIB_IR_ASMWRITER_H
17
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ADT/SetVector.h"
20 #include "llvm/IR/Attributes.h"
21 #include "llvm/IR/Instructions.h"
22 #include "llvm/IR/TypeFinder.h"
23 #include "llvm/Support/FormattedStream.h"
24
25 namespace llvm {
26
27 class BasicBlock;
28 class Function;
29 class GlobalValue;
30 class Comdat;
31 class Module;
32 class NamedMDNode;
33 class Value;
34 class SlotTracker;
35
36 /// Create a new SlotTracker for a Module 
37 SlotTracker *createSlotTracker(const Module *M);
38
39 //===----------------------------------------------------------------------===//
40 // TypePrinting Class: Type printing machinery
41 //===----------------------------------------------------------------------===//
42
43 class TypePrinting {
44   TypePrinting(const TypePrinting &) LLVM_DELETED_FUNCTION;
45   void operator=(const TypePrinting&) LLVM_DELETED_FUNCTION;
46 public:
47
48   /// NamedTypes - The named types that are used by the current module.
49   TypeFinder NamedTypes;
50
51   /// NumberedTypes - The numbered types, along with their value.
52   DenseMap<StructType*, unsigned> NumberedTypes;
53
54
55   TypePrinting() {}
56   ~TypePrinting() {}
57
58   void incorporateTypes(const Module &M);
59
60   void print(Type *Ty, raw_ostream &OS);
61
62   void printStructBody(StructType *Ty, raw_ostream &OS);
63 };
64
65 class AssemblyWriter {
66 protected:
67   formatted_raw_ostream &Out;
68   const Module *TheModule;
69
70 private:
71   std::unique_ptr<SlotTracker> ModuleSlotTracker;
72   SlotTracker &Machine;
73   TypePrinting TypePrinter;
74   AssemblyAnnotationWriter *AnnotationWriter;
75   SetVector<const Comdat *> Comdats;
76
77 public:
78   /// Construct an AssemblyWriter with an external SlotTracker
79   AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
80                  const Module *M, AssemblyAnnotationWriter *AAW);
81
82   /// Construct an AssemblyWriter with an internally allocated SlotTracker
83   AssemblyWriter(formatted_raw_ostream &o, const Module *M,
84                  AssemblyAnnotationWriter *AAW);
85
86   virtual ~AssemblyWriter();
87
88   void printMDNodeBody(const MDNode *MD);
89   void printNamedMDNode(const NamedMDNode *NMD);
90
91   void printModule(const Module *M);
92
93   void writeOperand(const Value *Op, bool PrintType);
94   void writeParamOperand(const Value *Operand, AttributeSet Attrs,unsigned Idx);
95   void writeAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope);
96   void writeAtomicCmpXchg(AtomicOrdering SuccessOrdering,
97                           AtomicOrdering FailureOrdering,
98                           SynchronizationScope SynchScope);
99
100   void writeAllMDNodes();
101   void writeMDNode(unsigned Slot, const MDNode *Node);
102   void writeAllAttributeGroups();
103
104   void printTypeIdentities();
105   void printGlobal(const GlobalVariable *GV);
106   void printAlias(const GlobalAlias *GV);
107   void printComdat(const Comdat *C);
108   void printFunction(const Function *F);
109   void printArgument(const Argument *FA, AttributeSet Attrs, unsigned Idx);
110   void printBasicBlock(const BasicBlock *BB);
111   void printInstructionLine(const Instruction &I);
112   void printInstruction(const Instruction &I);
113
114 private:
115   void init();
116
117   // printInfoComment - Print a little comment after the instruction indicating
118   // which slot it occupies.
119   void printInfoComment(const Value &V);
120 };
121
122 } // namespace llvm
123
124 #endif