Home | History | Annotate | Download | only in Linker
      1 //===- IRMover.h ------------------------------------------------*- 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 #ifndef LLVM_LINKER_IRMOVER_H
     11 #define LLVM_LINKER_IRMOVER_H
     12 
     13 #include "llvm/ADT/ArrayRef.h"
     14 #include "llvm/ADT/DenseSet.h"
     15 #include <functional>
     16 
     17 namespace llvm {
     18 class GlobalValue;
     19 class MDNode;
     20 class Module;
     21 class StructType;
     22 class Type;
     23 
     24 class IRMover {
     25   struct StructTypeKeyInfo {
     26     struct KeyTy {
     27       ArrayRef<Type *> ETypes;
     28       bool IsPacked;
     29       KeyTy(ArrayRef<Type *> E, bool P);
     30       KeyTy(const StructType *ST);
     31       bool operator==(const KeyTy &that) const;
     32       bool operator!=(const KeyTy &that) const;
     33     };
     34     static StructType *getEmptyKey();
     35     static StructType *getTombstoneKey();
     36     static unsigned getHashValue(const KeyTy &Key);
     37     static unsigned getHashValue(const StructType *ST);
     38     static bool isEqual(const KeyTy &LHS, const StructType *RHS);
     39     static bool isEqual(const StructType *LHS, const StructType *RHS);
     40   };
     41 
     42 public:
     43   class IdentifiedStructTypeSet {
     44     // The set of opaque types is the composite module.
     45     DenseSet<StructType *> OpaqueStructTypes;
     46 
     47     // The set of identified but non opaque structures in the composite module.
     48     DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes;
     49 
     50   public:
     51     void addNonOpaque(StructType *Ty);
     52     void switchToNonOpaque(StructType *Ty);
     53     void addOpaque(StructType *Ty);
     54     StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked);
     55     bool hasType(StructType *Ty);
     56   };
     57 
     58   IRMover(Module &M);
     59 
     60   typedef std::function<void(GlobalValue &)> ValueAdder;
     61   /// Move in the provide values. The source is destroyed.
     62   /// Returns true on error.
     63   bool move(Module &Src, ArrayRef<GlobalValue *> ValuesToLink,
     64             std::function<void(GlobalValue &GV, ValueAdder Add)> AddLazyFor,
     65             DenseMap<unsigned, MDNode *> *ValIDToTempMDMap = nullptr,
     66             bool IsMetadataLinkingPostpass = false);
     67   Module &getModule() { return Composite; }
     68 
     69 private:
     70   Module &Composite;
     71   IdentifiedStructTypeSet IdentifiedStructTypes;
     72 };
     73 
     74 } // End llvm namespace
     75 
     76 #endif
     77