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 25namespace llvm { 26 27class BasicBlock; 28class Function; 29class GlobalValue; 30class Comdat; 31class Module; 32class NamedMDNode; 33class Value; 34class SlotTracker; 35 36/// Create a new SlotTracker for a Module 37SlotTracker *createSlotTracker(const Module *M); 38 39//===----------------------------------------------------------------------===// 40// TypePrinting Class: Type printing machinery 41//===----------------------------------------------------------------------===// 42 43class TypePrinting { 44 TypePrinting(const TypePrinting &) LLVM_DELETED_FUNCTION; 45 void operator=(const TypePrinting&) LLVM_DELETED_FUNCTION; 46public: 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 65class AssemblyWriter { 66protected: 67 formatted_raw_ostream &Out; 68 const Module *TheModule; 69 70private: 71 std::unique_ptr<SlotTracker> ModuleSlotTracker; 72 SlotTracker &Machine; 73 TypePrinting TypePrinter; 74 AssemblyAnnotationWriter *AnnotationWriter; 75 SetVector<const Comdat *> Comdats; 76 77public: 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 114private: 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