[PATCH] D18518: Add an IR Verifier check for orphaned DICompileUnits.

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 28 11:40:45 PDT 2016


> On 2016-Mar-28, at 11:16, Adrian Prantl <aprantl at apple.com> wrote:
> 
> aprantl created this revision.
> aprantl added reviewers: dexonsmith, dblaikie.
> aprantl added subscribers: llvm-commits, loladiro.
> 
> Add an IR Verifier check for orphaned DICompileUnits. A DICompileUnit that is not listed in llvm.dbg.cu will cause assertion failures and/or crashes in the backend. The Verifier should reject this.
> 
> http://reviews.llvm.org/D18518
> 
> Files:
>  lib/IR/Verifier.cpp
>  test/Assembler/dicompileunit.ll
>  test/Transforms/LoopIdiom/debug-line.ll
>  test/Verifier/dbg-orphaned-compileunit.ll
>  tools/bugpoint/CrashDebugger.cpp
> 
> <D18518.51808.patch>

> Index: tools/bugpoint/CrashDebugger.cpp
> ===================================================================
> --- tools/bugpoint/CrashDebugger.cpp
> +++ tools/bugpoint/CrashDebugger.cpp
> @@ -552,7 +552,8 @@
>    std::vector<NamedMDNode *> ToDelete;
>    ToDelete.reserve(M->named_metadata_size() - Names.size());
>    for (auto &NamedMD : M->named_metadata())
> -    if (!Names.count(NamedMD.getName()))
> +    // Always keep llvm.dbg.cu because the Verifier would complain.
> +    if (!Names.count(NamedMD.getName()) && NamedMD.getName() != "llvm.dbg.cu")

How does this interact with Keno's changes to make bugpoint reduce debug
info?  Will the compile units still get pruned?

>        ToDelete.push_back(&NamedMD);
>  
>    for (auto *NamedMD : ToDelete)
> Index: test/Assembler/dicompileunit.ll
> ===================================================================
> --- test/Assembler/dicompileunit.ll
> +++ test/Assembler/dicompileunit.ll
> @@ -1,8 +1,10 @@
>  ; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis | FileCheck %s
>  ; RUN: verify-uselistorder %s
>  
> -; CHECK: !named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9}
> -!named = !{!0, !1, !2, !3, !4, !5, !6, !7, !8, !9}
> +; CHECK: !named = !{!0, !1, !2, !3, !4, !5, !6, !7}
> +!named = !{!0, !1, !2, !3, !4, !5, !6, !7}

^ You could leave !8 and !9 in !named.  Do you think that helps make it
obvious that the numbering will be stable?  (Up to you.)

> +; CHECK: !llvm.dbg.cu = !{!8, !9}
> +!llvm.dbg.cu = !{!8, !9}
>  
>  !0 = distinct !{}
>  !1 = !DIFile(filename: "path/to/file", directory: "/path/to/dir")
> @@ -24,3 +26,5 @@
>  !9 = distinct !DICompileUnit(language: 12, file: !1, producer: "",
>                               isOptimized: false, flags: "", runtimeVersion: 0,
>                               splitDebugFilename: "", emissionKind: 0)
> +!llvm.module.flags = !{!10}
> +!10 = !{i32 2, !"Debug Info Version", i32 3}
> Index: lib/IR/Verifier.cpp
> ===================================================================
> --- lib/IR/Verifier.cpp
> +++ lib/IR/Verifier.cpp
> @@ -302,7 +306,9 @@
>      visitModuleFlags(M);
>      visitModuleIdents(M);
>  
> -    // Verify type referneces last.

s/referneces/references/

> +    verifyCompileUnits();
> +
> +    // Verify type references last.
>      verifyTypeRefs();
>  
>      return !Broken;
> @@ -4251,6 +4261,16 @@
>    Assert(false, "unresolved type ref", S, N);
>  }
>  
> +void Verifier::verifyCompileUnits() {
> +  auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
> +  SmallPtrSet<const Metadata *, 2> Listed;
> +  if (CUs)
> +    Listed.insert(CUs->op_begin(), CUs->op_end());
> +  Assert(set_difference(CUVisited, Listed).empty(),
> +         "All DICompileUnits must be listed in llvm.dbg.cu");

It seems more efficient to do this directly, rather than creating a
third new set and checking that it's empty:

    Assert(CUVisited.size() <= Listed.size());
    Assert(std::all_of(CUVisited.begin(), CUVisited.end(),
               [&Listed](const Metadata *CU) { return Listed.count(CU); });

Maybe it's worth adding this to SetOperations.h (I'm not sure), but I
think keeping the Verifier efficient is important.

> +  CUVisited.clear();
> +}
> +
>  void Verifier::verifyTypeRefs() {
>    auto *CUs = M->getNamedMetadata("llvm.dbg.cu");
>    if (!CUs)
> 



More information about the llvm-commits mailing list