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/OwningPtr.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 Module; 31 class NamedMDNode; 32 class Value; 33 class SlotTracker; 34 35 /// Create a new SlotTracker for a Module 36 SlotTracker *createSlotTracker(const Module *M); 37 38 //===----------------------------------------------------------------------===// 39 // TypePrinting Class: Type printing machinery 40 //===----------------------------------------------------------------------===// 41 42 class TypePrinting { 43 TypePrinting(const TypePrinting &) LLVM_DELETED_FUNCTION; 44 void operator=(const TypePrinting&) LLVM_DELETED_FUNCTION; 45 public: 46 47 /// NamedTypes - The named types that are used by the current module. 48 TypeFinder NamedTypes; 49 50 /// NumberedTypes - The numbered types, along with their value. 51 DenseMap<StructType*, unsigned> NumberedTypes; 52 53 54 TypePrinting() {} 55 ~TypePrinting() {} 56 57 void incorporateTypes(const Module &M); 58 59 void print(Type *Ty, raw_ostream &OS); 60 61 void printStructBody(StructType *Ty, raw_ostream &OS); 62 }; 63 64 class AssemblyWriter { 65 protected: 66 formatted_raw_ostream &Out; 67 const Module *TheModule; 68 69 private: 70 OwningPtr<SlotTracker> ModuleSlotTracker; 71 SlotTracker &Machine; 72 TypePrinting TypePrinter; 73 AssemblyAnnotationWriter *AnnotationWriter; 74 75 public: 76 /// Construct an AssemblyWriter with an external SlotTracker 77 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac, 78 const Module *M, AssemblyAnnotationWriter *AAW); 79 80 /// Construct an AssemblyWriter with an internally allocated SlotTracker 81 AssemblyWriter(formatted_raw_ostream &o, const Module *M, 82 AssemblyAnnotationWriter *AAW); 83 84 virtual ~AssemblyWriter(); 85 86 void printMDNodeBody(const MDNode *MD); 87 void printNamedMDNode(const NamedMDNode *NMD); 88 89 void printModule(const Module *M); 90 91 void writeOperand(const Value *Op, bool PrintType); 92 void writeParamOperand(const Value *Operand, AttributeSet Attrs,unsigned Idx); 93 void writeAtomic(AtomicOrdering Ordering, SynchronizationScope SynchScope); 94 95 void writeAllMDNodes(); 96 void writeMDNode(unsigned Slot, const MDNode *Node); 97 void writeAllAttributeGroups(); 98 99 void printTypeIdentities(); 100 void printGlobal(const GlobalVariable *GV); 101 void printAlias(const GlobalAlias *GV); 102 void printFunction(const Function *F); 103 void printArgument(const Argument *FA, AttributeSet Attrs, unsigned Idx); 104 void printBasicBlock(const BasicBlock *BB); 105 void printInstructionLine(const Instruction &I); 106 void printInstruction(const Instruction &I); 107 108 private: 109 void init(); 110 111 // printInfoComment - Print a little comment after the instruction indicating 112 // which slot it occupies. 113 void printInfoComment(const Value &V); 114 }; 115 116 } // namespace llvm 117 118 #endif //LLVM_IR_ASMWRITER_H 119