summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2016-04-12 18:22:33 +0000
committerDavide Italiano <davide@freebsd.org>2016-04-12 18:22:33 +0000
commitb390d8ee3980f729d1dc777c0cf422a2d72eb625 (patch)
tree1ff64a6944685e5c8c674b3451f2ff0b4cceec9f
parentc3943574301f575ec22c1789836898614f96b86b (diff)
downloadbcm5719-llvm-b390d8ee3980f729d1dc777c0cf422a2d72eb625.tar.gz
bcm5719-llvm-b390d8ee3980f729d1dc777c0cf422a2d72eb625.zip
[IR/Verifier] Each DISubprogram with isDefinition: true must belong to a CU.
Add a check to catch violations. ~60 tests were broken and prevented this change to be committed. Adrian and I (thanks Adrian!) went through them in the last week or so updating. The check can be done more efficiently but I'd still like to get this in ASAP to avoid more broken tests to be checked in (if any). PR: 27101 llvm-svn: 266102
-rw-r--r--llvm/lib/IR/Verifier.cpp16
-rw-r--r--llvm/test/Verifier/disubprogram-nocu.ll22
2 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 8f055886efe..cb9b641a73f 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -1011,6 +1011,22 @@ void Verifier::visitDISubprogram(const DISubprogram &N) {
if (N.isDefinition())
Assert(N.isDistinct(), "subprogram definitions must be distinct", &N);
+
+ // Ensure that every DISubprogram with isDefinition: true belongs
+ // to a DICompileUnit.
+ // FIXME: This is a very inefficient way of handling the problem.
+ // Use a SmallSetPtr which contains the Listed DISubprograms in the CU
+ // instead.
+ if (N.isDefinition()) {
+ auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
+ Assert(CUs, "subprogram must belong to a compile unit", &N);
+ for (auto *CU : CUs->operands())
+ if (auto Subprograms = cast<DICompileUnit>(CU)->getSubprograms())
+ for (const auto *Sp : Subprograms)
+ if (Sp == &N)
+ return;
+ Assert(false, "subprogram not found in any compile unit", &N);
+ }
}
void Verifier::visitDILexicalBlockBase(const DILexicalBlockBase &N) {
diff --git a/llvm/test/Verifier/disubprogram-nocu.ll b/llvm/test/Verifier/disubprogram-nocu.ll
new file mode 100644
index 00000000000..018b78fc09c
--- /dev/null
+++ b/llvm/test/Verifier/disubprogram-nocu.ll
@@ -0,0 +1,22 @@
+; Reject if DISubprogram does not belong to a DICompileUnit.
+; RUN: not llvm-as %s
+
+@_ZZNK4llvm6object15MachOObjectFile21getRelocationTypeNameENS0_11DataRefImplERNS_15SmallVectorImplIcEEE5Table = external unnamed_addr constant [6 x i8*], align 16
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!13}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, isOptimized: false, runtimeVersion: 0, emissionKind: 0, globals: !2, imports: !9)
+!1 = !DIFile(filename: "../lib/Object/MachOObjectFile.cpp", directory: "/home/davide/work/llvm/build-lto-debug")
+!2 = !{!3, !8}
+!3 = !DIGlobalVariable(name: "Table", scope: !4, isLocal: false, isDefinition: true, variable: [6 x i8*]* @_ZZNK4llvm6object15MachOObjectFile21getRelocationTypeNameENS0_11DataRefImplERNS_15SmallVectorImplIcEEE5Table)
+!4 = distinct !DILexicalBlock(scope: !5, line: 722, column: 23)
+!5 = distinct !DILexicalBlock(scope: !6, line: 721, column: 17)
+!6 = distinct !DISubprogram(name: "getRelocationTypeName", scope: null, isLocal: false, isDefinition: true, isOptimized: false, variables: !7)
+!7 = !{}
+!8 = !DIGlobalVariable(name: "IsLittleEndianHost", scope: null, isLocal: false, isDefinition: true, variable: i1 true)
+!9 = !{!10, !12}
+!10 = !DIImportedEntity(tag: DW_TAG_imported_declaration, scope: !11, line: 121)
+!11 = !DINamespace(name: "std", scope: null, line: 1967)
+!12 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !0, line: 32)
+!13 = !{i32 2, !"Debug Info Version", i32 3}
OpenPOWER on IntegriCloud