diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index 5cbb597ca26..96b8a779577 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -1814,7 +1814,10 @@ void Verifier::visitFunction(const Function &F) { continue; DISubprogram *SP = Scope ? Scope->getSubprogram() : nullptr; - if (SP && !Seen.insert(SP).second) + + // Scope and SP could be the same MDNode and we don't want to skip + // validation in that case + if (SP && ((Scope != SP) && !Seen.insert(SP).second)) continue; // FIXME: Once N is canonical, check "SP == &N". diff --git a/test/CodeGen/X86/2010-05-28-Crash.ll b/test/CodeGen/X86/2010-05-28-Crash.ll index 678f1befad1..7967d45c2ee 100644 --- a/test/CodeGen/X86/2010-05-28-Crash.ll +++ b/test/CodeGen/X86/2010-05-28-Crash.ll @@ -16,7 +16,7 @@ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) nounwind readnon define i32 @bar(i32 %x) nounwind optsize ssp !dbg !8 { entry: tail call void @llvm.dbg.value(metadata i32 %x, i64 0, metadata !7, metadata !DIExpression()), !dbg !DILocation(scope: !8) - tail call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !0, metadata !DIExpression()) nounwind, !dbg !DILocation(scope: !1) + tail call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !0, metadata !DIExpression()) nounwind, !dbg !DILocation(scope: !1, inlinedAt: !DILocation(scope: !8)) %0 = tail call i32 (...) @zoo(i32 1) nounwind, !dbg !12 ; [#uses=1] %1 = add nsw i32 %0, %x, !dbg !13 ; [#uses=1] ret i32 %1, !dbg !13 diff --git a/test/Verifier/func-dbg.ll b/test/Verifier/func-dbg.ll new file mode 100644 index 00000000000..e56de94d18c --- /dev/null +++ b/test/Verifier/func-dbg.ll @@ -0,0 +1,25 @@ +; RUN: not llvm-as < %s -o /dev/null 2>&1 | FileCheck %s + +define i32 @foo() !dbg !4 { +entry: + ret i32 0, !dbg !6 +} + +define i32 @bar() !dbg !5 { +entry: +; CHECK: !dbg attachment points at wrong subprogram for function + ret i32 0, !dbg !6 +} + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!7, !8} + +!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) +!1 = !DIFile(filename: "dwarf-test.c", directory: "test") +!2 = !{} +!3 = !{!4, !5} +!4 = distinct !DISubprogram(name: "foo", scope: !0, isDefinition: true) +!5 = distinct !DISubprogram(name: "bar", scope: !0, isDefinition: true) +!6 = !DILocation(line: 7, scope: !4) +!7 = !{i32 2, !"Dwarf Version", i32 3} +!8 = !{i32 1, !"Debug Info Version", i32 3}