<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">If you are doing this work based off LLVM trunk, could you send me your patch to reproduce the problem?<div class=""><br class=""></div><div class="">-- adrian<br class=""><div><blockquote type="cite" class=""><div class="">On Jun 15, 2017, at 8:31 AM, Matthias Bernad via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hi!<div class=""><br class=""></div><div class="">We are currently working on a science project and implemented a FunctionPass that clones a function (more precisely a constructor of a struct/class) and adds a parameter.</div><div class=""><br class=""></div><div class="">First, we create a new function with a new function type, which includes the newly added parameter:</div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class="">Function *NF = Function::Create(NewFTy, F.getLinkage(), F.getName() + "Cloned", F.getParent());</div></blockquote><div class=""><br class=""></div><div class="">and after setting up the ValueToValueMapTy, we use the CloneFunctionInto method to clone the function body</div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">CloneFunctionInto(NF, &F, Map, true, Returns, "Cloned");</div></div></blockquote><div class=""><br class=""></div><div class="">The code seems to work as intended, but when we try to emit debug symbols (clang -g flag) the pass fails with following message:<br class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class="">"All DICompileUnits must be listed in <a href="http://llvm.dbg.cu/" class="">llvm.dbg.cu</a>"</div></blockquote><div class=""><br class=""></div><div class="">Nevertheless, we can dump the Module and therefore can print out the annotated IR.</div><div class=""><br class=""></div><div class="">This is what the function to be cloned looks like:</div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">; Function Attrs: noinline nounwind uwtable</div></div><div class=""><div class="">define linkonce_odr void @_ZN12MyFunnyClassC2Ev(%struct.MyFunnyClass* %this) unnamed_addr #4 comdat align 2 !dbg !46 {</div></div><div class=""><div class="">entry:</div></div><div class=""><div class="">  %this.addr = alloca %struct.MyFunnyClass*, align 8</div></div><div class=""><div class="">  store %struct.MyFunnyClass* %this, %struct.MyFunnyClass** %this.addr, align 8</div></div><div class=""><div class="">  call void @llvm.dbg.declare(metadata %struct.MyFunnyClass** %this.addr, metadata !49, metadata !31), !dbg !50</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">... rest of function code</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">}</div></div><div class=""><br class=""></div><div class=""><div class="">!46 = distinct !DISubprogram(name: "MyFunnyClass", linkageName: "_ZN12MyFunnyClassC2Ev", scope: !15, file: !1, line: 1, type: !25, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false, unit: !0, declaration: !47, variables: !2)</div></div></blockquote><div class=""><br class=""></div><div class="">and the cloned function:</div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">; Function Attrs: noinline nounwind uwtable</div></div><div class=""><div class="">define linkonce_odr void @_ZN12MyFunnyClassC2EvCloned(%struct.MyFunnyClass* %this, { [6 x i8*] }* %newparam) unnamed_addr #4 align 2 !dbg !73 {</div></div><div class=""><div class="">entry:</div></div><div class=""><div class="">  %this.addr = alloca %struct.MyFunnyClass*, align 8</div></div><div class=""><div class="">  store %struct.MyFunnyClass* %this, %struct.MyFunnyClass** %this.addr, align 8</div></div><div class=""><div class="">  call void @llvm.dbg.declare(metadata %struct.MyFunnyClass** %this.addr, metadata !89, metadata !31), !dbg !91</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">... rest of function code</div></div></blockquote><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">}<br class=""></div></div><div class=""><br class=""></div><div class=""><div class="">!73 = distinct !DISubprogram(name: "MyFunnyClass", linkageName: "_ZN12MyFunnyClassC2Ev", scope: !74, file: !1, line: 1, type: !81, isLocal: false, isDefinition: true, scopeLine: 1, flags: DIFlagArtificial | DIFlagPrototyped, isOptimized: false, unit: !87, declaration: !88, variables: !2)</div></div><div class=""><br class=""></div></blockquote>So the cloned function gets annotated with debug symbols as expected. We noticed that the linkageName of the cloned function is the same as the original one's. Could that cause the error mentioned above? If so, how can we fix that error?<div class=""><br class=""></div><div class="">Best regards and thanks in advance,</div><div class="">Matthias</div></div>
_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></div></blockquote></div><br class=""></div></body></html>