1 //===- IRMover.h ------------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_LINKER_IRMOVER_H 10 #define LLVM_LINKER_IRMOVER_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/DenseSet.h" 14 #include <functional> 15 16 namespace llvm { 17 class Error; 18 class GlobalValue; 19 class Metadata; 20 class Module; 21 class StructType; 22 class TrackingMDRef; 23 class Type; 24 25 class IRMover { 26 struct StructTypeKeyInfo { 27 struct KeyTy { 28 ArrayRef<Type *> ETypes; 29 bool IsPacked; 30 KeyTy(ArrayRef<Type *> E, bool P); 31 KeyTy(const StructType *ST); 32 bool operator==(const KeyTy &that) const; 33 bool operator!=(const KeyTy &that) const; 34 }; 35 static StructType *getEmptyKey(); 36 static StructType *getTombstoneKey(); 37 static unsigned getHashValue(const KeyTy &Key); 38 static unsigned getHashValue(const StructType *ST); 39 static bool isEqual(const KeyTy &LHS, const StructType *RHS); 40 static bool isEqual(const StructType *LHS, const StructType *RHS); 41 }; 42 43 /// Type of the Metadata map in \a ValueToValueMapTy. 44 typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; 45 46 public: 47 class IdentifiedStructTypeSet { 48 // The set of opaque types is the composite module. 49 DenseSet<StructType *> OpaqueStructTypes; 50 51 // The set of identified but non opaque structures in the composite module. 52 DenseSet<StructType *, StructTypeKeyInfo> NonOpaqueStructTypes; 53 54 public: 55 void addNonOpaque(StructType *Ty); 56 void switchToNonOpaque(StructType *Ty); 57 void addOpaque(StructType *Ty); 58 StructType *findNonOpaque(ArrayRef<Type *> ETypes, bool IsPacked); 59 bool hasType(StructType *Ty); 60 }; 61 62 IRMover(Module &M); 63 64 typedef std::function<void(GlobalValue &)> ValueAdder; 65 66 /// Move in the provide values in \p ValuesToLink from \p Src. 67 /// 68 /// - \p AddLazyFor is a call back that the IRMover will call when a global 69 /// value is referenced by one of the ValuesToLink (transitively) but was 70 /// not present in ValuesToLink. The GlobalValue and a ValueAdder callback 71 /// are passed as an argument, and the callback is expected to be called 72 /// if the GlobalValue needs to be added to the \p ValuesToLink and linked. 73 /// - \p IsPerformingImport is true when this IR link is to perform ThinLTO 74 /// function importing from Src. 75 Error move(std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink, 76 std::function<void(GlobalValue &GV, ValueAdder Add)> AddLazyFor, 77 bool IsPerformingImport); 78 Module &getModule() { return Composite; } 79 80 private: 81 Module &Composite; 82 IdentifiedStructTypeSet IdentifiedStructTypes; 83 MDMapT SharedMDs; ///< A Metadata map to use for all calls to \a move(). 84 }; 85 86 } // End llvm namespace 87 88 #endif 89