• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_IR_ASSEMBLYWRITER_H
16 #define LLVM_IR_ASSEMBLYWRITER_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 
TypePrinting()55   TypePrinting() {}
~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 //LLVM_IR_ASMWRITER_H
125