<div dir="ltr">This seems like a slightly weird algorithm<br><br>We check if the debug location itself is seen, then if the immediate scope is seen, then we walk the entire scope chain until we get to the top level subprogram and check if that's already seen. Why not check the intermediate scopes too, if checking the first and last are both worthwhile... <br><br>& if we actually check everything along the chain, then maybe this should fall out more naturally?</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 16, 2015 at 2:48 AM, Keno Fischer via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">loladiro updated this revision to Diff 40264.<br>
loladiro added a comment.<br>
<br>
Small formatting fix<br>
<div><div class="h5"><br>
<br>
<a href="http://reviews.llvm.org/D14697" rel="noreferrer" target="_blank">http://reviews.llvm.org/D14697</a><br>
<br>
Files:<br>
  lib/IR/Verifier.cpp<br>
  test/CodeGen/X86/2010-05-28-Crash.ll<br>
  test/Verifier/func-dbg.ll<br>
<br>
Index: test/Verifier/func-dbg.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/Verifier/func-dbg.ll<br>
@@ -0,0 +1,25 @@<br>
+; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s<br>
+<br>
+define i32 @foo() !dbg !4 {<br>
+entry:<br>
+  ret i32 0, !dbg !6<br>
+}<br>
+<br>
+define i32 @bar() !dbg !5 {<br>
+entry:<br>
+; CHECK: !dbg attachment points at wrong subprogram for function<br>
+  ret i32 0, !dbg !6<br>
+}<br>
+<br>
+!<a href="http://llvm.dbg.cu" rel="noreferrer" target="_blank">llvm.dbg.cu</a> = !{!0}<br>
+!llvm.module.flags = !{!7, !8}<br>
+<br>
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: 0, enums: !2, retainedTypes: !2, subprograms: !3, globals: !2, imports: !2)<br>
+!1 = !DIFile(filename: "dwarf-test.c", directory: "test")<br>
+!2 = !{}<br>
+!3 = !{!4, !5}<br>
+!4 = distinct !DISubprogram(name: "foo", scope: !0, isDefinition: true)<br>
+!5 = distinct !DISubprogram(name: "bar", scope: !0, isDefinition: true)<br>
+!6 = !DILocation(line: 7, scope: !4)<br>
+!7 = !{i32 2, !"Dwarf Version", i32 3}<br>
+!8 = !{i32 1, !"Debug Info Version", i32 3}<br>
Index: test/CodeGen/X86/2010-05-28-Crash.ll<br>
===================================================================<br>
--- test/CodeGen/X86/2010-05-28-Crash.ll<br>
+++ test/CodeGen/X86/2010-05-28-Crash.ll<br>
@@ -16,7 +16,7 @@<br>
 define i32 @bar(i32 %x) nounwind optsize ssp !dbg !8 {<br>
 entry:<br>
   tail call void @llvm.dbg.value(metadata i32 %x, i64 0, metadata !7, metadata !DIExpression()), !dbg !DILocation(scope: !8)<br>
-  tail call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !0, metadata !DIExpression()) nounwind, !dbg !DILocation(scope: !1)<br>
+  tail call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !0, metadata !DIExpression()) nounwind, !dbg !DILocation(scope: !1, inlinedAt: !DILocation(scope: !8))<br>
   %0 = tail call i32 (...) @zoo(i32 1) nounwind, !dbg !12 ; <i32> [#uses=1]<br>
   %1 = add nsw i32 %0, %x, !dbg !13               ; <i32> [#uses=1]<br>
   ret i32 %1, !dbg !13<br>
Index: lib/IR/Verifier.cpp<br>
===================================================================<br>
--- lib/IR/Verifier.cpp<br>
+++ lib/IR/Verifier.cpp<br>
</div></div>@@ -1806,7 +1806,10 @@<br>
<span class="">         continue;<br>
<br>
       DISubprogram *SP = Scope ? Scope->getSubprogram() : nullptr;<br>
-      if (SP && !Seen.insert(SP).second)<br>
+<br>
+      // Scope and SP could be the same MDNode and we don't want to skip<br>
+      // validation in that case<br>
</span>+      if (SP && ((Scope != SP) && !Seen.insert(SP).second))<br>
<div class="HOEnZb"><div class="h5">         continue;<br>
<br>
       // FIXME: Once N is canonical, check "SP == &N".<br>
<br>
<br>
</div></div><br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div><br></div>