diff --git a/test/tools/ossfuzz/protoToYul.cpp b/test/tools/ossfuzz/protoToYul.cpp index 7fa7e82079f5..ff9f5e50d72f 100644 --- a/test/tools/ossfuzz/protoToYul.cpp +++ b/test/tools/ossfuzz/protoToYul.cpp @@ -126,6 +126,12 @@ void ProtoConverter::visit(Expression const& _x) case Expression::kUnop: visit(_x.unop()); break; + case Expression::kTop: + visit(_x.top()); + break; + case Expression::kNop: + visit(_x.nop()); + break; case Expression::EXPR_ONEOF_NOT_SET: m_output << "1"; break; @@ -327,6 +333,89 @@ void ProtoConverter::visit(TernaryOp const& _x) m_output << ")"; } +void ProtoConverter::visit(NullaryOp const& _x) +{ + switch (_x.op()) + { + case NullaryOp::PC: + m_output << "pc()"; + break; + case NullaryOp::MSIZE: + m_output << "msize()"; + break; + case NullaryOp::GAS: + m_output << "gas()"; + break; + } +} + +void ProtoConverter::visit(LogFunc const& _x) +{ + switch (_x.num_topics()) + { + case LogFunc::ZERO: + m_output << "log0"; + m_output << "("; + visit(_x.pos()); + m_output << ", "; + visit(_x.size()); + m_output << ")\n"; + break; + case LogFunc::ONE: + m_output << "log1"; + m_output << "("; + visit(_x.pos()); + m_output << ", "; + visit(_x.size()); + m_output << ", "; + visit(_x.t1()); + m_output << ")\n"; + break; + case LogFunc::TWO: + m_output << "log2"; + m_output << "("; + visit(_x.pos()); + m_output << ", "; + visit(_x.size()); + m_output << ", "; + visit(_x.t1()); + m_output << ", "; + visit(_x.t2()); + m_output << ")\n"; + break; + case LogFunc::THREE: + m_output << "log3"; + m_output << "("; + visit(_x.pos()); + m_output << ", "; + visit(_x.size()); + m_output << ", "; + visit(_x.t1()); + m_output << ", "; + visit(_x.t2()); + m_output << ", "; + visit(_x.t3()); + m_output << ")\n"; + break; + case LogFunc::FOUR: + m_output << "log4"; + m_output << "("; + visit(_x.pos()); + m_output << ", "; + visit(_x.size()); + m_output << ", "; + visit(_x.t1()); + m_output << ", "; + visit(_x.t2()); + m_output << ", "; + visit(_x.t3()); + m_output << ", "; + visit(_x.t4()); + m_output << ")\n"; + break; + } +} + void ProtoConverter::visit(AssignmentStatement const& _x) { visit(_x.ref_id()); @@ -353,6 +442,9 @@ void ProtoConverter::visit(StoreFunc const& _x) case StoreFunc::SSTORE: m_output << "sstore("; break; + case StoreFunc::MSTORE8: + m_output << "mstore8("; + break; } visit(_x.loc()); m_output << ", "; @@ -440,6 +532,9 @@ void ProtoConverter::visit(Statement const& _x) if (m_inForScope.top()) m_output << "continue\n"; break; + case Statement::kLogFunc: + visit(_x.log_func()); + break; case Statement::STMT_ONEOF_NOT_SET: break; } diff --git a/test/tools/ossfuzz/protoToYul.h b/test/tools/ossfuzz/protoToYul.h index b9d800a25cd1..1e84133558cb 100644 --- a/test/tools/ossfuzz/protoToYul.h +++ b/test/tools/ossfuzz/protoToYul.h @@ -67,6 +67,8 @@ class ProtoConverter void visit(CaseStmt const&); void visit(SwitchStmt const&); void visit(TernaryOp const&); + void visit(NullaryOp const&); + void visit(LogFunc const&); template void visit(google::protobuf::RepeatedPtrField const& _repeated_field); diff --git a/test/tools/ossfuzz/yulProto.proto b/test/tools/ossfuzz/yulProto.proto index a18b89ffbc28..ff020b42db18 100644 --- a/test/tools/ossfuzz/yulProto.proto +++ b/test/tools/ossfuzz/yulProto.proto @@ -122,22 +122,51 @@ message TernaryOp { required Expression arg3 = 4; } +message NullaryOp { + enum NOp { + PC = 1; + MSIZE = 2; + GAS = 3; + } + required NOp op = 1; +} + message StoreFunc { enum Storage { MSTORE = 0; SSTORE = 1; + MSTORE8 = 2; } required Expression loc = 1; required Expression val = 2; required Storage st = 3; } +message LogFunc { + enum NumTopics { + ZERO = 0; + ONE = 1; + TWO = 2; + THREE = 3; + FOUR = 4; + } + required Expression pos = 1; + required Expression size = 2; + required NumTopics num_topics = 3; + required Expression t1 = 4; + required Expression t2 = 5; + required Expression t3 = 6; + required Expression t4 = 7; +} + message Expression { oneof expr_oneof { VarRef varref = 1; Literal cons = 2; BinaryOp binop = 3; UnaryOp unop = 4; + TernaryOp top = 5; + NullaryOp nop = 6; } } @@ -180,6 +209,7 @@ message Statement { SwitchStmt switchstmt = 7; BreakStmt breakstmt = 8; ContinueStmt contstmt = 9; + LogFunc log_func = 10; } }