diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/Utils/CloneModule.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/Utils/CloneModule.cpp | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/contrib/llvm-project/llvm/lib/Transforms/Utils/CloneModule.cpp b/contrib/llvm-project/llvm/lib/Transforms/Utils/CloneModule.cpp index 55cda0f11e47..55e051298a9a 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/Utils/CloneModule.cpp @@ -109,6 +109,15 @@ std::unique_ptr<Module> llvm::CloneModule(      VMap[&I] = GA;    } +  for (const GlobalIFunc &I : M.ifuncs()) { +    // Defer setting the resolver function until after functions are cloned. +    auto *GI = +        GlobalIFunc::create(I.getValueType(), I.getAddressSpace(), +                            I.getLinkage(), I.getName(), nullptr, New.get()); +    GI->copyAttributesFrom(&I); +    VMap[&I] = GI; +  } +    // Now that all of the things that global variable initializer can refer to    // have been created, loop through and copy the global variable referrers    // over...  We also set the attributes on the global now. @@ -184,6 +193,12 @@ std::unique_ptr<Module> llvm::CloneModule(        GA->setAliasee(MapValue(C, VMap));    } +  for (const GlobalIFunc &I : M.ifuncs()) { +    GlobalIFunc *GI = cast<GlobalIFunc>(VMap[&I]); +    if (const Constant *Resolver = I.getResolver()) +      GI->setResolver(MapValue(Resolver, VMap)); +  } +    // And named metadata....    for (const NamedMDNode &NMD : M.named_metadata()) {      NamedMDNode *NewNMD = New->getOrInsertNamedMetadata(NMD.getName()); | 
