[PATCH] D20629: Port the strip-invalid-debuginfo logic to the legacy verifier pass, too.

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 09:07:17 PDT 2016


aprantl created this revision.
aprantl added a reviewer: joker.eph.
aprantl added subscribers: llvm-commits, friss.
aprantl set the repository for this revision to rL LLVM.

  
    Since r268966 the modern Verifier pass defaults to stripping invalid debug info
    in nonasserts builds.  This patch ports this behavior back to the legacy
    Verifier pass as well.  The primary motivation is that the clang frontend
    accepts bitcode files as input but is still using the legacy pass pipeline.
    
    Background: The problem I'm trying to solve with this sequence of patches is
    that historically we've done a really bad job at verifying debug info. We want
    to be able to make the verifier stricter without having to worry about breaking
    bitcode compatibility with existing producers. For example, we don't necessarily
    want IR produced by an older version of clang to be rejected by an LTO link just
    because of malformed debug info, and rather provide an option to strip it. Note
    that merely outdated (but well-formed) debug info would continue to be
    auto-upgraded in this scenario.
    
    <rdar://problem/26448800>

Repository:
  rL LLVM

http://reviews.llvm.org/D20629

Files:
  lib/IR/Verifier.cpp
  unittests/IR/VerifierTest.cpp

Index: unittests/IR/VerifierTest.cpp
===================================================================
--- unittests/IR/VerifierTest.cpp
+++ unittests/IR/VerifierTest.cpp
@@ -7,16 +7,17 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/IR/Verifier.h"
 #include "llvm/IR/Constants.h"
 #include "llvm/IR/DIBuilder.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/GlobalAlias.h"
 #include "llvm/IR/GlobalVariable.h"
 #include "llvm/IR/Instructions.h"
 #include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/LegacyPassManager.h"
 #include "llvm/IR/Module.h"
+#include "llvm/IR/Verifier.h"
 #include "gtest/gtest.h"
 
 namespace llvm {
@@ -198,5 +199,26 @@
 }
 #endif
 
+TEST(VerifierTest, StripInvalidDebugInfoLegacy) {
+  LLVMContext C;
+  Module M("M", C);
+  DIBuilder DIB(M);
+  DIB.createCompileUnit(dwarf::DW_LANG_C89, "broken.c", "/",
+                        "unittest", false, "", 0);
+  DIB.finalize();
+  EXPECT_FALSE(verifyModule(M));
+
+  // Now break it.
+  auto *File = DIB.createFile("not-a-CU.f", ".");
+  NamedMDNode *NMD = M.getOrInsertNamedMetadata("llvm.dbg.cu");
+  NMD->addOperand(File);
+  EXPECT_TRUE(verifyModule(M));
+
+  legacy::PassManager Passes;
+  Passes.add(createVerifierPass(false));
+  Passes.run(M);
+  EXPECT_FALSE(verifyModule(M));
+}
+
 } // end anonymous namespace
 } // end namespace llvm
Index: lib/IR/Verifier.cpp
===================================================================
--- lib/IR/Verifier.cpp
+++ lib/IR/Verifier.cpp
@@ -4460,17 +4460,16 @@
   static char ID;
 
   Verifier V;
-  bool FatalErrors;
+  bool FatalErrors = true;
 
   VerifierLegacyPass()
       : FunctionPass(ID),
-        V(&dbgs(), /*ShouldTreatBrokenDebugInfoAsError=*/true),
-        FatalErrors(true) {
+        V(&dbgs(), /*ShouldTreatBrokenDebugInfoAsError=*/true) {
     initializeVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
   }
   explicit VerifierLegacyPass(bool FatalErrors)
       : FunctionPass(ID),
-        V(&dbgs(), /*ShouldTreatBrokenDebugInfoAsError=*/true),
+        V(&dbgs(), /*ShouldTreatBrokenDebugInfoAsError=*/false),
         FatalErrors(FatalErrors) {
     initializeVerifierLegacyPassPass(*PassRegistry::getPassRegistry());
   }
@@ -4483,9 +4482,18 @@
   }
 
   bool doFinalization(Module &M) override {
-    if (!V.verify(M) && FatalErrors)
+    if (!V.verify(M) && FatalErrors) {
       report_fatal_error("Broken module found, compilation aborted!");
+      assert(!V.hasBrokenDebugInfo() && "Module contains invalid debug info");
+    }
 
+    // Strip broken debug info.
+    if (V.hasBrokenDebugInfo()) {
+      DiagnosticInfoIgnoringInvalidDebugMetadata DiagInvalid(M);
+      M.getContext().diagnose(DiagInvalid);
+      if (!StripDebugInfo(M))
+        report_fatal_error("Failed to strip malformed debug info");
+    }
     return false;
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20629.58437.patch
Type: text/x-patch
Size: 2912 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160525/6da816e3/attachment.bin>


More information about the llvm-commits mailing list