| Issue |
55469
|
| Summary |
[CloneModule] CloneModule doesn't copy IFunc keeping reference to original Module
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
darkness-ai
|
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
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs