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 Error; 19 class GlobalValue; 20 class Metadata; 21 class Module; 22 class StructType; 23 class TrackingMDRef; 24 class Type; 25 26 class IRMover { 27 struct StructTypeKeyInfo { 28 struct KeyTy { 29 ArrayRef<Type *> ETypes; 30 bool IsPacked; 31 KeyTy(ArrayRef<Type *> E, bool P); 32 KeyTy(const StructType *ST); 33 bool operator==(const KeyTy &that) const; 34 bool operator!=(const KeyTy &that) const; 35 }; 36 static StructType *getEmptyKey(); 37 static StructType *getTombstoneKey(); 38 static unsigned getHashValue(const KeyTy &Key); 39 static unsigned getHashValue(const StructType *ST); 40 static bool isEqual(const KeyTy &LHS, const StructType *RHS); 41 static bool isEqual(const StructType *LHS, const StructType *RHS); 42 }; 43 44 /// Type of the Metadata map in \a ValueToValueMapTy. 45 typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; 46 47 public: 48 class IdentifiedStructTypeSet { 49 // The set of opaque types is the composite module. 50 DenseSet<StructType *> OpaqueStructTypes; 51 52 // The set of identified but non opaque structures in the composite module. 53 DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes; 54 55 public: 56 void addNonOpaque(StructType *Ty); 57 void switchToNonOpaque(StructType *Ty); 58 void addOpaque(StructType *Ty); 59 StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked); 60 bool hasType(StructType *Ty); 61 }; 62 63 IRMover(Module &M); 64 65 typedef std::function<void(GlobalValue &)> ValueAdder; 66 67 /// Move in the provide values in \p ValuesToLink from \p Src. 68 /// 69 /// - \p AddLazyFor is a call back that the IRMover will call when a global 70 /// value is referenced by one of the ValuesToLink (transitively) but was 71 /// not present in ValuesToLink. The GlobalValue and a ValueAdder callback 72 /// are passed as an argument, and the callback is expected to be called 73 /// if the GlobalValue needs to be added to the \p ValuesToLink and linked. 74 Error move(std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink, 75 std::function<void(GlobalValue &GV, ValueAdder Add)> AddLazyFor); getModule()76 Module &getModule() { return Composite; } 77 78 private: 79 Module &Composite; 80 IdentifiedStructTypeSet IdentifiedStructTypes; 81 MDMapT SharedMDs; ///< A Metadata map to use for all calls to \a move(). 82 }; 83 84 } // End llvm namespace 85 86 #endif 87