Oleg Pliss via llvm-dev
2019-Jun-28 00:31 UTC
[llvm-dev] CloneFunctionInto of a function with debug info to a different module
Hello, 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. The source code is as follows: // 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())); } The result is: 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 Is this a bug or an unintended use of CloneFunctionInt? What is the right way to clone a function to a different module? Thanks, -Oleg -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190627/82d11bc0/attachment.html>