<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>Hello,</p>
<p>I use CloneFunctionInto to clone a function from one module to a
function declaration in other module. When the original function
contains debug info, the clone fails verification.</p>
<p>The source code is as follows:<br>
</p>
<pre>// Helper routine wrapping CloneFunctionInto.
static void CloneFuncIntoDecl(Function *NewFunc, Function *OldFunc,
ValueToValueMapTy &VMap) {
auto InjectionArgIt = OldFunc->arg_begin();
auto ExistingArgIt = NewFunc->arg_begin();
while (ExistingArgIt != NewFunc->arg_end())
VMap[&*InjectionArgIt++] = &*ExistingArgIt++;
SmallVector<ReturnInst *, 8> Returns;
CloneFunctionInto(NewFunc, OldFunc, VMap, true, Returns);
}
TEST(CloneFunction, ToDifferentModule) {
StringRef Assembly1 = R"(
define void @foo() {
ret void, !dbg !5
}
!llvm.module.flags = !{!0}
!llvm.dbg.cu = !{!2}
!0 = !{i32 1, !"Debug Info Version", i32 3}
!1 = distinct !DISubprogram(unit: !2)
!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3)
!3 = !DIFile(filename: "foo.c", directory: "/tmp")
!4 = distinct !DISubprogram(unit: !2)
!5 = !DILocation(line: 4, scope: !1)
)";
StringRef Assembly2 = R"(
declare void @foo()
)";
LLVMContext Context;
SMDiagnostic Error;
auto M1 = parseAssemblyString(Assembly1, Error, Context);
auto* F1 = M1->getFunction("foo");
EXPECT_TRUE(F1 != nullptr);
auto M2 = parseAssemblyString(Assembly2, Error, Context);
auto* F2 = M2->getFunction("foo");
EXPECT_TRUE(F2 != nullptr);
ValueToValueMapTy VMap;
VMap[F1] = F2;
::CloneFuncIntoDecl(F2, F1, VMap);
EXPECT_FALSE(verifyModule(*M1, &errs()));
EXPECT_FALSE(verifyModule(*M2, &errs()));
}
</pre>
<p>The result is:</p>
<pre>DICompileUnit not listed in llvm.dbg.cu
!2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, isOptimized: false, runtimeVersion: 0, emissionKind: NoDebug)
/local/opliss/dolphin-llvm/unittests/Transforms/Utils/CloningTest.cpp:617: Failure
Value of: verifyModule(*M2, &errs())
Actual: true
Expected: false
</pre>
<p>Is this a bug or an unintended use of CloneFunctionInt? What is
the right way to clone a function to a different module?</p>
<p>Thanks,</p>
-Oleg
</body>
</html>