/// \brief Check a module for errors.
///
-/// If there are no errors, the function returns false. If an error is
-/// found, a message describing the error is written to OS (if
-/// non-null) and true is returned.
-///
-/// \return true if the module is broken. If BrokenDebugInfo is
-/// supplied, DebugInfo verification failures won't be considered as
-/// error and instead *BrokenDebugInfo will be set to true. Debug
-/// info errors can be "recovered" from by stripping the debug info.
-bool verifyModule(const Module &M, raw_ostream *OS = nullptr,
- bool *BrokenDebugInfo = nullptr);
+/// If there are no errors, the function returns false. If an error is found,
+/// a message describing the error is written to OS (if non-null) and true is
+/// returned.
+bool verifyModule(const Module &M, raw_ostream *OS = nullptr);
/// \brief Create a verifier pass.
///
return !V.verify(F);
}
-bool llvm::verifyModule(const Module &M, raw_ostream *OS,
- bool *BrokenDebugInfo) {
+bool llvm::verifyModule(const Module &M, raw_ostream *OS) {
// Don't use a raw_null_ostream. Printing IR is expensive.
- Verifier V(OS, /*ShouldTreatBrokenDebugInfoAsError=*/!BrokenDebugInfo);
+ Verifier V(OS, /*ShouldTreatBrokenDebugInfoAsError=*/true);
bool Broken = false;
for (const Function &F : M)
if (!F.isDeclaration() && !F.isMaterializable())
Broken |= !V.verify(F);
- Broken |= !V.verify(M);
- if (BrokenDebugInfo)
- *BrokenDebugInfo = V.hasBrokenDebugInfo();
// Note that this function's return value is inverted from what you would
// expect of a function called "verify".
- return Broken;
+ return !V.verify(M) || Broken;
}
namespace {
#include "llvm/Config/config.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
-#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/DiagnosticPrinter.h"
cl::init(false),
#endif
cl::Hidden);
-
-cl::opt<bool> LTOStripInvalidDebugInfo(
- "lto-strip-invalid-debug-info",
- cl::desc("Strip invalid debug info metadata during LTO instead of aborting."),
-#ifdef NDEBUG
- cl::init(true),
-#else
- cl::init(false),
-#endif
- cl::Hidden);
}
LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context)
return;
HasVerifiedInput = true;
- if (LTOStripInvalidDebugInfo) {
- bool BrokenDebugInfo = false;
- if (verifyModule(*MergedModule, &dbgs(), &BrokenDebugInfo))
- report_fatal_error("Broken module found, compilation aborted!");
- if (BrokenDebugInfo) {
- emitWarning("Invalid debug info found, debug info will be stripped");
- StripDebugInfo(*MergedModule);
- }
- }
if (verifyModule(*MergedModule, &dbgs()))
report_fatal_error("Broken module found, compilation aborted!");
}
+++ /dev/null
-; RUN: not llvm-lto -lto-strip-invalid-debug-info=false \
-; RUN: -o %t.o %S/Inputs/strip-debug-info.bc 2>&1 | \
-; RUN: FileCheck %s -allow-empty -check-prefix=CHECK-ERR
-; RUN: llvm-lto -lto-strip-invalid-debug-info=true -exported-symbol _foo \
-; RUN: -o %t.o %S/Inputs/strip-debug-info.bc 2>&1 | \
-; RUN: FileCheck %s -allow-empty -check-prefix=CHECK-WARN
-; RUN: llvm-nm %t.o | FileCheck %s
-
-; CHECK-ERR: Broken module found, compilation aborted
-; CHECK-WARN: Invalid debug info found, debug info will be stripped
-; CHECK: foo
-define void @foo() {
- ret void
-}
-
-!llvm.module.flags = !{!0}
-!llvm.dbg.cu = !{!1}
-
-!0 = !{i32 2, !"Debug Info Version", i32 3}
-!1 = !DIFile(filename: "broken", directory: "")