mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #7344 from ethereum/yul-add-more-blockchain-opcodes
Yul proto fuzzer: Additional blockchain opcodes
This commit is contained in:
commit
049e950085
@ -152,6 +152,12 @@ void ProtoConverter::visit(Expression const& _x)
|
||||
else
|
||||
m_output << dictionaryToken();
|
||||
break;
|
||||
case Expression::kLowcall:
|
||||
visit(_x.lowcall());
|
||||
break;
|
||||
case Expression::kCreate:
|
||||
visit(_x.create());
|
||||
break;
|
||||
case Expression::EXPR_ONEOF_NOT_SET:
|
||||
m_output << dictionaryToken();
|
||||
break;
|
||||
@ -337,6 +343,12 @@ void ProtoConverter::visit(UnaryOp const& _x)
|
||||
case UnaryOp::EXTCODEHASH:
|
||||
m_output << "extcodehash";
|
||||
break;
|
||||
case UnaryOp::BALANCE:
|
||||
m_output << "balance";
|
||||
break;
|
||||
case UnaryOp::BLOCKHASH:
|
||||
m_output << "blockhash";
|
||||
break;
|
||||
}
|
||||
m_output << "(";
|
||||
visit(_x.operand());
|
||||
@ -385,6 +397,36 @@ void ProtoConverter::visit(NullaryOp const& _x)
|
||||
case NullaryOp::RETURNDATASIZE:
|
||||
m_output << "returndatasize()";
|
||||
break;
|
||||
case NullaryOp::ADDRESS:
|
||||
m_output << "address()";
|
||||
break;
|
||||
case NullaryOp::ORIGIN:
|
||||
m_output << "origin()";
|
||||
break;
|
||||
case NullaryOp::CALLER:
|
||||
m_output << "caller()";
|
||||
break;
|
||||
case NullaryOp::CALLVALUE:
|
||||
m_output << "callvalue()";
|
||||
break;
|
||||
case NullaryOp::GASPRICE:
|
||||
m_output << "gasprice()";
|
||||
break;
|
||||
case NullaryOp::COINBASE:
|
||||
m_output << "coinbase()";
|
||||
break;
|
||||
case NullaryOp::TIMESTAMP:
|
||||
m_output << "timestamp()";
|
||||
break;
|
||||
case NullaryOp::NUMBER:
|
||||
m_output << "number()";
|
||||
break;
|
||||
case NullaryOp::DIFFICULTY:
|
||||
m_output << "difficulty()";
|
||||
break;
|
||||
case NullaryOp::GASLIMIT:
|
||||
m_output << "gaslimit()";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -677,6 +719,68 @@ void ProtoConverter::visit(FunctionCall const& _x)
|
||||
}
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(LowLevelCall const& _x)
|
||||
{
|
||||
LowLevelCall_Type type = _x.callty();
|
||||
switch (type)
|
||||
{
|
||||
case LowLevelCall::CALL:
|
||||
m_output << "call(";
|
||||
break;
|
||||
case LowLevelCall::CALLCODE:
|
||||
m_output << "callcode(";
|
||||
break;
|
||||
case LowLevelCall::DELEGATECALL:
|
||||
m_output << "delegatecall(";
|
||||
break;
|
||||
case LowLevelCall::STATICCALL:
|
||||
m_output << "staticcall(";
|
||||
break;
|
||||
}
|
||||
visit(_x.gas());
|
||||
m_output << ", ";
|
||||
visit(_x.addr());
|
||||
m_output << ", ";
|
||||
if (type == LowLevelCall::CALL || LowLevelCall::CALLCODE)
|
||||
{
|
||||
visit(_x.wei());
|
||||
m_output << ", ";
|
||||
}
|
||||
visit(_x.in());
|
||||
m_output << ", ";
|
||||
visit(_x.insize());
|
||||
m_output << ", ";
|
||||
visit(_x.out());
|
||||
m_output << ", ";
|
||||
visit(_x.outsize());
|
||||
m_output << ")";
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(Create const& _x)
|
||||
{
|
||||
Create_Type type = _x.createty();
|
||||
switch (type)
|
||||
{
|
||||
case Create::CREATE:
|
||||
m_output << "create(";
|
||||
break;
|
||||
case Create::CREATE2:
|
||||
m_output << "create2(";
|
||||
break;
|
||||
}
|
||||
visit(_x.wei());
|
||||
m_output << ", ";
|
||||
visit(_x.position());
|
||||
m_output << ", ";
|
||||
visit(_x.size());
|
||||
if (type == Create::CREATE2)
|
||||
{
|
||||
m_output << ", ";
|
||||
visit(_x.value());
|
||||
}
|
||||
m_output << ")";
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(IfStmt const& _x)
|
||||
{
|
||||
m_output << "if ";
|
||||
@ -947,6 +1051,9 @@ void ProtoConverter::visit(Statement const& _x)
|
||||
if (!m_inForInitScope)
|
||||
visit(_x.funcdef());
|
||||
break;
|
||||
case Statement::kPop:
|
||||
visit(_x.pop());
|
||||
break;
|
||||
case Statement::STMT_ONEOF_NOT_SET:
|
||||
break;
|
||||
}
|
||||
@ -1233,6 +1340,13 @@ void ProtoConverter::visit(FunctionDef const& _x)
|
||||
createFunctionDefAndCall(_x, numInParams, numOutParams);
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(PopStmt const& _x)
|
||||
{
|
||||
m_output << "pop(";
|
||||
visit(_x.expr());
|
||||
m_output << ")\n";
|
||||
}
|
||||
|
||||
void ProtoConverter::visit(Program const& _x)
|
||||
{
|
||||
// Initialize input size
|
||||
|
@ -85,6 +85,9 @@ private:
|
||||
void visit(TerminatingStmt const&);
|
||||
void visit(FunctionCall const&);
|
||||
void visit(FunctionDef const&);
|
||||
void visit(PopStmt const&);
|
||||
void visit(LowLevelCall const&);
|
||||
void visit(Create const&);
|
||||
void visit(Program const&);
|
||||
|
||||
/// Creates a new scope, and adds @a _funcParams to it if it
|
||||
|
@ -21,6 +21,37 @@ message VarDecl {
|
||||
required Expression expr = 1;
|
||||
}
|
||||
|
||||
message LowLevelCall {
|
||||
enum Type {
|
||||
CALL = 0;
|
||||
CALLCODE = 1;
|
||||
DELEGATECALL = 2;
|
||||
STATICCALL = 3;
|
||||
}
|
||||
required Type callty = 1;
|
||||
required Expression gas = 2;
|
||||
required Expression addr = 3;
|
||||
// Valid for call and callcode only
|
||||
required Expression wei = 4;
|
||||
required Expression in = 5;
|
||||
required Expression insize = 6;
|
||||
required Expression out = 7;
|
||||
required Expression outsize = 8;
|
||||
}
|
||||
|
||||
message Create {
|
||||
enum Type {
|
||||
CREATE = 0;
|
||||
CREATE2 = 1;
|
||||
}
|
||||
required Type createty = 1;
|
||||
required Expression wei = 2;
|
||||
required Expression position = 3;
|
||||
required Expression size = 4;
|
||||
// Valid for create2 only
|
||||
required Expression value = 5;
|
||||
}
|
||||
|
||||
message FunctionCall {
|
||||
enum Returns {
|
||||
ZERO = 1;
|
||||
@ -129,6 +160,8 @@ message UnaryOp {
|
||||
CALLDATALOAD = 4;
|
||||
EXTCODESIZE = 5;
|
||||
EXTCODEHASH = 6;
|
||||
BALANCE = 7;
|
||||
BLOCKHASH = 8;
|
||||
}
|
||||
required UOp op = 1;
|
||||
required Expression operand = 2;
|
||||
@ -172,6 +205,16 @@ message NullaryOp {
|
||||
CALLDATASIZE = 4;
|
||||
CODESIZE = 5;
|
||||
RETURNDATASIZE = 6;
|
||||
ADDRESS = 7;
|
||||
ORIGIN = 8;
|
||||
CALLER = 9;
|
||||
CALLVALUE = 10;
|
||||
GASPRICE = 11;
|
||||
COINBASE = 12;
|
||||
TIMESTAMP = 13;
|
||||
NUMBER = 14;
|
||||
DIFFICULTY = 15;
|
||||
GASLIMIT = 16;
|
||||
}
|
||||
required NOp op = 1;
|
||||
}
|
||||
@ -213,6 +256,8 @@ message Expression {
|
||||
TernaryOp top = 5;
|
||||
NullaryOp nop = 6;
|
||||
FunctionCall func_expr = 7;
|
||||
LowLevelCall lowcall = 8;
|
||||
Create create = 9;
|
||||
}
|
||||
}
|
||||
|
||||
@ -287,6 +332,10 @@ message FunctionDef {
|
||||
required Block block = 3;
|
||||
}
|
||||
|
||||
message PopStmt {
|
||||
required Expression expr = 1;
|
||||
}
|
||||
|
||||
message Statement {
|
||||
oneof stmt_oneof {
|
||||
VarDecl decl = 1;
|
||||
@ -305,6 +354,7 @@ message Statement {
|
||||
FunctionCall functioncall = 14;
|
||||
BoundedForStmt boundedforstmt = 15;
|
||||
FunctionDef funcdef = 16;
|
||||
PopStmt pop = 17;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user