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