From 6822fd4946f175af310b022d0c98dd4459308acb Mon Sep 17 00:00:00 2001 From: Alexander Arlt Date: Wed, 26 Apr 2023 19:48:09 -0500 Subject: [PATCH] [evmasm::Assembly] Fix createAssemblyItemFromJSON VERBATIM value check. --- libevmasm/Assembly.cpp | 2 +- .../asm_json_export_yul_verbatim/args | 1 + .../asm_json_export_yul_verbatim/output | 3 + .../asm_json_export_yul_verbatim/stdin | 11 + .../asm_json_import_verbatim/args | 1 + .../asm_json_import_verbatim/output | 58 ++++++ .../asm_json_import_verbatim/stdin | 196 ++++++++++++++++++ 7 files changed, 271 insertions(+), 1 deletion(-) create mode 100644 test/cmdlineTests/asm_json_export_yul_verbatim/args create mode 100644 test/cmdlineTests/asm_json_export_yul_verbatim/output create mode 100644 test/cmdlineTests/asm_json_export_yul_verbatim/stdin create mode 100644 test/cmdlineTests/asm_json_import_verbatim/args create mode 100644 test/cmdlineTests/asm_json_import_verbatim/output create mode 100644 test/cmdlineTests/asm_json_import_verbatim/stdin diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp index e5ca521f5..0a55733bf 100644 --- a/libevmasm/Assembly.cpp +++ b/libevmasm/Assembly.cpp @@ -270,7 +270,7 @@ AssemblyItem Assembly::createAssemblyItemFromJSON(Json::Value const& _json, std: } else if (name == "VERBATIM") { - requireValueUndefinedForInstruction(name, value); + requireValueDefinedForInstruction(name, value); AssemblyItem item(fromHex(value), 0, 0); result = item; } diff --git a/test/cmdlineTests/asm_json_export_yul_verbatim/args b/test/cmdlineTests/asm_json_export_yul_verbatim/args new file mode 100644 index 000000000..a639549cf --- /dev/null +++ b/test/cmdlineTests/asm_json_export_yul_verbatim/args @@ -0,0 +1 @@ +--strict-assembly - --asm-json diff --git a/test/cmdlineTests/asm_json_export_yul_verbatim/output b/test/cmdlineTests/asm_json_export_yul_verbatim/output new file mode 100644 index 000000000..675ea2087 --- /dev/null +++ b/test/cmdlineTests/asm_json_export_yul_verbatim/output @@ -0,0 +1,3 @@ + +======= (EVM) ======= +{".code":[{"begin":28,"end":29,"name":"PUSH","source":0,"value":"0"},{"begin":15,"end":30,"name":"CALLDATALOAD","source":0},{"begin":44,"end":46,"name":"PUSH","source":0,"value":"14"},{"begin":61,"end":62,"name":"DUP1","source":0},{"begin":58,"end":59,"name":"DUP3","source":0},{"begin":51,"end":63,"name":"SSTORE","source":0},{"begin":84,"end":86,"name":"PUSH","source":0,"value":"20"},{"begin":71,"end":87,"name":"CALLDATALOAD","source":0},{"begin":68,"end":188,"name":"ISZERO","source":0},{"begin":68,"end":188,"name":"PUSH [tag]","source":0,"value":"1"},{"begin":68,"end":188,"name":"JUMPI","source":0},{"begin":108,"end":109,"name":"DUP1","source":0},{"begin":105,"end":106,"name":"DUP3","source":0},{"begin":98,"end":110,"name":"SSTORE","source":0},{"begin":149,"end":150,"name":"PUSH","source":0,"value":"0"},{"begin":146,"end":147,"name":"DUP1","source":0},{"begin":143,"end":144,"name":"PUSH","source":0,"value":"0"},{"begin":140,"end":141,"name":"DUP1","source":0},{"begin":137,"end":138,"name":"PUSH","source":0,"value":"0"},{"begin":134,"end":135,"name":"DUP1","source":0},{"begin":123,"end":151,"name":"STATICCALL","source":0},{"begin":119,"end":152,"name":"POP","source":0},{"begin":161,"end":182,"name":"VERBATIM","source":0,"value":"78797a"},{"begin":68,"end":188,"name":"tag","source":0,"value":"1"},{"begin":68,"end":188,"name":"JUMPDEST","source":0},{"begin":203,"end":204,"name":"DUP1","source":0},{"begin":200,"end":201,"name":"DUP3","source":0},{"begin":193,"end":205,"name":"SSTORE","source":0},{"begin":0,"end":207,"name":"POP","source":0},{"begin":0,"end":207,"name":"POP","source":0}],"sourceList":[""]} diff --git a/test/cmdlineTests/asm_json_export_yul_verbatim/stdin b/test/cmdlineTests/asm_json_export_yul_verbatim/stdin new file mode 100644 index 000000000..eac2ef83d --- /dev/null +++ b/test/cmdlineTests/asm_json_export_yul_verbatim/stdin @@ -0,0 +1,11 @@ +{ + let a := calldataload(0) + let b := 20 + sstore(a, b) + if calldataload(32) { + sstore(a, b) + pop(staticcall(0, 0, 0, 0, 0, 0)) + verbatim_0i_0o("xyz") + } + sstore(a, b) +} diff --git a/test/cmdlineTests/asm_json_import_verbatim/args b/test/cmdlineTests/asm_json_import_verbatim/args new file mode 100644 index 000000000..2b4b3a153 --- /dev/null +++ b/test/cmdlineTests/asm_json_import_verbatim/args @@ -0,0 +1 @@ +--import-asm-json - --opcodes --asm diff --git a/test/cmdlineTests/asm_json_import_verbatim/output b/test/cmdlineTests/asm_json_import_verbatim/output new file mode 100644 index 000000000..b2cea96a6 --- /dev/null +++ b/test/cmdlineTests/asm_json_import_verbatim/output @@ -0,0 +1,58 @@ +Opcodes: +PUSH1 0x0 CALLDATALOAD PUSH1 0x14 DUP1 DUP3 SSTORE PUSH1 0x20 CALLDATALOAD ISZERO PUSH1 0x20 JUMPI DUP1 DUP3 SSTORE PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 STATICCALL POP PUSH25 0x797A5B80825550500000000000000000000000000000000000 +EVM assembly: + /* "":28:29 b */ + 0x00 + /* "":15:30 {... */ + calldataload + /* "":44:46 */ + 0x14 + /* "":61:62 */ + dup1 + /* "":58:59 */ + dup3 + /* "":51:63 : 29,... */ + sstore + /* "":84:86 " */ + 0x20 + /* "":71:87 "PUSH",... */ + calldataload + /* "":68:188 ": "PUSH",... */ + iszero + tag_1 + jumpi + /* "":108:109 u */ + dup1 + /* "":105:106 v */ + dup3 + /* "":98:110 "value */ + sstore + /* "":149:150 */ + 0x00 + /* "":146:147 5 */ + dup1 + /* "":143:144 : */ + 0x00 + /* "":140:141 i */ + dup1 + /* "":137:138 b */ + 0x00 + /* "":134:135 */ + dup1 + /* "":123:151 ... */ + staticcall + /* "":119:152 },... */ + pop + /* "":161:182 30,... */ + verbatimbytecode_78797a + /* "":68:188 ": "PUSH",... */ +tag_1: + /* "":203:204 s */ + dup1 + /* "":200:201 */ + dup3 + /* "":193:205 ",... */ + sstore + /* "":0:207 {... */ + pop + pop diff --git a/test/cmdlineTests/asm_json_import_verbatim/stdin b/test/cmdlineTests/asm_json_import_verbatim/stdin new file mode 100644 index 000000000..8c1d7300e --- /dev/null +++ b/test/cmdlineTests/asm_json_import_verbatim/stdin @@ -0,0 +1,196 @@ +{ + ".code": [ + { + "begin": 28, + "end": 29, + "name": "PUSH", + "source": 0, + "value": "0" + }, + { + "begin": 15, + "end": 30, + "name": "CALLDATALOAD", + "source": 0 + }, + { + "begin": 44, + "end": 46, + "name": "PUSH", + "source": 0, + "value": "14" + }, + { + "begin": 61, + "end": 62, + "name": "DUP1", + "source": 0 + }, + { + "begin": 58, + "end": 59, + "name": "DUP3", + "source": 0 + }, + { + "begin": 51, + "end": 63, + "name": "SSTORE", + "source": 0 + }, + { + "begin": 84, + "end": 86, + "name": "PUSH", + "source": 0, + "value": "20" + }, + { + "begin": 71, + "end": 87, + "name": "CALLDATALOAD", + "source": 0 + }, + { + "begin": 68, + "end": 188, + "name": "ISZERO", + "source": 0 + }, + { + "begin": 68, + "end": 188, + "name": "PUSH [tag]", + "source": 0, + "value": "1" + }, + { + "begin": 68, + "end": 188, + "name": "JUMPI", + "source": 0 + }, + { + "begin": 108, + "end": 109, + "name": "DUP1", + "source": 0 + }, + { + "begin": 105, + "end": 106, + "name": "DUP3", + "source": 0 + }, + { + "begin": 98, + "end": 110, + "name": "SSTORE", + "source": 0 + }, + { + "begin": 149, + "end": 150, + "name": "PUSH", + "source": 0, + "value": "0" + }, + { + "begin": 146, + "end": 147, + "name": "DUP1", + "source": 0 + }, + { + "begin": 143, + "end": 144, + "name": "PUSH", + "source": 0, + "value": "0" + }, + { + "begin": 140, + "end": 141, + "name": "DUP1", + "source": 0 + }, + { + "begin": 137, + "end": 138, + "name": "PUSH", + "source": 0, + "value": "0" + }, + { + "begin": 134, + "end": 135, + "name": "DUP1", + "source": 0 + }, + { + "begin": 123, + "end": 151, + "name": "STATICCALL", + "source": 0 + }, + { + "begin": 119, + "end": 152, + "name": "POP", + "source": 0 + }, + { + "begin": 161, + "end": 182, + "name": "VERBATIM", + "source": 0, + "value": "78797a" + }, + { + "begin": 68, + "end": 188, + "name": "tag", + "source": 0, + "value": "1" + }, + { + "begin": 68, + "end": 188, + "name": "JUMPDEST", + "source": 0 + }, + { + "begin": 203, + "end": 204, + "name": "DUP1", + "source": 0 + }, + { + "begin": 200, + "end": 201, + "name": "DUP3", + "source": 0 + }, + { + "begin": 193, + "end": 205, + "name": "SSTORE", + "source": 0 + }, + { + "begin": 0, + "end": 207, + "name": "POP", + "source": 0 + }, + { + "begin": 0, + "end": 207, + "name": "POP", + "source": 0 + } + ], + "sourceList": [ + "" + ] +}