Index: llvm/lib/Transforms/Utils/CloneModule.cpp =================================================================== --- llvm/lib/Transforms/Utils/CloneModule.cpp +++ llvm/lib/Transforms/Utils/CloneModule.cpp @@ -109,6 +109,15 @@ 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 @@ GA->setAliasee(MapValue(C, VMap)); } + for (const GlobalIFunc &I : M.ifuncs()) { + GlobalIFunc *GI = cast(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());