<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 30, 2014 at 1:59 PM, Adrian Prantl <span dir="ltr"><<a href="mailto:aprantl@apple.com" target="_blank">aprantl@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5"><br>
> On Oct 30, 2014, at 1:20 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
><br>
> Author: dblaikie<br>
> Date: Thu Oct 30 15:20:11 2014<br>
> New Revision: 220923<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=220923&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=220923&view=rev</a><br>
> Log:<br>
> PR21408: Workaround the appearance of duplicate variables due to problems when inlining two calls to the same function from the same call site.<br>
><br>
> Added:<br>
>    llvm/trunk/test/DebugInfo/duplicate_inline.ll<br>
> Modified:<br>
>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp<br>
><br>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=220923&r1=220922&r2=220923&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp?rev=220923&r1=220922&r2=220923&view=diff</a><br>
> ==============================================================================<br>
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp (original)<br>
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfFile.cpp Thu Oct 30 15:20:11 2014<br>
> @@ -177,7 +177,12 @@ void DwarfFile::addScopeVariable(Lexical<br>
>       // A later indexed parameter has been found, insert immediately before it.<br>
>       if (CurNum > ArgNum)<br>
>         break;<br>
> -      assert(CurNum != ArgNum);<br>
> +      // FIXME: There are still some cases where two inlined functions are<br>
> +      // conflated together (two calls to the same function at the same<br>
> +      // location (eg: via a macro, or without column info, etc)) and then<br>
> +      // their arguments are conflated as well.<br>
> +      assert((LS->getParent() || CurNum != ArgNum) &&<br>
> +             "Missing parameter for top level (non-inlined) function”);<br>
<br>
</div></div>Shouldn’t the message be “duplicate argument top level (non-inlined) function”?<br></blockquote><div><br>Right you are. Fixed in 220967.<br><br>In theory 'parameter' is probably more correct than 'argument' here (I think that's how people use the terms - parameters are the generic things in the function definition/declaration, arguments are the concrete instances of those passed at call sites), but we've got a lot of 'argument' related stuff (arg_variable, arg number, etc) here already, so I'll just go with that.<br> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<span class=""><font color="#888888"><br>
-- adrian<br>
</font></span><div class=""><div class="h5"><br>
<br>
>       ++I;<br>
>     }<br>
>     Vars.insert(I, Var);<br>
><br>
> Added: llvm/trunk/test/DebugInfo/duplicate_inline.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/duplicate_inline.ll?rev=220923&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/duplicate_inline.ll?rev=220923&view=auto</a><br>
> ==============================================================================<br>
> --- llvm/trunk/test/DebugInfo/duplicate_inline.ll (added)<br>
> +++ llvm/trunk/test/DebugInfo/duplicate_inline.ll Thu Oct 30 15:20:11 2014<br>
> @@ -0,0 +1,117 @@<br>
> +; REQUIRES: object-emission<br>
> +<br>
> +; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump -debug-dump=info - | FileCheck %s<br>
> +<br>
> +; Built with clang from the following source:<br>
> +; void f1(int);<br>
> +; __attribute__((always_inline)) inline void f2(int i) { f1(i); }<br>
> +;<br>
> +; #define MULTICALL \<br>
> +;   f2(x);          \<br>
> +;   f2(y);<br>
> +;<br>
> +; void f3(int x, int y) { MULTICALL; }<br>
> +<br>
> +; FIXME: This produces only one inlined_subroutine, with two formal_parameters<br>
> +; (both named "this"), one for each of the actual inlined subroutines.  ;<br>
> +; Inlined scopes are differentiated by the combination of 'inlined at' (call)<br>
> +; location and the location within the function. If two calls to the same<br>
> +; function occur at the same location the scopes end up conflated and there<br>
> +; appears to be only one inlined function.<br>
> +; To fix this, we'd need to add some kind of unique metadata per call site, possibly something like:<br>
> +;<br>
> +; !42 = metadata !{i32 1, i32 0, metadata !43, metadata !44}<br>
> +; !44 = metadata !{i32 2, i32 0, metadata !45, null}<br>
> +;<br>
> +; -><br>
> +;<br>
> +; !42 = metadata !{i32 1, i32 0, metadata !43, metadata !44}<br>
> +; !44 = metadata !{metadata !45, metadata !44}<br>
> +; !45 = metadata !{i32 2, i32 0, metadata !45, null}<br>
> +;<br>
> +; since cycles in metadata are not uniqued, the !44 node would not be shared<br>
> +; between calls to the same function from the same location, ensuring separate<br>
> +; inlined subroutines would be generated.<br>
> +;<br>
> +; Once this is done, the (insufficient) hack in clang that adds column<br>
> +; information to call sites to differentiate inlined callers can be removed as it<br>
> +; will no longer be necessary.<br>
> +;<br>
> +; While it might be nice to omit the duplicate parameter in this case (while<br>
> +; we wait/work on the real fix), it's actually better to leave it in because it<br>
> +; allows us to hold the invariant that every DbgVariable has a DIE, every time.<br>
> +; This has proved valuable in finding other bugs, so I want to avoid removing the<br>
> +; invariant/assertion. Besides, we don't know which one's the right one anyway...<br>
> +<br>
> +; CHECK: DW_TAG_subprogram<br>
> +; CHECK:   DW_TAG_inlined_subroutine<br>
> +; CHECK:     DW_TAG_formal_parameter<br>
> +; CHECK-NOT: DW_TAG<br>
> +; CHECK:     DW_TAG_formal_parameter<br>
> +; CHECK-NOT: DW_TAG<br>
> +; CHECK:     NULL<br>
> +; CHECK-NOT: DW_TAG<br>
> +; CHECK:   NULL<br>
> +<br>
> +; Function Attrs: uwtable<br>
> +define void @_Z2f3ii(i32 %x, i32 %y) #0 {<br>
> +entry:<br>
> +  %i.addr.i1 = alloca i32, align 4<br>
> +  %i.addr.i = alloca i32, align 4<br>
> +  %x.addr = alloca i32, align 4<br>
> +  %y.addr = alloca i32, align 4<br>
> +  store i32 %x, i32* %x.addr, align 4<br>
> +  call void @llvm.dbg.declare(metadata !{i32* %x.addr}, metadata !15, metadata !16), !dbg !17<br>
> +  store i32 %y, i32* %y.addr, align 4<br>
> +  call void @llvm.dbg.declare(metadata !{i32* %y.addr}, metadata !18, metadata !16), !dbg !19<br>
> +  %0 = load i32* %x.addr, align 4, !dbg !20<br>
> +  store i32 %0, i32* %i.addr.i, align 4, !dbg !20<br>
> +  call void @llvm.dbg.declare(metadata !{i32* %i.addr.i}, metadata !21, metadata !16), !dbg !22<br>
> +  %1 = load i32* %i.addr.i, align 4, !dbg !23<br>
> +  call void @_Z2f1i(i32 %1), !dbg !23<br>
> +  %2 = load i32* %y.addr, align 4, !dbg !20<br>
> +  store i32 %2, i32* %i.addr.i1, align 4, !dbg !20<br>
> +  call void @llvm.dbg.declare(metadata !{i32* %i.addr.i1}, metadata !21, metadata !16), !dbg !22<br>
> +  %3 = load i32* %i.addr.i1, align 4, !dbg !23<br>
> +  call void @_Z2f1i(i32 %3), !dbg !23<br>
> +  ret void, !dbg !24<br>
> +}<br>
> +<br>
> +; Function Attrs: nounwind readnone<br>
> +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1<br>
> +<br>
> +declare void @_Z2f1i(i32) #2<br>
> +<br>
> +attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }<br>
> +attributes #1 = { nounwind readnone }<br>
> +attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }<br>
> +<br>
> +!<a href="http://llvm.dbg.cu" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
> +!llvm.module.flags = !{!12, !13}<br>
> +!llvm.ident = !{!14}<br>
> +<br>
> +!0 = metadata !{metadata !"0x11\004\00clang version 3.6.0 \000\00\000\00\001", metadata !1, metadata !2, metadata !2, metadata !3, metadata !2, metadata !2} ; [ DW_TAG_compile_unit ] [/tmp/dbginfo/duplicate_inline.cpp] [DW_LANG_C_plus_plus]<br>
> +!1 = metadata !{metadata !"duplicate_inline.cpp", metadata !"/tmp/dbginfo"}<br>
> +!2 = metadata !{}<br>
> +!3 = metadata !{metadata !4, metadata !9}<br>
> +!4 = metadata !{metadata !"0x2e\00f3\00f3\00_Z2f3ii\008\000\001\000\000\00256\000\008", metadata !1, metadata !5, metadata !6, null, void (i32, i32)* @_Z2f3ii, null, null, metadata !2} ; [ DW_TAG_subprogram ] [line 8] [def] [f3]<br>
> +!5 = metadata !{metadata !"0x29", metadata !1}    ; [ DW_TAG_file_type ] [/tmp/dbginfo/duplicate_inline.cpp]<br>
> +!6 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !7, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]<br>
> +!7 = metadata !{null, metadata !8, metadata !8}<br>
> +!8 = metadata !{metadata !"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [int] [line 0, size 32, align 32, offset 0, enc DW_ATE_signed]<br>
> +!9 = metadata !{metadata !"0x2e\00f2\00f2\00_Z2f2i\002\000\001\000\000\00256\000\002", metadata !1, metadata !5, metadata !10, null, null, null, null, metadata !2} ; [ DW_TAG_subprogram ] [line 2] [def] [f2]<br>
> +!10 = metadata !{metadata !"0x15\00\000\000\000\000\000\000", null, null, null, metadata !11, null, null, null} ; [ DW_TAG_subroutine_type ] [line 0, size 0, align 0, offset 0] [from ]<br>
> +!11 = metadata !{null, metadata !8}<br>
> +!12 = metadata !{i32 2, metadata !"Dwarf Version", i32 4}<br>
> +!13 = metadata !{i32 2, metadata !"Debug Info Version", i32 2}<br>
> +!14 = metadata !{metadata !"clang version 3.6.0 "}<br>
> +!15 = metadata !{metadata !"0x101\00x\0016777224\000", metadata !4, metadata !5, metadata !8} ; [ DW_TAG_arg_variable ] [x] [line 8]<br>
> +!16 = metadata !{metadata !"0x102"}               ; [ DW_TAG_expression ]<br>
> +!17 = metadata !{i32 8, i32 13, metadata !4, null}<br>
> +!18 = metadata !{metadata !"0x101\00y\0033554440\000", metadata !4, metadata !5, metadata !8} ; [ DW_TAG_arg_variable ] [y] [line 8]<br>
> +!19 = metadata !{i32 8, i32 20, metadata !4, null}<br>
> +!20 = metadata !{i32 8, i32 25, metadata !4, null}<br>
> +!21 = metadata !{metadata !"0x101\00i\0016777218\000", metadata !9, metadata !5, metadata !8} ; [ DW_TAG_arg_variable ] [i] [line 2]<br>
> +!22 = metadata !{i32 2, i32 51, metadata !9, metadata !20}<br>
> +!23 = metadata !{i32 2, i32 56, metadata !9, metadata !20}<br>
> +!24 = metadata !{i32 8, i32 36, metadata !4, null}<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
</div></div></blockquote></div><br></div></div>