1 //===-- llvm/IR/AsmWriter.h - Printing LLVM IR as an assembly file - C++ --===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
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.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_LIB_IR_ASMWRITER_H
16 #define LLVM_LIB_IR_ASMWRITER_H
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/IR/UseListOrder.h"
24 #include "llvm/Support/FormattedStream.h"
37 /// Create a new SlotTracker for a Module
38 SlotTracker *createSlotTracker(const Module *M);
40 //===----------------------------------------------------------------------===//
41 // TypePrinting Class: Type printing machinery
42 //===----------------------------------------------------------------------===//
45 TypePrinting(const TypePrinting &) LLVM_DELETED_FUNCTION;
46 void operator=(const TypePrinting&) LLVM_DELETED_FUNCTION;
49 /// NamedTypes - The named types that are used by the current module.
50 TypeFinder NamedTypes;
52 /// NumberedTypes - The numbered types, along with their value.
53 DenseMap<StructType*, unsigned> NumberedTypes;
59 void incorporateTypes(const Module &M);
61 void print(Type *Ty, raw_ostream &OS);
63 void printStructBody(StructType *Ty, raw_ostream &OS);
66 class AssemblyWriter {
68 formatted_raw_ostream &Out;
69 const Module *TheModule;
72 std::unique_ptr<SlotTracker> ModuleSlotTracker;
74 TypePrinting TypePrinter;
75 AssemblyAnnotationWriter *AnnotationWriter;
76 SetVector<const Comdat *> Comdats;
77 UseListOrderStack UseListOrders;
80 /// Construct an AssemblyWriter with an external SlotTracker
81 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
82 const Module *M, AssemblyAnnotationWriter *AAW);
84 /// Construct an AssemblyWriter with an internally allocated SlotTracker
85 AssemblyWriter(formatted_raw_ostream &o, const Module *M,
86 AssemblyAnnotationWriter *AAW);
88 virtual ~AssemblyWriter();
90 void printMDNodeBody(const MDNode *MD);
91 void printNamedMDNode(const NamedMDNode *NMD);
93 void printModule(const Module *M);
95 void writeOperand(const Value *Op, bool PrintType);
96 void writeParamOperand(const Value *Operand, AttributeSet Attrs,unsigned Idx);
97 void writeAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope);
98 void writeAtomicCmpXchg(AtomicOrdering SuccessOrdering,
99 AtomicOrdering FailureOrdering,
100 SynchronizationScope SynchScope);
102 void writeAllMDNodes();
103 void writeMDNode(unsigned Slot, const MDNode *Node);
104 void writeAllAttributeGroups();
106 void printTypeIdentities();
107 void printGlobal(const GlobalVariable *GV);
108 void printAlias(const GlobalAlias *GV);
109 void printComdat(const Comdat *C);
110 void printFunction(const Function *F);
111 void printArgument(const Argument *FA, AttributeSet Attrs, unsigned Idx);
112 void printBasicBlock(const BasicBlock *BB);
113 void printInstructionLine(const Instruction &I);
114 void printInstruction(const Instruction &I);
116 void printUseListOrder(const UseListOrder &Order);
117 void printUseLists(const Function *F);
122 // printInfoComment - Print a little comment after the instruction indicating
123 // which slot it occupies.
124 void printInfoComment(const Value &V);