aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchrulski-intel <christopher.m.chrulski@intel.com>2023-12-01 11:36:25 -0700
committerGitHub <noreply@github.com>2023-12-01 10:36:25 -0800
commitff0d8a9a6c2a08e206e77db318a18210678f54a4 (patch)
treede3315f9ee5c0834b934c0bcbd17d7d0d293482b
parent625e1ecb7e80c1da4ea50e5b1ad632f08b71d127 (diff)
downloadllvm-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.cpp26
-rw-r--r--llvm/lib/Passes/PassRegistry.def2
-rw-r--r--llvm/lib/Passes/StandardInstrumentations.cpp8
-rw-r--r--llvm/test/Other/trigger-verifier-error.ll18
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
+}