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

Reply via email to