<div dir="ltr">Ah, right right - all the different side tables & paths... thanks for the reminders!</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Mar 22, 2017 at 10:24 AM Adrian Prantl <<a href="mailto:aprantl@apple.com">aprantl@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Mar 22, 2017, at 10:22 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:</div><br class="m_1454624326413346858Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Wed, Mar 22, 2017 at 10:18 AM Adrian Prantl <<a href="mailto:aprantl@apple.com" class="gmail_msg" target="_blank">aprantl@apple.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br class="gmail_msg">> On Mar 22, 2017, at 10:17 AM, Adrian Prantl <<a href="mailto:aprantl@apple.com" class="gmail_msg" target="_blank">aprantl@apple.com</a>> wrote:<br class="gmail_msg">><br class="gmail_msg">><br class="gmail_msg">>> On Mar 22, 2017, at 10:12 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="gmail_msg" target="_blank">dblaikie@gmail.com</a>> wrote:<br class="gmail_msg">>><br class="gmail_msg">>> Does this meet the bar for "if the verifier accepts it LLVM should do something sensible with it" - seems like this might not be checked by the verifier? I guess this would only happen if the IR described a whole (not fragmented) variable as being in two different parts of the stack at different portions of the function. I doubt current Clang/LLVM produce anything like that, but it's conceivable and certainly possible to artificially construct such a case, I would think?<br class="gmail_msg">><br class="gmail_msg">> In my understanding this situation is impossible, because the only way we get an FI expression is if it was in the MMI side table and the code for adding additional FI entries to a DbgVariable already has a similar assertion.<br class="gmail_msg">><br class="gmail_msg">>  void addMMIEntry(const DbgVariable &V) {<br class="gmail_msg">>    assert(DebugLocListIndex == ~0U && !MInsn && "not an MMI entry");<br class="gmail_msg">>    assert(V.DebugLocListIndex == ~0U && !V.MInsn && "not an MMI entry");<br class="gmail_msg">>    assert(V.Var == Var && "conflicting variable");<br class="gmail_msg">>    assert(V.IA == IA && "conflicting inlined-at location");<br class="gmail_msg">><br class="gmail_msg">>    assert(!FrameIndexExprs.empty() && "Expected an MMI entry");<br class="gmail_msg">>    assert(!V.FrameIndexExprs.empty() && "Expected an MMI entry");<br class="gmail_msg">><br class="gmail_msg">>    FrameIndexExprs.append(V.FrameIndexExprs.begin(), V.FrameIndexExprs.end());<br class="gmail_msg">>    assert(all_of(FrameIndexExprs,<br class="gmail_msg">>                  [](FrameIndexExpr &FIE) {<br class="gmail_msg">>                    return FIE.Expr && FIE.Expr->isFragment();<br class="gmail_msg">>                                                 ^^^^^^^^^^^^<br class="gmail_msg">>                  }) &&<br class="gmail_msg">>           "conflicting locations for variable");<br class="gmail_msg">>  }<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg">Ah, cool/fair enough.<br class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">That said, there is probably no verifier check that prevents you from describing the same variable in two allocas using two llvm.dbg.declares.<br class="gmail_msg"></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">*nod* Perhaps.<br class="gmail_msg"><br class="gmail_msg">(& that assert might fail too in other cases - I was imagining two non-fragment (ie: they describe the whole variabel) dbg.values - for some reason it might be advantageous to put the variable in different parts of the stack (or perhaps the same part, but with a gap in lifetime - eg: to store some other stuff due to stack reuse) at different times/portions of the function)</div></div></div></div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg">dbg.values won't make it into the MMI side table — only dbg.declares are stashed away there, and they don't have a concept of lifetime (at the moment).</div></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">-- adrian</div></div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg"><div dir="ltr" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant-caps:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg"> </div><blockquote class="gmail_quote gmail_msg" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br class="gmail_msg">><br class="gmail_msg">> -- adrian<br class="gmail_msg">><br class="gmail_msg">>><br class="gmail_msg">>> On Wed, Mar 22, 2017 at 10:02 AM Adrian Prantl via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg">>> Author: adrian<br class="gmail_msg">>> Date: Wed Mar 22 11:50:16 2017<br class="gmail_msg">>> New Revision: 298518<br class="gmail_msg">>><br class="gmail_msg">>> URL:<span class="m_1454624326413346858Apple-converted-space gmail_msg"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=298518&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=298518&view=rev</a><br class="gmail_msg">>> Log:<br class="gmail_msg">>> Fix PR32298 by adding an early exit to getFrameIndexExprs().<br class="gmail_msg">>><br class="gmail_msg">>> Also add an assertion for the case that there are multiple FI<br class="gmail_msg">>> expressions with a DW_OP_LLVM_fragment; which should violate internal<br class="gmail_msg">>> constraints in DbgVariable.<br class="gmail_msg">>><br class="gmail_msg">>> Added:<br class="gmail_msg">>>    llvm/trunk/test/DebugInfo/X86/single-fi.ll<br class="gmail_msg">>> Modified:<br class="gmail_msg">>>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br class="gmail_msg">>><br class="gmail_msg">>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp<br class="gmail_msg">>> URL:<span class="m_1454624326413346858Apple-converted-space gmail_msg"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=298518&r1=298517&r2=298518&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=298518&r1=298517&r2=298518&view=diff</a><br class="gmail_msg">>> ==============================================================================<br class="gmail_msg">>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)<br class="gmail_msg">>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed Mar 22 11:50:16 2017<br class="gmail_msg">>> @@ -199,6 +199,12 @@ const DIType *DbgVariable::getType() con<br class="gmail_msg">>> }<br class="gmail_msg">>><br class="gmail_msg">>> ArrayRef<DbgVariable::FrameIndexExpr> DbgVariable::getFrameIndexExprs() const {<br class="gmail_msg">>> +  if (FrameIndexExprs.size() == 1)<br class="gmail_msg">>> +    return FrameIndexExprs;<br class="gmail_msg">>> +<br class="gmail_msg">>> +  assert(all_of(FrameIndexExprs,<br class="gmail_msg">>> +                [](const FrameIndexExpr &A) { return A.Expr->isFragment(); }) &&<br class="gmail_msg">>> +         "multiple FI expressions without DW_OP_LLVM_fragment");<br class="gmail_msg">>>   std::sort(FrameIndexExprs.begin(), FrameIndexExprs.end(),<br class="gmail_msg">>>             [](const FrameIndexExpr &A, const FrameIndexExpr &B) -> bool {<br class="gmail_msg">>>               return A.Expr->getFragmentInfo()->OffsetInBits <<br class="gmail_msg">>><br class="gmail_msg">>> Added: llvm/trunk/test/DebugInfo/X86/single-fi.ll<br class="gmail_msg">>> URL:<span class="m_1454624326413346858Apple-converted-space gmail_msg"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/single-fi.ll?rev=298518&view=auto" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/single-fi.ll?rev=298518&view=auto</a><br class="gmail_msg">>> ==============================================================================<br class="gmail_msg">>> --- llvm/trunk/test/DebugInfo/X86/single-fi.ll (added)<br class="gmail_msg">>> +++ llvm/trunk/test/DebugInfo/X86/single-fi.ll Wed Mar 22 11:50:16 2017<br class="gmail_msg">>> @@ -0,0 +1,40 @@<br class="gmail_msg">>> +; RUN: %llc_dwarf -march=x86-64 -o - %s -filetype=obj \<br class="gmail_msg">>> +; RUN:   | llvm-dwarfdump -debug-dump=info - | FileCheck %s<br class="gmail_msg">>> +; A single FI location. This used to trigger an assertion in debug libstdc++.<br class="gmail_msg">>> +; CHECK: DW_TAG_formal_parameter<br class="gmail_msg">>> +;                                          fbreg -8<br class="gmail_msg">>> +; CHECK-NEXT: DW_AT_location {{.*}} (<0x2> 91 78 )<br class="gmail_msg">>> +; CHECK-NEXT: DW_AT_name {{.*}} "dipsy"<br class="gmail_msg">>> +define void @tinkywinky(i8* %dipsy) !dbg !6 {<br class="gmail_msg">>> +entry:<br class="gmail_msg">>> +  %dipsy.addr = alloca i8*<br class="gmail_msg">>> +  store i8* %dipsy, i8** %dipsy.addr<br class="gmail_msg">>> +  call void @llvm.dbg.declare(metadata i8** %dipsy.addr, metadata !12, metadata<br class="gmail_msg">>> +!13), !dbg !14<br class="gmail_msg">>> +  ret void, !dbg !15<br class="gmail_msg">>> +}<br class="gmail_msg">>> +<br class="gmail_msg">>> +declare void @llvm.dbg.declare(metadata, metadata, metadata)<br class="gmail_msg">>> +<br class="gmail_msg">>> +!<a href="http://llvm.dbg.cu/" rel="noreferrer" class="gmail_msg" target="_blank">llvm.dbg.cu</a><span class="m_1454624326413346858Apple-converted-space gmail_msg"> </span>= !{!0}<br class="gmail_msg">>> +!llvm.module.flags = !{!3, !4}<br class="gmail_msg">>> +!llvm.ident = !{!5}<br class="gmail_msg">>> +<br class="gmail_msg">>> +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 5.0.0 (trunk 297917) (llvm/trunk 297929)", isOptimized: false,<br class="gmail_msg">>> +runtimeVersion: 0, emissionKind: FullDebug, enums: !2)<br class="gmail_msg">>> +!1 = !DIFile(filename: "teletubbies.c", directory: "/home/davide/work/llvm/build-clang/bin")<br class="gmail_msg">>> +!2 = !{}<br class="gmail_msg">>> +!3 = !{i32 2, !"Dwarf Version", i32 4}<br class="gmail_msg">>> +!4 = !{i32 2, !"Debug Info Version", i32 3}<br class="gmail_msg">>> +!5 = !{!"clang version 5.0.0 (trunk 297917) (llvm/trunk 297929)"}<br class="gmail_msg">>> +!6 = distinct !DISubprogram(name: "tinkywinky", scope: !1, file: !1, line: 1, type: !7, isLocal: false, isDefinition: true, scopeLine: 1, flags:<br class="gmail_msg">>> +DIFlagPrototyped, isOptimized: false, unit: !0, variables: !2)<br class="gmail_msg">>> +!7 = !DISubroutineType(types: !8)<br class="gmail_msg">>> +!8 = !{null, !9}<br class="gmail_msg">>> +!9 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !10, size: 64)<br class="gmail_msg">>> +!10 = !DIDerivedType(tag: DW_TAG_const_type, baseType: !11)<br class="gmail_msg">>> +!11 = !DIBasicType(name: "char", size: 8, encoding: DW_ATE_signed_char)<br class="gmail_msg">>> +!12 = !DILocalVariable(name: "dipsy", arg: 1, scope: !6, file: !1, line: 1, type: !9)<br class="gmail_msg">>> +!13 = !DIExpression()<br class="gmail_msg">>> +!14 = !DILocation(line: 1, column: 29, scope: !6)<br class="gmail_msg">>> +!15 = !DILocation(line: 1, column: 37, scope: !6)<br class="gmail_msg">>><br class="gmail_msg">>><br class="gmail_msg">>> _______________________________________________<br class="gmail_msg">>> llvm-commits mailing list<br class="gmail_msg">>><span class="m_1454624326413346858Apple-converted-space gmail_msg"> </span><a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">>><span class="m_1454624326413346858Apple-converted-space gmail_msg"> </span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">></blockquote></div></div></div></blockquote></div></div></blockquote></div>