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 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 //LLVM_IR_ASMWRITER_H 125