17#define GEN_PASS_DEF_GENERATERUNTIMEVERIFICATIONPASS
18#include "mlir/Transforms/Passes.h.inc"
24struct GenerateRuntimeVerificationPass
25 :
public impl::GenerateRuntimeVerificationPassBase<
26 GenerateRuntimeVerificationPass> {
27 using impl::GenerateRuntimeVerificationPassBase<
28 GenerateRuntimeVerificationPass>::GenerateRuntimeVerificationPassBase;
29 void runOnOperation()
override;
41class DefaultErrMsgGenerator {
47 DefaultErrMsgGenerator(
unsigned verboseLevel, AsmState &asmState)
48 : vLevel(verboseLevel), state(asmState) {}
50 std::string operator()(Operation *op, StringRef msg) {
52 llvm::raw_string_ostream stream(buffer);
53 stream <<
"ERROR: Runtime op verification failed\n";
55 op->
print(stream, state);
56 stream <<
"\n^ " << msg;
58 stream <<
"^ " << msg;
60 stream <<
"\nLocation: ";
65 unsigned getVerboseLevel()
const {
return vLevel; }
69void GenerateRuntimeVerificationPass::runOnOperation() {
71 if (verboseLevel > 1) {
72 getOperation()->emitError(
73 "generate-runtime-verification pass: set verboseLevel to 0 or 1");
81 SmallVector<RuntimeVerifiableOpInterface> ops;
82 getOperation()->walk([&](RuntimeVerifiableOpInterface verifiableOp) {
83 ops.push_back(verifiableOp);
88 OpPrintingFlags flags;
92 AsmState state(getOperation(), flags);
95 DefaultErrMsgGenerator defaultErrMsgGenerator(verboseLevel.getValue(), state);
97 OpBuilder builder(getOperation()->
getContext());
98 for (RuntimeVerifiableOpInterface verifiableOp : ops) {
99 builder.setInsertionPoint(verifiableOp);
100 verifiableOp.generateRuntimeVerification(builder, verifiableOp.getLoc(),
101 defaultErrMsgGenerator);
void print(raw_ostream &os) const
Print the location.
OpPrintingFlags & elideLargeElementsAttrs(int64_t largeElementLimit=16)
Enables the elision of large elements attributes by printing a lexically valid but otherwise meaningl...
OpPrintingFlags & useLocalScope(bool enable=true)
Use local scope when printing the operation.
OpPrintingFlags & skipRegions(bool skip=true)
Skip printing regions.
Location getLoc()
The source location the operation was defined or derived from.
void print(raw_ostream &os, const OpPrintingFlags &flags={})
Include the generated interface declarations.