diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Linker/IRMover.h | 6 | ||||
| -rw-r--r-- | llvm/lib/Linker/IRMover.cpp | 19 |
2 files changed, 20 insertions, 5 deletions
diff --git a/llvm/include/llvm/Linker/IRMover.h b/llvm/include/llvm/Linker/IRMover.h index 63e86f01b57..a1a2d5068bf 100644 --- a/llvm/include/llvm/Linker/IRMover.h +++ b/llvm/include/llvm/Linker/IRMover.h @@ -16,8 +16,10 @@ namespace llvm { class GlobalValue; +class Metadata; class Module; class StructType; +class TrackingMDRef; class Type; class IRMover { @@ -38,6 +40,9 @@ class IRMover { static bool isEqual(const StructType *LHS, const StructType *RHS); }; + /// Type of the Metadata map in \a ValueToValueMapTy. + typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; + public: class IdentifiedStructTypeSet { // The set of opaque types is the composite module. @@ -74,6 +79,7 @@ public: private: Module &Composite; IdentifiedStructTypeSet IdentifiedStructTypes; + MDMapT SharedMDs; ///< A Metadata map to use for all calls to \a move(). }; } // End llvm namespace diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 02fe58d2cc5..5b52ea8106e 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -362,6 +362,9 @@ public: void materializeInitFor(GlobalValue *New, GlobalValue *Old) override; }; +/// Type of the Metadata map in \a ValueToValueMapTy. +typedef DenseMap<const Metadata *, TrackingMDRef> MDMapT; + /// This is responsible for keeping track of the state used for moving data /// from SrcM to DstM. class IRLinker { @@ -375,6 +378,9 @@ class IRLinker { GlobalValueMaterializer GValMaterializer; LocalValueMaterializer LValMaterializer; + /// A metadata map that's shared between IRLinker instances. + MDMapT &SharedMDs; + /// Mapping of values from what they used to be in Src, to what they are now /// in DstM. ValueToValueMapTy is a ValueMap, which involves some overhead /// due to the use of Value handles which the Linker doesn't actually need, @@ -467,18 +473,21 @@ class IRLinker { void linkNamedMDNodes(); public: - IRLinker(Module &DstM, IRMover::IdentifiedStructTypeSet &Set, - std::unique_ptr<Module> SrcM, ArrayRef<GlobalValue *> ValuesToLink, + IRLinker(Module &DstM, MDMapT &SharedMDs, + IRMover::IdentifiedStructTypeSet &Set, std::unique_ptr<Module> SrcM, + ArrayRef<GlobalValue *> ValuesToLink, std::function<void(GlobalValue &, IRMover::ValueAdder)> AddLazyFor) : DstM(DstM), SrcM(std::move(SrcM)), AddLazyFor(AddLazyFor), TypeMap(Set), - GValMaterializer(*this), LValMaterializer(*this), + GValMaterializer(*this), LValMaterializer(*this), SharedMDs(SharedMDs), Mapper(ValueMap, RF_MoveDistinctMDs | RF_IgnoreMissingLocals, &TypeMap, &GValMaterializer), AliasMCID(Mapper.registerAlternateMappingContext(AliasValueMap, &LValMaterializer)) { + ValueMap.MD().swap(SharedMDs); for (GlobalValue *GV : ValuesToLink) maybeAdd(GV); } + ~IRLinker() { ValueMap.MD().swap(SharedMDs); } bool run(); Value *materializeDeclFor(Value *V, bool ForAlias); @@ -1350,8 +1359,8 @@ IRMover::IRMover(Module &M) : Composite(M) { bool IRMover::move( std::unique_ptr<Module> Src, ArrayRef<GlobalValue *> ValuesToLink, std::function<void(GlobalValue &, ValueAdder Add)> AddLazyFor) { - IRLinker TheIRLinker(Composite, IdentifiedStructTypes, std::move(Src), - ValuesToLink, AddLazyFor); + IRLinker TheIRLinker(Composite, SharedMDs, IdentifiedStructTypes, + std::move(Src), ValuesToLink, AddLazyFor); bool RetCode = TheIRLinker.run(); Composite.dropTriviallyDeadConstantArrays(); return RetCode; |

