Skip to content

Commit ff0d8a9

Browse files
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.
1 parent 625e1ec commit ff0d8a9

File tree

4 files changed

+52
-2
lines changed

4 files changed

+52
-2
lines changed

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,32 @@ class TriggerCrashPass : public PassInfoMixin<TriggerCrashPass> {
408408
static StringRef name() { return "TriggerCrashPass"; }
409409
};
410410

411+
// A pass for testing message reporting of -verify-each failures.
412+
// DO NOT USE THIS EXCEPT FOR TESTING!
413+
class TriggerVerifierErrorPass
414+
: public PassInfoMixin<TriggerVerifierErrorPass> {
415+
public:
416+
PreservedAnalyses run(Module &M, ModuleAnalysisManager &) {
417+
// Intentionally break the Module by creating an alias without setting the
418+
// aliasee.
419+
auto *PtrTy = llvm::PointerType::getUnqual(M.getContext());
420+
GlobalAlias::create(PtrTy, PtrTy->getAddressSpace(),
421+
GlobalValue::LinkageTypes::InternalLinkage,
422+
"__bad_alias", nullptr, &M);
423+
return PreservedAnalyses::none();
424+
}
425+
426+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &) {
427+
// Intentionally break the Function by inserting a terminator
428+
// instruction in the middle of a basic block.
429+
BasicBlock &BB = F.getEntryBlock();
430+
new UnreachableInst(F.getContext(), BB.getTerminator());
431+
return PreservedAnalyses::none();
432+
}
433+
434+
static StringRef name() { return "TriggerVerifierErrorPass"; }
435+
};
436+
411437
} // namespace
412438

413439
PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,

llvm/lib/Passes/PassRegistry.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ MODULE_PASS("strip-nondebug", StripNonDebugSymbolsPass())
133133
MODULE_PASS("strip-nonlinetable-debuginfo", StripNonLineTableDebugInfoPass())
134134
MODULE_PASS("synthetic-counts-propagation", SyntheticCountsPropagation())
135135
MODULE_PASS("trigger-crash", TriggerCrashPass())
136+
MODULE_PASS("trigger-verifier-error", TriggerVerifierErrorPass())
136137
MODULE_PASS("tsan-module", ModuleThreadSanitizerPass())
137138
MODULE_PASS("verify", VerifierPass())
138139
MODULE_PASS("view-callgraph", CallGraphViewerPass())
@@ -404,6 +405,7 @@ FUNCTION_PASS("structurizecfg", StructurizeCFGPass())
404405
FUNCTION_PASS("tailcallelim", TailCallElimPass())
405406
FUNCTION_PASS("tlshoist", TLSVariableHoistPass())
406407
FUNCTION_PASS("transform-warning", WarnMissedTransformationsPass())
408+
FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass())
407409
FUNCTION_PASS("tsan", ThreadSanitizerPass())
408410
FUNCTION_PASS("typepromotion", TypePromotionPass(TM))
409411
FUNCTION_PASS("unify-loop-exits", UnifyLoopExitsPass())

llvm/lib/Passes/StandardInstrumentations.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,7 +1405,9 @@ void VerifyInstrumentation::registerCallbacks(
14051405
dbgs() << "Verifying function " << F->getName() << "\n";
14061406

14071407
if (verifyFunction(*F, &errs()))
1408-
report_fatal_error("Broken function found, compilation aborted!");
1408+
report_fatal_error(formatv("Broken function found after pass "
1409+
"\"{0}\", compilation aborted!",
1410+
P));
14091411
} else {
14101412
const Module **MPtr = llvm::any_cast<const Module *>(&IR);
14111413
const Module *M = MPtr ? *MPtr : nullptr;
@@ -1420,7 +1422,9 @@ void VerifyInstrumentation::registerCallbacks(
14201422
dbgs() << "Verifying module " << M->getName() << "\n";
14211423

14221424
if (verifyModule(*M, &errs()))
1423-
report_fatal_error("Broken module found, compilation aborted!");
1425+
report_fatal_error(formatv("Broken module found after pass "
1426+
"\"{0}\", compilation aborted!",
1427+
P));
14241428
}
14251429
}
14261430
});
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
; A test that the option -verify-each reports the last pass run
2+
; when a failure occurs.
3+
4+
; 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
5+
; 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
6+
7+
; CHECK_MODULE: Running pass: TriggerVerifierErrorPass on [module]
8+
; CHECK_MODULE: Broken module found after pass "TriggerVerifierErrorPass", compilation aborted!
9+
10+
; CHECK_FUNCTION: Running pass: TriggerVerifierErrorPass on main
11+
; CHECK_FUNCTION: Broken function found after pass "TriggerVerifierErrorPass", compilation aborted!
12+
13+
define i32 @main() {
14+
entry:
15+
%retval = alloca i32, align 4
16+
store i32 0, ptr %retval, align 4
17+
ret i32 0
18+
}

0 commit comments

Comments
 (0)