<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55469>55469</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[CloneModule] CloneModule doesn't copy IFunc keeping reference to original Module
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
darkness-ai
</td>
</tr>
</table>
<pre>
Example Minimal Module With IFunc
```
@bar = internal ifunc void (), bitcast (void ()* ()* @bar_resolve to void ()* ()*)
define internal void ()* @bar_resolve() {
ret void ()* null
}
define internal i32 @bar2() {
call void @bar()
ret i32 0
}
```
When running CloneModule and then ModuleVerify on both the source and target module the call inside of bar2 still points to the ifunc in the original module.
>From looking into CloneModule it seems IFuncs are missing support completely during the Clone.
Test Code around module from before:
```
LLVMContext Context;
SMDiagnostic Error;
auto ImplModule = parseAssemblyString(ImplAssembly, Error, Context);
EXPECT_TRUE(ImplModule != nullptr);
ImplModule->setModuleIdentifier("IFuncTestSource");
EXPECT_FALSE(verifyModule(*ImplModule, &errs()));
auto NewM = llvm::CloneModule(*ImplModule);
EXPECT_TRUE(NewM != nullptr);
// Reverify the source module and new module after the clone.
NewM->setModuleIdentifier("IFuncTestClone");
EXPECT_FALSE(verifyModule(*ImplModule, &errs()));
EXPECT_FALSE(verifyModule(*NewM, &errs()));
```
Result:
```
Global is referenced in a different module!
void ()* ()* @bar_resolve
; ModuleID = '**IFuncTestSource**'
call void @bar()
i32 ()* @bar2
; ModuleID = '**IFuncTestClone**'
/llvm/unittests/Transforms/Utils/CloningTest.cpp:1005: Failure
Value of: verifyModule(*ImplModule, &errs())
Actual: true
Expected: false
Referencing global in another module!
call void @bar()
; ModuleID = '**IFuncTestClone**'
void ()* @bar
; ModuleID = '**IFuncTestSource**'
/llvm/unittests/Transforms/Utils/CloningTest.cpp:1006: Failure
Value of: verifyModule(*NewM, &errs())
Actual: true
Expected: false
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1Vllv2zgQ_jXyCxFDpnzUD35wfCwCxItFkqb7VlDWyGFDkQJJpfG_3xlSPpM0yRY1BNE85vq-maFyU2wni2dR1QrYSmpZCcVWpmhw-k36B3a1bPQ6SedJOk2GafuEKcNf0k9zYVmSzZnUHqxGaVmiBHsysmAJ_5LwccJnLJd-LZynlZOd6fG_oOy7BWfUEzBv2FtH6R1d2ntSQCk1HLw4Fz3RHddZMro8KGDMgj8X041SR9GO5u-ZlRlvbfHXjayF2jkXjrW2ztwgNelrhs8oiMO3B9DMNlpLvWEzZTS0DApdME-bcX4PVpZbZjTLDVKLO8yZxq7bg8Ju0HQVRWkz-Cq1kwUwUzIKijkvcbE2GLEjiuhcZFzqMDFWbiRBERV1jxFbWlMxZcwjOYoazIm30jMHULmYc44JC6ySztFh19S1sZ6tDWWqB7VlRWNph2wGLd0TTNrhDjDpZgYDENY0GGUbXkme5FAaC0k2fRXc6-v71cwgsc-kIYxJ1nJ5u5pLsdEG0VizhbXG7rfiWzQY3BX62sZGFVIL62DqHFS52t568h7Zp0O7RaqUqA3_7Gxidux0L_79ZzG7-35383XRSu7U8x5ZoHStvT0Wie_D0YskWzjwcXJVgPaylBDTkAfgCbLbkBa48or15fT6lsw_hWyKioL4kRXyP-FDsNbtimn80qsA0t_wcxXgUeqpIi6y6VFSvFT8FhpRzzs4JHyJD7uB6PxxCVSHktHwcz8tsbBjMRzlGNn6GJAhlD-H47uqyNN3yTjN-_i-Adco_1Zt_KVMTt3OYbcqwYJeQ0ENQLBClmFh10iIkSDywbbfmssu2551NQ_JkfBR6PvTFyk6Dc9o1yx_1V9Dcz6zyz9ssKXyxB4mU0hbjoek93gKIV7eWaEdtpaKJl-xYdJI4ljxpKm7rmtEtpemAxzYUkjV2Dbye6Ea6ra08enMaDGYrn0jFGnwtmn1Lp5rWHsoaLUUysGO5kgfddJNSyrSqPF-wLw_o_DX6P5PCF-9qH8vC36XleEnWXmzyD7Px77OOsUkK8bZWHS89AomyeDyuC0O5idXZ2HAaYyfLsh6Gy9Q9ghQE6_7EqX7en89R8lOY9XkwfvaUamH7rjBz74m7-JNe8CRhovamh_oM07xUm6A4BsM-sNx52EyKPPRl6xfjkXJy7wvyjTPe2LMIeuVvOBZR4kclKMosBlSfw0qqDEO5h054Snn6aA3SId93h93YQBlkQ5HfJj1xpD1MSmgQj665EfX2E3HToJLebNxuKkkUnzYFPjNsNEQQCP9eM88GDsphH3U4NyFkJ1gfhLc_w-FwUwk">