@@ -1283,6 +1283,28 @@ struct NewOpLowering : public OpConversionPattern<sol::NewOp> {
12831283 }
12841284};
12851285
1286+ struct CodeOpLowering : public OpConversionPattern <sol::CodeOp> {
1287+ using OpConversionPattern<sol::CodeOp>::OpConversionPattern;
1288+
1289+ LogicalResult matchAndRewrite (sol::CodeOp op, OpAdaptor adaptor,
1290+ ConversionPatternRewriter &r) const override {
1291+
1292+ Location loc = op.getLoc ();
1293+ solidity::mlirgen::BuilderExt bExt (r, loc);
1294+ evm::Builder evmB (r, loc);
1295+
1296+ auto extCodeSize = r.create <yul::ExtCodeSizeOp>(loc, adaptor.getContAddr ());
1297+ Value alloc = evmB.genMemAlloc (op.getType (), /* zeroInit=*/ false ,
1298+ /* initVals=*/ {}, extCodeSize);
1299+ auto codeAddr = evmB.genDataAddrPtr (alloc, sol::DataLocation::Memory);
1300+ r.create <yul::ExtCodeCopyOp>(
1301+ loc, adaptor.getContAddr (), /* dstOffset=*/ codeAddr,
1302+ /* srcOffset=*/ bExt.genI256Const (0 ), extCodeSize);
1303+ r.replaceOp (op, alloc);
1304+ return success ();
1305+ }
1306+ };
1307+
12861308struct TryOpLowering : public OpConversionPattern <sol::TryOp> {
12871309 using OpConversionPattern<sol::TryOp>::OpConversionPattern;
12881310
@@ -2231,8 +2253,8 @@ void evm::populateAbiPats(mlir::RewritePatternSet &pats,
22312253}
22322254
22332255void evm::populateExtCallPat (RewritePatternSet &pats, TypeConverter &tyConv) {
2234- pats.add <ExtCallOpLowering, TryOpLowering, NewOpLowering>(tyConv,
2235- pats.getContext ());
2256+ pats.add <ExtCallOpLowering, TryOpLowering, NewOpLowering, CodeOpLowering>(
2257+ tyConv, pats.getContext ());
22362258}
22372259
22382260void evm::populateEmitPat (RewritePatternSet &pats, TypeConverter &tyConv) {
0 commit comments