diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2022-11-22 14:53:43 -0500 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2022-11-23 12:22:06 -0500 |
commit | f0693277c7cbe982bcfa5d1a8a9540807f6ec314 (patch) | |
tree | f1d58ca3c209cfdabc87c38a17a13ac42d87f99a /llvm/lib/Transforms/Utils/CloneModule.cpp | |
parent | 10eda33a5f15a55eafcf8db36efe5d7eb6a97fa1 (diff) | |
download | llvm-f0693277c7cbe982bcfa5d1a8a9540807f6ec314.zip llvm-f0693277c7cbe982bcfa5d1a8a9540807f6ec314.tar.gz llvm-f0693277c7cbe982bcfa5d1a8a9540807f6ec314.tar.bz2 |
CloneModule: Handling cloning ifuncs
This is tested in a future llvm-reduce patch.
Diffstat (limited to 'llvm/lib/Transforms/Utils/CloneModule.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/CloneModule.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneModule.cpp b/llvm/lib/Transforms/Utils/CloneModule.cpp index 55cda0f..55e0512 100644 --- a/llvm/lib/Transforms/Utils/CloneModule.cpp +++ b/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()); |