<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">