Home | History | Annotate | Download | only in IR
      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