@@ -2252,6 +2252,26 @@ struct TryOpLowering : public OpConversionPattern<sol::TryOp> {
22522252 }
22532253};
22542254
2255+ struct AssertOpLowering : public OpConversionPattern <sol::AssertOp> {
2256+ using OpConversionPattern<sol::AssertOp>::OpConversionPattern;
2257+
2258+ LogicalResult matchAndRewrite (sol::AssertOp op, OpAdaptor adaptor,
2259+ ConversionPatternRewriter &r) const override {
2260+ Location loc = op.getLoc ();
2261+ evm::Builder evmB (r, loc);
2262+
2263+ // Generate: if (!cond) { panic(0x01) }
2264+ mlir::Value falseVal =
2265+ r.create <arith::ConstantIntOp>(loc, r.getI1Type (), 0 );
2266+ mlir::Value negCond = r.create <arith::CmpIOp>(loc, arith::CmpIPredicate::eq,
2267+ op.getCond (), falseVal);
2268+ evmB.genPanic (evm::PanicCode::Assert, negCond);
2269+
2270+ r.eraseOp (op);
2271+ return success ();
2272+ }
2273+ };
2274+
22552275struct RequireOpLowering : public OpConversionPattern <sol::RequireOp> {
22562276 using OpConversionPattern<sol::RequireOp>::OpConversionPattern;
22572277
@@ -2333,8 +2353,20 @@ struct RevertOpLowering : public OpConversionPattern<sol::RevertOp> {
23332353 LogicalResult matchAndRewrite (sol::RevertOp op, OpAdaptor adaptor,
23342354 ConversionPatternRewriter &r) const override {
23352355 evm::Builder evmB (r, op.getLoc ());
2336- evmB.genRevert (op.getArgs ().getTypes (), adaptor.getArgs (),
2337- op.getSignature ());
2356+ if (op.getCall ()) {
2357+ // revert ErrorName(...)
2358+ assert (!op.getSignature ().empty ());
2359+ evmB.genRevert (op.getArgs ().getTypes (), adaptor.getArgs (),
2360+ op.getSignature ());
2361+ } else if (!op.getSignature ().empty ()) {
2362+ // revert("reason")
2363+ evmB.genRevertWithMsg (op.getSignature ().str ());
2364+ } else {
2365+ // revert()
2366+ mlir::solgen::BuilderExt bExt (r, op.getLoc ());
2367+ mlir::Value zero = bExt.genI256Const (0 );
2368+ r.create <yul::RevertOp>(op.getLoc (), zero, zero);
2369+ }
23382370 r.eraseOp (op);
23392371 return success ();
23402372 }
@@ -3050,7 +3082,7 @@ void evm::populateEmitPat(RewritePatternSet &pats, TypeConverter &tyConv) {
30503082}
30513083
30523084void evm::populateRequirePat (RewritePatternSet &pats) {
3053- pats.add <RequireOpLowering>(pats.getContext ());
3085+ pats.add <RequireOpLowering, AssertOpLowering >(pats.getContext ());
30543086}
30553087
30563088void evm::populateContractPat (RewritePatternSet &pats) {
0 commit comments