diff options
author | chrulski-intel <christopher.m.chrulski@intel.com> | 2023-12-01 11:36:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-01 10:36:25 -0800 |
commit | ff0d8a9a6c2a08e206e77db318a18210678f54a4 (patch) | |
tree | de3315f9ee5c0834b934c0bcbd17d7d0d293482b | |
parent | 625e1ecb7e80c1da4ea50e5b1ad632f08b71d127 (diff) | |
download | llvm-ff0d8a9a6c2a08e206e77db318a18210678f54a4.zip llvm-ff0d8a9a6c2a08e206e77db318a18210678f54a4.tar.gz llvm-ff0d8a9a6c2a08e206e77db318a18210678f54a4.tar.bz2 |
Report pass name when -llvm-verify-each reports breakage (#71447)
Update the string reported to include the pass name of last pass when
running verifier after each pass.
-rw-r--r-- | llvm/lib/Passes/PassBuilder.cpp | 26 | ||||
-rw-r--r-- | llvm/lib/Passes/PassRegistry.def | 2 | ||||
-rw-r--r-- | llvm/lib/Passes/StandardInstrumentations.cpp | 8 | ||||
-rw-r--r-- | llvm/test/Other/trigger-verifier-error.ll | 18 |
4 files changed, 52 insertions, 2 deletions
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp index dad7a74..da1bc6c 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -408,6 +408,32 @@ public: static StringRef name() { return "TriggerCrashPass"; } }; +// A pass for testing message reporting of -verify-each failures. +// DO NOT USE THIS EXCEPT FOR TESTING! +class TriggerVerifierErrorPass + : public PassInfoMixin<TriggerVerifierErrorPass> { +public: + PreservedAnalyses run(Module &M, ModuleAnalysisManager &) { + // Intentionally break the Module by creating an alias without setting the + // aliasee. + auto *PtrTy = llvm::PointerType::getUnqual(M.getContext()); + GlobalAlias::create(PtrTy, PtrTy->getAddressSpace(), + GlobalValue::LinkageTypes::InternalLinkage, + "__bad_alias", nullptr, &M); + return PreservedAnalyses::none(); + } + + PreservedAnalyses run(Function &F, FunctionAnalysisManager &) { + // Intentionally break the Function by inserting a terminator + // instruction in the middle of a basic block. + BasicBlock &BB = F.getEntryBlock(); + new UnreachableInst(F.getContext(), BB.getTerminator()); + return PreservedAnalyses::none(); + } + + static StringRef name() { return "TriggerVerifierErrorPass"; } +}; + } // namespace PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO, diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index e23863a..6f3c408 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -133,6 +133,7 @@ MODULE_PASS("strip-nondebug", StripNonDebugSymbolsPass()) MODULE_PASS("strip-nonlinetable-debuginfo", StripNonLineTableDebugInfoPass()) MODULE_PASS("synthetic-counts-propagation", SyntheticCountsPropagation()) MODULE_PASS("trigger-crash", TriggerCrashPass()) +MODULE_PASS("trigger-verifier-error", TriggerVerifierErrorPass()) MODULE_PASS("tsan-module", ModuleThreadSanitizerPass()) MODULE_PASS("verify", VerifierPass()) MODULE_PASS("view-callgraph", CallGraphViewerPass()) @@ -404,6 +405,7 @@ FUNCTION_PASS("structurizecfg", StructurizeCFGPass()) FUNCTION_PASS("tailcallelim", TailCallElimPass()) FUNCTION_PASS("tlshoist", TLSVariableHoistPass()) FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass()) +FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass()) FUNCTION_PASS("tsan", ThreadSanitizerPass()) FUNCTION_PASS("typepromotion", TypePromotionPass(TM)) FUNCTION_PASS("unify-loop-exits", UnifyLoopExitsPass()) diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp index 8cae123..df445c2 100644 --- a/llvm/lib/Passes/StandardInstrumentations.cpp +++ b/llvm/lib/Passes/StandardInstrumentations.cpp @@ -1405,7 +1405,9 @@ void VerifyInstrumentation::registerCallbacks( dbgs() << "Verifying function " << F->getName() << "\n"; if (verifyFunction(*F, &errs())) - report_fatal_error("Broken function found, compilation aborted!"); + report_fatal_error(formatv("Broken function found after pass " + "\"{0}\", compilation aborted!", + P)); } else { const Module **MPtr = llvm::any_cast<const Module *>(&IR); const Module *M = MPtr ? *MPtr : nullptr; @@ -1420,7 +1422,9 @@ void VerifyInstrumentation::registerCallbacks( dbgs() << "Verifying module " << M->getName() << "\n"; if (verifyModule(*M, &errs())) - report_fatal_error("Broken module found, compilation aborted!"); + report_fatal_error(formatv("Broken module found after pass " + "\"{0}\", compilation aborted!", + P)); } } }); diff --git a/llvm/test/Other/trigger-verifier-error.ll b/llvm/test/Other/trigger-verifier-error.ll new file mode 100644 index 0000000..692758c --- /dev/null +++ b/llvm/test/Other/trigger-verifier-error.ll @@ -0,0 +1,18 @@ +; A test that the option -verify-each reports the last pass run +; when a failure occurs. + +; RUN: not --crash opt -disable-output -debug-pass-manager -verify-each -passes="module(trigger-verifier-error)" %s 2>&1 | FileCheck %s --check-prefix=CHECK_MODULE +; RUN: not --crash opt -disable-output -debug-pass-manager -verify-each -passes="function(trigger-verifier-error)" %s 2>&1 | FileCheck %s --check-prefix=CHECK_FUNCTION + +; CHECK_MODULE: Running pass: TriggerVerifierErrorPass on [module] +; CHECK_MODULE: Broken module found after pass "TriggerVerifierErrorPass", compilation aborted! + +; CHECK_FUNCTION: Running pass: TriggerVerifierErrorPass on main +; CHECK_FUNCTION: Broken function found after pass "TriggerVerifierErrorPass", compilation aborted! + +define i32 @main() { +entry: + %retval = alloca i32, align 4 + store i32 0, ptr %retval, align 4 + ret i32 0 +} |