Revert "Separate the Verifier into an analysis and a transformation pass and"

This reverts commit 268937 while investigating build bot breakage.

llvm-svn: 268939
This commit is contained in:
Adrian Prantl 2016-05-09 17:43:24 +00:00
parent da43f0e76f
commit 614d411a0d
6 changed files with 9 additions and 110 deletions

View File

@ -51,7 +51,6 @@ enum DiagnosticKind {
DK_StackSize,
DK_Linker,
DK_DebugMetadataVersion,
DK_DebugMetadataInvalid,
DK_SampleProfile,
DK_OptimizationRemark,
DK_OptimizationRemarkMissed,
@ -215,29 +214,6 @@ public:
}
};
/// Diagnostic information for stripping invalid debug metadata.
class DiagnosticInfoIgnoringInvalidDebugMetadata : public DiagnosticInfo {
private:
/// The module that is concerned by this debug metadata version diagnostic.
const Module &M;
public:
/// \p The module that is concerned by this debug metadata version diagnostic.
DiagnosticInfoIgnoringInvalidDebugMetadata(
const Module &M, DiagnosticSeverity Severity = DS_Warning)
: DiagnosticInfo(DK_DebugMetadataVersion, Severity), M(M) {}
const Module &getModule() const { return M; }
/// \see DiagnosticInfo::print.
void print(DiagnosticPrinter &DP) const override;
static bool classof(const DiagnosticInfo *DI) {
return DI->getKind() == DK_DebugMetadataInvalid;
}
};
/// Diagnostic information for the sample profiler.
class DiagnosticInfoSampleProfile : public DiagnosticInfo {
public:

View File

@ -52,28 +52,6 @@ bool verifyFunction(const Function &F, raw_ostream *OS = nullptr);
bool verifyModule(const Module &M, raw_ostream *OS = nullptr,
bool *BrokenDebugInfo = nullptr);
FunctionPass *createVerifierPass(bool FatalErrors = true);
/// Check a module for errors, and report separate error states for IR
/// and debug info errors.
class VerifierAnalysis : public AnalysisInfoMixin<VerifierAnalysis> {
friend AnalysisInfoMixin<VerifierAnalysis>;
static char PassID;
public:
struct Result {
bool IRBroken, DebugInfoBroken;
};
static void *ID() { return (void *)&PassID; }
Result run(Module &M);
Result run(Function &F);
};
/// Check a module for errors, but report debug info errors separately.
/// Otherwise behaves as the normal verifyModule. Debug info errors can be
/// "recovered" from by stripping the debug info.
bool verifyModule(bool &BrokenDebugInfo, const Module &M, raw_ostream *OS);
/// \brief Create a verifier pass.
///
/// Check a module or function for validity. This is essentially a pass wrapped
@ -84,17 +62,18 @@ bool verifyModule(bool &BrokenDebugInfo, const Module &M, raw_ostream *OS);
///
/// Note that this creates a pass suitable for the legacy pass manager. It has
/// nothing to do with \c VerifierPass.
FunctionPass *createVerifierPass(bool FatalErrors = true);
class VerifierPass : public PassInfoMixin<VerifierPass> {
bool FatalErrors;
public:
explicit VerifierPass(bool FatalErrors = true) : FatalErrors(FatalErrors) {}
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
PreservedAnalyses run(Module &M);
PreservedAnalyses run(Function &F);
};
} // End llvm namespace
#endif

View File

@ -122,11 +122,6 @@ void DiagnosticInfoDebugMetadataVersion::print(DiagnosticPrinter &DP) const {
<< ") in " << getModule();
}
void DiagnosticInfoIgnoringInvalidDebugMetadata::print(
DiagnosticPrinter &DP) const {
DP << "ignoring invalid debug info in " << getModule().getModuleIdentifier();
}
void DiagnosticInfoSampleProfile::print(DiagnosticPrinter &DP) const {
if (!FileName.empty()) {
DP << getFileName();

View File

@ -59,7 +59,6 @@
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/InstIterator.h"
@ -4483,38 +4482,15 @@ FunctionPass *llvm::createVerifierPass(bool FatalErrors) {
return new VerifierLegacyPass(FatalErrors);
}
char VerifierAnalysis::PassID;
VerifierAnalysis::Result VerifierAnalysis::run(Module &M) {
Result Res;
Res.IRBroken = llvm::verifyModule(M, &dbgs(), &Res.DebugInfoBroken);
return Res;
}
PreservedAnalyses VerifierPass::run(Module &M) {
if (verifyModule(M, &dbgs()) && FatalErrors)
report_fatal_error("Broken module found, compilation aborted!");
VerifierAnalysis::Result VerifierAnalysis::run(Function &F) {
return { llvm::verifyFunction(F, &dbgs()), false };
}
PreservedAnalyses VerifierPass::run(Module &M, ModuleAnalysisManager &AM) {
auto Res = AM.getResult<VerifierAnalysis>(M);
if (FatalErrors) {
if (Res.IRBroken)
report_fatal_error("Broken module found, compilation aborted!");
assert(!Res.DebugInfoBroken && "Module contains invalid debug info");
}
// Strip broken debug info.
if (Res.DebugInfoBroken) {
DiagnosticInfoIgnoringInvalidDebugMetadata DiagInvalid(M);
M.getContext().diagnose(DiagInvalid);
if (!StripDebugInfo(M))
report_fatal_error("Failed to strip malformed debug info");
}
return PreservedAnalyses::all();
}
PreservedAnalyses VerifierPass::run(Function &F, FunctionAnalysisManager &AM) {
auto res = AM.getResult<VerifierAnalysis>(F);
if (res.IRBroken && FatalErrors)
PreservedAnalyses VerifierPass::run(Function &F) {
if (verifyFunction(F, &dbgs()) && FatalErrors)
report_fatal_error("Broken function found, compilation aborted!");
return PreservedAnalyses::all();

View File

@ -23,7 +23,6 @@ MODULE_ANALYSIS("callgraph", CallGraphAnalysis())
MODULE_ANALYSIS("lcg", LazyCallGraphAnalysis())
MODULE_ANALYSIS("no-op-module", NoOpModuleAnalysis())
MODULE_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
MODULE_ANALYSIS("verify", VerifierAnalysis())
#ifndef MODULE_ALIAS_ANALYSIS
#define MODULE_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
@ -88,7 +87,6 @@ FUNCTION_ANALYSIS("scalar-evolution", ScalarEvolutionAnalysis())
FUNCTION_ANALYSIS("targetlibinfo", TargetLibraryAnalysis())
FUNCTION_ANALYSIS("targetir",
TM ? TM->getTargetIRAnalysis() : TargetIRAnalysis())
FUNCTION_ANALYSIS("verify", VerifierAnalysis())
#ifndef FUNCTION_ALIAS_ANALYSIS
#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \

View File

@ -144,30 +144,5 @@ TEST(VerifierTest, CrossModuleMetadataRef) {
EXPECT_TRUE(StringRef(ErrorOS.str())
.startswith("Referencing global in another module!"));
}
TEST(VerifierTest, StripInvalidDebugInfo) {
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));
ModulePassManager MPM(true);
MPM.addPass(VerifierPass(false));
ModuleAnalysisManager MAM(true);
MAM.registerPass([&] { return VerifierAnalysis(); });
MPM.run(M, MAM);
EXPECT_FALSE(verifyModule(M));
}
} // end anonymous namespace
} // end namespace llvm