From 0602fcde6e03bc08b0a333b291d8fe45cb4f56e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 13:31:00 +0100 Subject: [PATCH 01/28] Reimplement no-op version of DLOG to avoid C++ compiler warning --- libevmjit/Utils.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libevmjit/Utils.h b/libevmjit/Utils.h index 7e10e0c63..0caf5e1bd 100644 --- a/libevmjit/Utils.h +++ b/libevmjit/Utils.h @@ -20,5 +20,21 @@ std::ostream& getLogStream(char const* _channel); #define DLOG(CHANNEL) ::dev::evmjit::getLogStream(#CHANNEL) #else // Release - #define DLOG(CHANNEL) true ? std::cerr : std::cerr + +namespace dev +{ +namespace evmjit +{ + +struct Voider +{ + void operator=(std::ostream const&) {} +}; + +} +} + + +#define DLOG(CHANNEL) true ? (void)0 : ::dev::evmjit::Voider{} = std::cerr + #endif From 248ea444e263a2167e95bb41224811d64d2f4fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 15:03:23 +0100 Subject: [PATCH 02/28] Move old VM arithmetic tests from EVM JIT to JSON file --- evmcc/test/arith/addmod.evm | 1 - evmcc/test/arith/addmod.lll | 12 ------- evmcc/test/arith/arith1.evm | 1 - evmcc/test/arith/arith1.lll | 37 --------------------- evmcc/test/arith/arith_bnot.evm | 1 - evmcc/test/arith/arith_bnot.lll | 14 -------- evmcc/test/arith/div.evm | 1 - evmcc/test/arith/div.lll | 10 ------ evmcc/test/arith/fib1.evm | 1 - evmcc/test/arith/fib1.lll | 57 --------------------------------- evmcc/test/arith/mul.evm | 1 - evmcc/test/arith/mul.lll | 13 -------- evmcc/test/arith/mulmod.evm | 1 - evmcc/test/arith/mulmod.lll | 12 ------- evmcc/test/except/badinst1.evm | 1 - 15 files changed, 163 deletions(-) delete mode 100644 evmcc/test/arith/addmod.evm delete mode 100644 evmcc/test/arith/addmod.lll delete mode 100644 evmcc/test/arith/arith1.evm delete mode 100644 evmcc/test/arith/arith1.lll delete mode 100644 evmcc/test/arith/arith_bnot.evm delete mode 100644 evmcc/test/arith/arith_bnot.lll delete mode 100644 evmcc/test/arith/div.evm delete mode 100644 evmcc/test/arith/div.lll delete mode 100644 evmcc/test/arith/fib1.evm delete mode 100644 evmcc/test/arith/fib1.lll delete mode 100644 evmcc/test/arith/mul.evm delete mode 100644 evmcc/test/arith/mul.lll delete mode 100644 evmcc/test/arith/mulmod.evm delete mode 100644 evmcc/test/arith/mulmod.lll delete mode 100644 evmcc/test/except/badinst1.evm diff --git a/evmcc/test/arith/addmod.evm b/evmcc/test/arith/addmod.evm deleted file mode 100644 index 4ca71e065..000000000 --- a/evmcc/test/arith/addmod.evm +++ /dev/null @@ -1 +0,0 @@ -60646107b760271460005560006001f2 diff --git a/evmcc/test/arith/addmod.lll b/evmcc/test/arith/addmod.lll deleted file mode 100644 index 11a6b2cb9..000000000 --- a/evmcc/test/arith/addmod.lll +++ /dev/null @@ -1,12 +0,0 @@ -;; Should return (1975 + 39) `mod` 100 = 14 = 0x0e -(asm -100 -1975 -39 -ADDMOD -0 -MSTORE8 -0 -1 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/arith/arith1.evm b/evmcc/test/arith/arith1.evm deleted file mode 100644 index c7a029f52..000000000 --- a/evmcc/test/arith/arith1.evm +++ /dev/null @@ -1 +0,0 @@ -60016001900160070260050160029004600490066021900560150160030260059007600303600960110860005460086000f2 diff --git a/evmcc/test/arith/arith1.lll b/evmcc/test/arith/arith1.lll deleted file mode 100644 index 4757a7420..000000000 --- a/evmcc/test/arith/arith1.lll +++ /dev/null @@ -1,37 +0,0 @@ - -(asm -1 -1 -SWAP1 -ADD ;; 2 -7 -MUL ;; 14 -5 -ADD ;; 19 -2 -SWAP1 -DIV ;; 9 -4 -SWAP1 -MOD ;; 1 -33 -SWAP1 -SDIV;; 0 -21 -ADD ;; 21 -3 -MUL ;; 63 -5 -SWAP1 -SMOD;; 3 -3 -SUB ;; 0 -9 -17 -EXP ;; 17^9 -0 -MSTORE -8 -0 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/arith/arith_bnot.evm b/evmcc/test/arith/arith_bnot.evm deleted file mode 100644 index 4cfaf8f55..000000000 --- a/evmcc/test/arith/arith_bnot.evm +++ /dev/null @@ -1 +0,0 @@ -6201e2406000546000530960005460206000f2 diff --git a/evmcc/test/arith/arith_bnot.lll b/evmcc/test/arith/arith_bnot.lll deleted file mode 100644 index a83b05a9a..000000000 --- a/evmcc/test/arith/arith_bnot.lll +++ /dev/null @@ -1,14 +0,0 @@ - -(asm -123456 -0 -MSTORE -0 -MLOAD -BNOT -0 -MSTORE -32 -0 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/arith/div.evm b/evmcc/test/arith/div.evm deleted file mode 100644 index b68d5d202..000000000 --- a/evmcc/test/arith/div.evm +++ /dev/null @@ -1 +0,0 @@ -60027ffedcba9876543210fedcba9876543210fedcba9876543210fedcba98765432100460005460206000f2 diff --git a/evmcc/test/arith/div.lll b/evmcc/test/arith/div.lll deleted file mode 100644 index 72c22bfdc..000000000 --- a/evmcc/test/arith/div.lll +++ /dev/null @@ -1,10 +0,0 @@ -(asm -0x2 -0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210 -DIV -0 -MSTORE -32 -0 -RETURN -) diff --git a/evmcc/test/arith/fib1.evm b/evmcc/test/arith/fib1.evm deleted file mode 100644 index 4c141314e..000000000 --- a/evmcc/test/arith/fib1.evm +++ /dev/null @@ -1 +0,0 @@ -60016001818101818101818101818101818101818101818101818101818101818101818101818101818101818101818101818101818101 diff --git a/evmcc/test/arith/fib1.lll b/evmcc/test/arith/fib1.lll deleted file mode 100644 index 286bed275..000000000 --- a/evmcc/test/arith/fib1.lll +++ /dev/null @@ -1,57 +0,0 @@ -;; Fibbonacci unrolled - -(asm -1 -1 -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -DUP2 -DUP2 -ADD -) \ No newline at end of file diff --git a/evmcc/test/arith/mul.evm b/evmcc/test/arith/mul.evm deleted file mode 100644 index 7e8afd268..000000000 --- a/evmcc/test/arith/mul.evm +++ /dev/null @@ -1 +0,0 @@ -7001234567890abcdef0fedcba09876543217001234567890abcdef0fedcba09876543217001234567890abcdef0fedcba0987654321020260005460206000f2 diff --git a/evmcc/test/arith/mul.lll b/evmcc/test/arith/mul.lll deleted file mode 100644 index b0fa343bb..000000000 --- a/evmcc/test/arith/mul.lll +++ /dev/null @@ -1,13 +0,0 @@ -(asm -0x1234567890abcdef0fedcba0987654321 -0x1234567890abcdef0fedcba0987654321 -0x1234567890abcdef0fedcba0987654321 -MUL -MUL -0 -MSTORE -32 -0 -RETURN -;; 47d0817e4167b1eb4f9fc722b133ef9d7d9a6fb4c2c1c442d000107a5e419561 -) diff --git a/evmcc/test/arith/mulmod.evm b/evmcc/test/arith/mulmod.evm deleted file mode 100644 index e34a06154..000000000 --- a/evmcc/test/arith/mulmod.evm +++ /dev/null @@ -1 +0,0 @@ -6064601b60251560005560006001f2 diff --git a/evmcc/test/arith/mulmod.lll b/evmcc/test/arith/mulmod.lll deleted file mode 100644 index 5e87f0843..000000000 --- a/evmcc/test/arith/mulmod.lll +++ /dev/null @@ -1,12 +0,0 @@ -;; Should return (27 * 37) `mod` 100 = 99 = 0x63 -(asm -100 -27 -37 -MULMOD -0 -MSTORE8 -0 -1 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/except/badinst1.evm b/evmcc/test/except/badinst1.evm deleted file mode 100644 index 69aadac5e..000000000 --- a/evmcc/test/except/badinst1.evm +++ /dev/null @@ -1 +0,0 @@ -4a From ee3a2d7557c4806424e5a47f27e7d91431ca5640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 15:13:26 +0100 Subject: [PATCH 03/28] Move old VM environmental test from EVM JIT to JSON file --- evmcc/test/ext/calldatacopy1.evm | 1 - evmcc/test/ext/calldatacopy1.lll | 13 -------- evmcc/test/ext/calldatacopy2.evm | 1 - evmcc/test/ext/calldatacopy2.lll | 13 -------- evmcc/test/ext/codecopy1.evm | 1 - evmcc/test/ext/codecopy1.lll | 13 -------- evmcc/test/ext/codecopy2.evm | 1 - evmcc/test/ext/codecopy2.lll | 13 -------- evmcc/test/ext/codecopy3.evm | 1 - evmcc/test/ext/codecopy3.lll | 13 -------- evmcc/test/ext/ext_test.evm | 1 - evmcc/test/ext/ext_test.lll | 55 -------------------------------- evmcc/test/ext/extcodecopy1.evm | 1 - evmcc/test/ext/extcodecopy1.lll | 11 ------- evmcc/test/ext/store_delete.evm | 1 - evmcc/test/ext/store_delete.lll | 9 ------ evmcc/test/ext/store_test.evm | 1 - evmcc/test/ext/store_test.lll | 14 -------- 18 files changed, 163 deletions(-) delete mode 100644 evmcc/test/ext/calldatacopy1.evm delete mode 100644 evmcc/test/ext/calldatacopy1.lll delete mode 100644 evmcc/test/ext/calldatacopy2.evm delete mode 100644 evmcc/test/ext/calldatacopy2.lll delete mode 100644 evmcc/test/ext/codecopy1.evm delete mode 100644 evmcc/test/ext/codecopy1.lll delete mode 100644 evmcc/test/ext/codecopy2.evm delete mode 100644 evmcc/test/ext/codecopy2.lll delete mode 100644 evmcc/test/ext/codecopy3.evm delete mode 100644 evmcc/test/ext/codecopy3.lll delete mode 100644 evmcc/test/ext/ext_test.evm delete mode 100644 evmcc/test/ext/ext_test.lll delete mode 100644 evmcc/test/ext/extcodecopy1.evm delete mode 100644 evmcc/test/ext/extcodecopy1.lll delete mode 100644 evmcc/test/ext/store_delete.evm delete mode 100644 evmcc/test/ext/store_delete.lll delete mode 100644 evmcc/test/ext/store_test.evm delete mode 100644 evmcc/test/ext/store_test.lll diff --git a/evmcc/test/ext/calldatacopy1.evm b/evmcc/test/ext/calldatacopy1.evm deleted file mode 100644 index f20019651..000000000 --- a/evmcc/test/ext/calldatacopy1.evm +++ /dev/null @@ -1 +0,0 @@ -60326000600a37600053600a6014f2 diff --git a/evmcc/test/ext/calldatacopy1.lll b/evmcc/test/ext/calldatacopy1.lll deleted file mode 100644 index 3d2ae0a78..000000000 --- a/evmcc/test/ext/calldatacopy1.lll +++ /dev/null @@ -1,13 +0,0 @@ -(asm -50 ;; byte count -0 ;; source index in calldata array -10 ;; dest index in memory -CALLDATACOPY - -0 -MLOAD ;; to dump memory - -10 -20 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/calldatacopy2.evm b/evmcc/test/ext/calldatacopy2.evm deleted file mode 100644 index e8eea8da7..000000000 --- a/evmcc/test/ext/calldatacopy2.evm +++ /dev/null @@ -1 +0,0 @@ -606464e8d4a510006000376000536000600af2 diff --git a/evmcc/test/ext/calldatacopy2.lll b/evmcc/test/ext/calldatacopy2.lll deleted file mode 100644 index 6bbea48d8..000000000 --- a/evmcc/test/ext/calldatacopy2.lll +++ /dev/null @@ -1,13 +0,0 @@ -(asm -100 ;; byte count -1000000000000 ;; source index in calldata array -0 ;; dest index in memory -CALLDATACOPY - -0 -MLOAD ;; to dump memory - -0 -10 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/codecopy1.evm b/evmcc/test/ext/codecopy1.evm deleted file mode 100644 index d286f9232..000000000 --- a/evmcc/test/ext/codecopy1.evm +++ /dev/null @@ -1 +0,0 @@ -60146000600a39600053600a6014f2 diff --git a/evmcc/test/ext/codecopy1.lll b/evmcc/test/ext/codecopy1.lll deleted file mode 100644 index 85a02b5d7..000000000 --- a/evmcc/test/ext/codecopy1.lll +++ /dev/null @@ -1,13 +0,0 @@ -(asm -20 ;; byte count -0 ;; source index in code array -10 ;; dest index in memory -CODECOPY - -0 -MLOAD ;; to dump memory - -10 -20 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/codecopy2.evm b/evmcc/test/ext/codecopy2.evm deleted file mode 100644 index 71cd92525..000000000 --- a/evmcc/test/ext/codecopy2.evm +++ /dev/null @@ -1 +0,0 @@ -606464e8d4a510006000396000536000600af2 diff --git a/evmcc/test/ext/codecopy2.lll b/evmcc/test/ext/codecopy2.lll deleted file mode 100644 index dcbbcaa46..000000000 --- a/evmcc/test/ext/codecopy2.lll +++ /dev/null @@ -1,13 +0,0 @@ -(asm -100 ;; byte count -1000000000000 ;; source index in code array -0 ;; dest index in memory -CODECOPY - -0 -MLOAD ;; to dump memory - -0 -10 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/codecopy3.evm b/evmcc/test/ext/codecopy3.evm deleted file mode 100644 index e4b6a9253..000000000 --- a/evmcc/test/ext/codecopy3.evm +++ /dev/null @@ -1 +0,0 @@ -3860006000396000536000600af2 diff --git a/evmcc/test/ext/codecopy3.lll b/evmcc/test/ext/codecopy3.lll deleted file mode 100644 index 80d9982c6..000000000 --- a/evmcc/test/ext/codecopy3.lll +++ /dev/null @@ -1,13 +0,0 @@ -(asm -CODESIZE ;; byte count -0 ;; source index in code array -0 ;; dest index in memory -CODECOPY - -0 -MLOAD ;; to dump memory - -0 -10 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/ext_test.evm b/evmcc/test/ext/ext_test.evm deleted file mode 100644 index 580bd9675..000000000 --- a/evmcc/test/ext/ext_test.evm +++ /dev/null @@ -1 +0,0 @@ -5a3031333234363a4041424344455a36600035602635601335387f1111222233334444555566667777888899990000aaaabbbbccccddddeeeeffff600054602060006000f06020600060206000600030610bb8f1600053611000545b60200260002030ff60016002f2 diff --git a/evmcc/test/ext/ext_test.lll b/evmcc/test/ext/ext_test.lll deleted file mode 100644 index 3287ae95f..000000000 --- a/evmcc/test/ext/ext_test.lll +++ /dev/null @@ -1,55 +0,0 @@ - -(asm -PC -ADDRESS -BALANCE -CALLER -ORIGIN -CALLVALUE -CALLDATASIZE -GASPRICE -PREVHASH -COINBASE -TIMESTAMP -NUMBER -DIFFICULTY -GASLIMIT -PC -CALLDATASIZE -0 -CALLDATALOAD -38 -CALLDATALOAD -19 -CALLDATALOAD -CODESIZE -0x1111222233334444555566667777888899990000aaaabbbbccccddddeeeeffff -0 -MSTORE -32 -0 -0 -CREATE -32 -0 -32 -0 -0 -ADDRESS -3000 -CALL -0 -MLOAD -4096 -MSTORE -MSIZE -32 -MUL -0 -SHA3 -ADDRESS -SUICIDE -1 -2 -RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/extcodecopy1.evm b/evmcc/test/ext/extcodecopy1.evm deleted file mode 100644 index 6132b52d8..000000000 --- a/evmcc/test/ext/extcodecopy1.evm +++ /dev/null @@ -1 +0,0 @@ -60c86000600a303c60005360006020f2 diff --git a/evmcc/test/ext/extcodecopy1.lll b/evmcc/test/ext/extcodecopy1.lll deleted file mode 100644 index c37054574..000000000 --- a/evmcc/test/ext/extcodecopy1.lll +++ /dev/null @@ -1,11 +0,0 @@ -(asm -200 ;; byte count -0 ;; source index in code array -10 ;; dest index in memory -ADDRESS -EXTCODECOPY - -0 MLOAD ;; to dump memory - -0 32 RETURN -) \ No newline at end of file diff --git a/evmcc/test/ext/store_delete.evm b/evmcc/test/ext/store_delete.evm deleted file mode 100644 index d6acae03d..000000000 --- a/evmcc/test/ext/store_delete.evm +++ /dev/null @@ -1 +0,0 @@ -6104d26063576000606357 diff --git a/evmcc/test/ext/store_delete.lll b/evmcc/test/ext/store_delete.lll deleted file mode 100644 index 3d8f0f23a..000000000 --- a/evmcc/test/ext/store_delete.lll +++ /dev/null @@ -1,9 +0,0 @@ - -(asm -1234 -99 -SSTORE -0 -99 -SSTORE -) \ No newline at end of file diff --git a/evmcc/test/ext/store_test.evm b/evmcc/test/ext/store_test.evm deleted file mode 100644 index 54c9419b5..000000000 --- a/evmcc/test/ext/store_test.evm +++ /dev/null @@ -1 +0,0 @@ -607b607c60015760005760015660005603 diff --git a/evmcc/test/ext/store_test.lll b/evmcc/test/ext/store_test.lll deleted file mode 100644 index c40471c40..000000000 --- a/evmcc/test/ext/store_test.lll +++ /dev/null @@ -1,14 +0,0 @@ - -(asm -123 -124 -1 -SSTORE -0 -SSTORE -1 -SLOAD -0 -SLOAD -SUB -) \ No newline at end of file From 7d8015684d19b92ec61aa97adf0a680cef3cdd85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 15:25:28 +0100 Subject: [PATCH 04/28] Move old VM memory tests from EVM JIT to JSON file --- evmcc/test/mem/byte.evm | 1 - evmcc/test/mem/byte.lll | 105 ------------------------------------ evmcc/test/mem/mem2.evm | 1 - evmcc/test/mem/mem2.lll | 15 ------ evmcc/test/mem/memtest1.evm | 1 - evmcc/test/mem/memtest1.lll | 18 ------- evmcc/test/mem/mstore1.evm | 1 - evmcc/test/mem/mstore1.lll | 6 --- 8 files changed, 148 deletions(-) delete mode 100644 evmcc/test/mem/byte.evm delete mode 100644 evmcc/test/mem/byte.lll delete mode 100644 evmcc/test/mem/mem2.evm delete mode 100644 evmcc/test/mem/mem2.lll delete mode 100644 evmcc/test/mem/memtest1.evm delete mode 100644 evmcc/test/mem/memtest1.lll delete mode 100644 evmcc/test/mem/mstore1.evm delete mode 100644 evmcc/test/mem/mstore1.lll diff --git a/evmcc/test/mem/byte.evm b/evmcc/test/mem/byte.evm deleted file mode 100644 index ab63431ee..000000000 --- a/evmcc/test/mem/byte.evm +++ /dev/null @@ -1 +0,0 @@ -7f112233445566778899001122334455667788990011223344556677889900aabb6000137f112233445566778899001122334455667788990011223344556677889900aabb6001137f112233445566778899001122334455667788990011223344556677889900aabb6002137f112233445566778899001122334455667788990011223344556677889900aabb6003137f112233445566778899001122334455667788990011223344556677889900aabb6004137f112233445566778899001122334455667788990011223344556677889900aabb6005137f112233445566778899001122334455667788990011223344556677889900aabb6006137f112233445566778899001122334455667788990011223344556677889900aabb6007137f112233445566778899001122334455667788990011223344556677889900aabb6008137f112233445566778899001122334455667788990011223344556677889900aabb6009137f112233445566778899001122334455667788990011223344556677889900aabb600a137f112233445566778899001122334455667788990011223344556677889900aabb600b137f112233445566778899001122334455667788990011223344556677889900aabb600c137f112233445566778899001122334455667788990011223344556677889900aabb600d137f112233445566778899001122334455667788990011223344556677889900aabb600e137f112233445566778899001122334455667788990011223344556677889900aabb600f137f112233445566778899001122334455667788990011223344556677889900aabb6010137f112233445566778899001122334455667788990011223344556677889900aabb6011137f112233445566778899001122334455667788990011223344556677889900aabb6012137f112233445566778899001122334455667788990011223344556677889900aabb6013137f112233445566778899001122334455667788990011223344556677889900aabb6014137f112233445566778899001122334455667788990011223344556677889900aabb6015137f112233445566778899001122334455667788990011223344556677889900aabb6016137f112233445566778899001122334455667788990011223344556677889900aabb6017137f112233445566778899001122334455667788990011223344556677889900aabb6018137f112233445566778899001122334455667788990011223344556677889900aabb6019137f112233445566778899001122334455667788990011223344556677889900aabb601a137f112233445566778899001122334455667788990011223344556677889900aabb601b137f112233445566778899001122334455667788990011223344556677889900aabb601c137f112233445566778899001122334455667788990011223344556677889900aabb601d137f112233445566778899001122334455667788990011223344556677889900aabb601e137f112233445566778899001122334455667788990011223344556677889900aabb601f137f112233445566778899001122334455667788990011223344556677889900aabb6020137f112233445566778899001122334455667788990011223344556677889900aabb6107de13 diff --git a/evmcc/test/mem/byte.lll b/evmcc/test/mem/byte.lll deleted file mode 100644 index 95b0f99dc..000000000 --- a/evmcc/test/mem/byte.lll +++ /dev/null @@ -1,105 +0,0 @@ - -(asm -0x112233445566778899001122334455667788990011223344556677889900aabb -0 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -1 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -2 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -3 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -4 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -5 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -6 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -7 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -8 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -9 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -10 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -11 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -12 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -13 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -14 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -15 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -16 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -17 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -18 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -19 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -20 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -21 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -22 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -23 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -24 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -25 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -26 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -27 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -28 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -29 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -30 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -31 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -32 -BYTE -0x112233445566778899001122334455667788990011223344556677889900aabb -2014 -BYTE -) \ No newline at end of file diff --git a/evmcc/test/mem/mem2.evm b/evmcc/test/mem/mem2.evm deleted file mode 100644 index 49cc6e8b1..000000000 --- a/evmcc/test/mem/mem2.evm +++ /dev/null @@ -1 +0,0 @@ -6001610d805b01556504409585d6df620493e05462061a80535b01 diff --git a/evmcc/test/mem/mem2.lll b/evmcc/test/mem/mem2.lll deleted file mode 100644 index 5345ee47c..000000000 --- a/evmcc/test/mem/mem2.lll +++ /dev/null @@ -1,15 +0,0 @@ - -(asm ;; [] -1 -3456 -MSIZE -ADD -MSTORE8 ;; [02] -4675432994527 -300000 -MSTORE -400000 -MLOAD -MSIZE -ADD -) \ No newline at end of file diff --git a/evmcc/test/mem/memtest1.evm b/evmcc/test/mem/memtest1.evm deleted file mode 100644 index 0506bf928..000000000 --- a/evmcc/test/mem/memtest1.evm +++ /dev/null @@ -1 +0,0 @@ -6002600055600360015560005360015301600254 diff --git a/evmcc/test/mem/memtest1.lll b/evmcc/test/mem/memtest1.lll deleted file mode 100644 index 4b4389ad8..000000000 --- a/evmcc/test/mem/memtest1.lll +++ /dev/null @@ -1,18 +0,0 @@ - -(asm ;; [] -2 -0 -MSTORE8 ;; [02] -3 -1 -MSTORE8 ;; [02 03] -0 -MLOAD ;; [2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] -1 -MLOAD ;; [2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - ;; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] -ADD -2 -MSTORE ;; [2 3 5 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - ;; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] -) \ No newline at end of file diff --git a/evmcc/test/mem/mstore1.evm b/evmcc/test/mem/mstore1.evm deleted file mode 100644 index ba6141ab1..000000000 --- a/evmcc/test/mem/mstore1.evm +++ /dev/null @@ -1 +0,0 @@ -6001600054 diff --git a/evmcc/test/mem/mstore1.lll b/evmcc/test/mem/mstore1.lll deleted file mode 100644 index 2d2ca32b5..000000000 --- a/evmcc/test/mem/mstore1.lll +++ /dev/null @@ -1,6 +0,0 @@ - -(asm ;; [] -1 -0 -MSTORE ;; [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] -) \ No newline at end of file From 7fb58c9e2af025bfbae5b483f3047cea5d749e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 15:35:42 +0100 Subject: [PATCH 05/28] Move old VM return tests from EVM JIT to JSON file --- evmcc/test/ret/return1.evm | 1 - evmcc/test/ret/return1.lll | 6 ------ evmcc/test/ret/return2.evm | 1 - evmcc/test/ret/return2.lll | 6 ------ evmcc/test/ret/return_test.evm | 1 - evmcc/test/ret/return_test.lll | 15 --------------- 6 files changed, 30 deletions(-) delete mode 100644 evmcc/test/ret/return1.evm delete mode 100644 evmcc/test/ret/return1.lll delete mode 100644 evmcc/test/ret/return2.evm delete mode 100644 evmcc/test/ret/return2.lll delete mode 100644 evmcc/test/ret/return_test.evm delete mode 100644 evmcc/test/ret/return_test.lll diff --git a/evmcc/test/ret/return1.evm b/evmcc/test/ret/return1.evm deleted file mode 100644 index 8092cb007..000000000 --- a/evmcc/test/ret/return1.evm +++ /dev/null @@ -1 +0,0 @@ -600160805460006080530b601b59600160005460206000f2602a58602760005460206000f26002608054 diff --git a/evmcc/test/ret/return1.lll b/evmcc/test/ret/return1.lll deleted file mode 100644 index 159d15ca3..000000000 --- a/evmcc/test/ret/return1.lll +++ /dev/null @@ -1,6 +0,0 @@ -;; code should return 39 -;; i should remain 1 -{ - [i] 1 - ( if (> @i 0) { (return 39) [i] 2 } (return 1) ) -} \ No newline at end of file diff --git a/evmcc/test/ret/return2.evm b/evmcc/test/ret/return2.evm deleted file mode 100644 index e29da7664..000000000 --- a/evmcc/test/ret/return2.evm +++ /dev/null @@ -1 +0,0 @@ -6001620f4240f2 diff --git a/evmcc/test/ret/return2.lll b/evmcc/test/ret/return2.lll deleted file mode 100644 index f5ee68f6e..000000000 --- a/evmcc/test/ret/return2.lll +++ /dev/null @@ -1,6 +0,0 @@ - -(asm -1 -1000000 -RETURN ;; return 1 byte from index 1M -) \ No newline at end of file diff --git a/evmcc/test/ret/return_test.evm b/evmcc/test/ret/return_test.evm deleted file mode 100644 index 977cf7c19..000000000 --- a/evmcc/test/ret/return_test.evm +++ /dev/null @@ -1 +0,0 @@ -60016064546002608454600360a45460606064f2 diff --git a/evmcc/test/ret/return_test.lll b/evmcc/test/ret/return_test.lll deleted file mode 100644 index c87a2d812..000000000 --- a/evmcc/test/ret/return_test.lll +++ /dev/null @@ -1,15 +0,0 @@ - -(asm -1 -100 -MSTORE -2 -132 -MSTORE -3 -164 -MSTORE -96 -100 -RETURN -) \ No newline at end of file From 762e718f0096dbda2f69850fe3c99e1d4ce587d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 15:59:16 +0100 Subject: [PATCH 06/28] Move old VM stack tests from EVM JIT to JSON file --- evmcc/test/kv.evm | 1 - evmcc/test/kv.lll | 10 - evmcc/test/stack/oos.evm | 1 - evmcc/test/stack/oos.lll | 11 - evmcc/test/stack/push_test.evm | 1 - evmcc/test/stack/push_test.lll | 35 --- evmcc/test/stack/stack_test.evm | 1 - evmcc/test/stack/stack_test.lll | 8 - evmcc/test/stack/stackjump.evm | 1 - evmcc/test/stack/stackjump.lll | 3 - evmcc/test/stack/swap.evm | 1 - evmcc/test/stack/swap.lll | 31 --- evmcc/test/stack/swapswap.evm | 1 - evmcc/test/stack/swapswap.lll | 32 --- evmcc/test/stack/test.evm | 1 - .../test/vmtests/vmArithPerformanceTest.json | 260 ------------------ evmcc/test/vmtests/vmPerformanceTest.json | 214 -------------- evmcc/test/vmtests/vm_jump.json | 41 --- 18 files changed, 653 deletions(-) delete mode 100644 evmcc/test/kv.evm delete mode 100644 evmcc/test/kv.lll delete mode 100644 evmcc/test/stack/oos.evm delete mode 100644 evmcc/test/stack/oos.lll delete mode 100644 evmcc/test/stack/push_test.evm delete mode 100644 evmcc/test/stack/push_test.lll delete mode 100644 evmcc/test/stack/stack_test.evm delete mode 100644 evmcc/test/stack/stack_test.lll delete mode 100644 evmcc/test/stack/stackjump.evm delete mode 100644 evmcc/test/stack/stackjump.lll delete mode 100644 evmcc/test/stack/swap.evm delete mode 100644 evmcc/test/stack/swap.lll delete mode 100644 evmcc/test/stack/swapswap.evm delete mode 100644 evmcc/test/stack/swapswap.lll delete mode 100644 evmcc/test/stack/test.evm delete mode 100644 evmcc/test/vmtests/vmArithPerformanceTest.json delete mode 100644 evmcc/test/vmtests/vmPerformanceTest.json delete mode 100644 evmcc/test/vmtests/vm_jump.json diff --git a/evmcc/test/kv.evm b/evmcc/test/kv.evm deleted file mode 100644 index 55141ea59..000000000 --- a/evmcc/test/kv.evm +++ /dev/null @@ -1 +0,0 @@ -33604557602a8060106000396000f200604556330e0f602a59366080530a0f602a59602060805301356080533557604060805301608054600958 diff --git a/evmcc/test/kv.lll b/evmcc/test/kv.lll deleted file mode 100644 index c62d9fa70..000000000 --- a/evmcc/test/kv.lll +++ /dev/null @@ -1,10 +0,0 @@ -{ - [[69]] (caller) - (return 0 (lll - (when (= (caller) @@69) - (for {} (< @i (calldatasize)) [i](+ @i 64) - [[ (calldataload @i) ]] (calldataload (+ @i 32)) - ) - ) - 0)) -} diff --git a/evmcc/test/stack/oos.evm b/evmcc/test/stack/oos.evm deleted file mode 100644 index ea2f1c890..000000000 --- a/evmcc/test/stack/oos.evm +++ /dev/null @@ -1 +0,0 @@ -60018194505050509150 diff --git a/evmcc/test/stack/oos.lll b/evmcc/test/stack/oos.lll deleted file mode 100644 index 5394b06ba..000000000 --- a/evmcc/test/stack/oos.lll +++ /dev/null @@ -1,11 +0,0 @@ -(asm ;; x . v y z -1 ;; 1 x . v y z -DUP2 ;; x 1 x . v y z -SWAP5 ;; y 1 x . v x z -POP ;; 1 x . v x z -POP ;; x . v x z -POP ;; . v x z -POP ;; v x z -SWAP2 ;; z x v -POP ;; x v -) diff --git a/evmcc/test/stack/push_test.evm b/evmcc/test/stack/push_test.evm deleted file mode 100644 index d624cee1d..000000000 --- a/evmcc/test/stack/push_test.evm +++ /dev/null @@ -1 +0,0 @@ -60656107d26204a0c763026921f4640bc5588eb165372d0f1dca6e661ba1d901961c71670c55f7bc23038e3868056bc75e2d630fffff69021e19e0c9bab24000016a085d1c6e8050f0ea1c71bd6b0688be36543f3c36e638e37a6c03d41f73d55d0d482ae55555376dc76810d0fe03c91964d31c71c6f46e615dd0360c07d931663b14e38e38b16f2da3f99955a3adcf27ebb1caaaaaaa6e7014ccba6a8bb1ed35bd86bf065c71c71c2b7109491c5d4781b79c9009de6bfb8e38e38de8720414a0f6fdec81304d4c563e740bffffffffa573118427b3b4a05bc8a8a4de8459868000000000017406eb15e7331e727940d4ac54b7cdca1c71c71c71bd750567a91c9fefc96ebaa626a22f98c5e638e38e38e37a76032abd16c5b68006e15d5aa307e383f4e55555555555377701a6427bdc4f0d58eab5f48a3ec67f64e21c71c71c71c6f478080dd0a0c9b9ff2c2a0c740b06853a0a980ee38e38e38e38b17903c679cb5e8f2f9cb3b5d6652b0e7334f746faaaaaaaaaaaaa6e7a01b873815917ebb2bf3b890a1af495d6235bae3c71c71c71c71c2b7b07ae4cca96e1a55dfa49c85ad3c3e60e426b92fb8e38e38e38e38de87c036018bf074e292bcc7d6c8bea0f9699443046178bffffffffffffffa57d0e7d34c64a9c85d4460dbbca87196b61618a4bd2168000000000000000017e05b901f48a5b994d6572502bc4ea43140486666416aa1c71c71c71c71c71bd7f047889870c178fc477414ea231d70467a388fffe31b4e638e38e38e38e38e37a diff --git a/evmcc/test/stack/push_test.lll b/evmcc/test/stack/push_test.lll deleted file mode 100644 index 832daaec1..000000000 --- a/evmcc/test/stack/push_test.lll +++ /dev/null @@ -1,35 +0,0 @@ - -(asm -101 ;; PUSH1 -2002 ;; PUSH2 -303303 ;; PUSH3 -40444404 ;; PUSH4 -50555555505 ;; PUSH5 -60666666666606 -7777777777777777 -888888888888888888 -99999999999999999999 -10000000000000000000001 -10111111111111111111111101 -2022222222222222222222222202 -303333333333333333333333333303 -4044444444444444444444444444444404 -505555555555555555555555555555555505 -60666666666666666666666666666666666606 -7077777777777777777777777777777777777707 -808888888888888888888888888888888888888808 -90999999999999999999999999999999999999999909 -100000000000000000000000000000000000000000000001 -10111111111111111111111111111111111111111111111101 -2022222222222222222222222222222222222222222222222202 -303333333333333333333333333333333333333333333333333303 -40444444444444444444444444444444444444444444444444444404 -50555555555555555555555555555555555555555555555555555555505 -6066666666666666666666666666666666666666666666666666666666606 -707777777777777777777777777777777777777777777777777777777777707 -808888888888888888888888888888888888888888888888888888888888888808 -90999999999999999999999999999999999999999999999999999999999999999909 -100000000000000000000000000000000000000000000000000000000000000000000001 -10111111111111111111111111111111111111111111111111111111111111111111111101 -2022222222222222222222222222222222222222222222222222222222222222222222222202 ;; PUSH32 -) \ No newline at end of file diff --git a/evmcc/test/stack/stack_test.evm b/evmcc/test/stack/stack_test.evm deleted file mode 100644 index 02417c967..000000000 --- a/evmcc/test/stack/stack_test.evm +++ /dev/null @@ -1 +0,0 @@ -65372d0f1dca6e661925338e3e5c2b808280848184505050505050506104576108ae81819290 diff --git a/evmcc/test/stack/stack_test.lll b/evmcc/test/stack/stack_test.lll deleted file mode 100644 index fdf83594c..000000000 --- a/evmcc/test/stack/stack_test.lll +++ /dev/null @@ -1,8 +0,0 @@ - -(asm -123 -SSTORE -SLOAD -123 -SUB -) \ No newline at end of file diff --git a/evmcc/test/stack/stackjump.evm b/evmcc/test/stack/stackjump.evm deleted file mode 100644 index baddec42e..000000000 --- a/evmcc/test/stack/stackjump.evm +++ /dev/null @@ -1 +0,0 @@ -600460066009601358600a036000545b6000f260005401600958 \ No newline at end of file diff --git a/evmcc/test/stack/stackjump.lll b/evmcc/test/stack/stackjump.lll deleted file mode 100644 index f5da5e733..000000000 --- a/evmcc/test/stack/stackjump.lll +++ /dev/null @@ -1,3 +0,0 @@ -(asm -0x4 0x6 0x9 0x13 JUMP 0xa SUB 0x0 MSTORE MSIZE 0x0 RETURN 0x0 MSTORE ADD 0x9 JUMP -) diff --git a/evmcc/test/stack/swap.evm b/evmcc/test/stack/swap.evm deleted file mode 100644 index d17f0ee09..000000000 --- a/evmcc/test/stack/swap.evm +++ /dev/null @@ -1 +0,0 @@ -600560026001600c59505000906001601559505000036000546001601ff2 diff --git a/evmcc/test/stack/swap.lll b/evmcc/test/stack/swap.lll deleted file mode 100644 index 90dee585d..000000000 --- a/evmcc/test/stack/swap.lll +++ /dev/null @@ -1,31 +0,0 @@ -(asm -5 ;; 0 -2 ;; 2 -1 ;; 4 -12 ;; 6 -JUMPI ;; 8 - -POP ;; 9 -POP ;; 10 -STOP ;; 11 - -;; stack = 2,1 -SWAP1 ;; 12 -1 ;; 13 -21 ;; 15 -JUMPI ;; 17 - -POP ;; 18 -POP ;; 19 -STOP ;; 20 - -;; stack = 1,2 -SUB ;; 21 -0 -MSTORE -1 -31 -RETURN ;; returns 03 -) - - diff --git a/evmcc/test/stack/swapswap.evm b/evmcc/test/stack/swapswap.evm deleted file mode 100644 index fb4f1bf75..000000000 --- a/evmcc/test/stack/swapswap.evm +++ /dev/null @@ -1 +0,0 @@ -600260056001600c5950500090906001601659505000036000546001601ff2 diff --git a/evmcc/test/stack/swapswap.lll b/evmcc/test/stack/swapswap.lll deleted file mode 100644 index 1fedf726e..000000000 --- a/evmcc/test/stack/swapswap.lll +++ /dev/null @@ -1,32 +0,0 @@ -(asm -2 ;; 0 -5 ;; 2 -1 ;; 4 -12 ;; 6 -JUMPI ;; 8 - -POP ;; 9 -POP ;; 10 -STOP ;; 11 - -;; stack = 2,1 -SWAP1 ;; 12 -SWAP1 ;; 13 -1 ;; 14 -22 ;; 16 -JUMPI ;; 18 - -POP ;; 19 -POP ;; 20 -STOP ;; 21 - -;; stack = 2,1 -SUB ;; 22 -0 -MSTORE -1 -31 -RETURN ;; returns 03 -) - - diff --git a/evmcc/test/stack/test.evm b/evmcc/test/stack/test.evm deleted file mode 100644 index ea2f1c890..000000000 --- a/evmcc/test/stack/test.evm +++ /dev/null @@ -1 +0,0 @@ -60018194505050509150 diff --git a/evmcc/test/vmtests/vmArithPerformanceTest.json b/evmcc/test/vmtests/vmArithPerformanceTest.json deleted file mode 100644 index d9017517f..000000000 --- a/evmcc/test/vmtests/vmArithPerformanceTest.json +++ /dev/null @@ -1,260 +0,0 @@ -{ - "arith-1" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x600a60005260005160105760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600556", - "data" : "0x", - "gas" : "1000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "999538", - "out" : "0x0000000000000000000000000000000000000000000000000000001b9c636491", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x600a60005260005160105760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600556", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x600a60005260005160105760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600556", - "nonce" : "0", - "storage" : { } - } - } - } - - , - - "arith-2" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x606460005260005160105760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600556", - "data" : "0x", - "gas" : "1000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "995488", - "out" : "0x0000000000000000000000000000000000000000000000000000001b9c636491", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x606460005260005160105760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600556", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x606460005260005160105760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600556", - "nonce" : "0", - "storage" : { } - } - } - } - - , - - "arith-3" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x6103e860005260005160115760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600656", - "data" : "0x", - "gas" : "1000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "954988", - "out" : "0x0000000000000000000000000000000000000000000000000000001b9c636491", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6103e860005260005160115760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600656", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6103e860005260005160115760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600656", - "nonce" : "0", - "storage" : { } - } - } - } - - , - - "arith-4" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x61271060005260005160115760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600656", - "data" : "0x", - "gas" : "1000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "549988", - "out" : "0x0000000000000000000000000000000000000000000000000000001b9c636491", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x61271060005260005160115760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600656", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x61271060005260005160115760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600656", - "nonce" : "0", - "storage" : { } - } - } - } - - - , - - - "arith-5" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x620186a060005260005160125760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600756", - "data" : "0x", - "gas" : "10000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "5499988", - "out" : "0x0000000000000000000000000000000000000000000000000000001b9c636491", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x620186a060005260005160125760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600756", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x620186a060005260005160125760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600756", - "nonce" : "0", - "storage" : { } - } - } - } - -, - - "arith-6" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "100000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x620f424060005260005160125760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600756", - "data" : "0x", - "gas" : "100000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "54999988", - "out" : "0x0000000000000000000000000000000000000000000000000000001b9c636491", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x620f424060005260005160125760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600756", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x620f424060005260005160125760206020f26001600190016007026005016002900460049006602190056015016003026005900760030360090160110a60205260005160019003600052600756", - "nonce" : "0", - "storage" : { } - } - } - } - -} diff --git a/evmcc/test/vmtests/vmPerformanceTest.json b/evmcc/test/vmtests/vmPerformanceTest.json deleted file mode 100644 index 604e45993..000000000 --- a/evmcc/test/vmtests/vmPerformanceTest.json +++ /dev/null @@ -1,214 +0,0 @@ -{ - "mulmodloop" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x60015b68010000000000000000908060010109600356", - "data" : "0x", - "gas" : "10000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "0", - "out" : "0x0", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x60015b68010000000000000000908060010109600356", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x60015b68010000000000000000908060010109600356", - "nonce" : "0", - "storage" : { } - } - } - }, - - - "for-1e06" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "100000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x620f42406080525b6000608051111560285760a0516080510160a0526001608051036080526007565b", - "data" : "0x", - "gas" : "30000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "6999982", - "out" : "0x00", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x620f42406080525b6000608051111560285760a0516080510160a0526001608051036080526007565b", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x620f42406080525b6000608051111560285760a0516080510160a0526001608051036080526007565b", - "nonce" : "0", - "storage" : { } - } - } - }, - - "fib25" : { - "callcreates" : [ - ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "100000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x6007601e6010565b60005260206000f25b600381106030576021600282036010565b602b600183036010565b016033565b60015b90509056", - "data" : "0x", - "gas" : "40000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "5886377", - "out" : "0x00000000000000000000000000000000000000000000000000000000000cb228", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6007601e6010565b60005260206000f25b600381106030576021600282036010565b602b600183036010565b016033565b60015b90509056", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6007601e6010565b60005260206000f25b600381106030576021600282036010565b602b600183036010565b016033565b60015b90509056", - "nonce" : "0", - "storage" : { - } - } - } - }, - - "ackermann37" : { - "callcreates" : [ - ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "20000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x6009600360076012565b60005260206000f25b60008214604a5760008114603957603560018303603184600185036012565b6012565b6046565b60456001830360016012565b5b604f565b600181015b905090509056", - "data" : "0x", - "gas" : "20000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "913456", - "out" : "0x00000000000000000000000000000000000000000000000000000000000003fd", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6009600360076012565b60005260206000f25b60008214604a5760008114603957603560018303603184600185036012565b6012565b6046565b60456001830360016012565b5b604f565b600181015b905090509056", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6009600360076012565b60005260206000f25b60008214604a5760008114603957603560018303603184600185036012565b6012565b6046565b60456001830360016012565b5b604f565b600181015b905090509056", - "nonce" : "0", - "storage" : { - } - } - } - }, - - "jumptable100" : { - "callcreates" : [ - ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "0x6103e85b60019003806000146104605761001a600160005256005b610025600260005256005b610030600360005256005b61003b600460005256005b610046600560005256005b610051600660005256005b61005c600760005256005b610067600860005256005b610072600960005256005b61007d600a60005256005b610088600b60005256005b610093600c60005256005b61009e600d60005256005b6100a9600e60005256005b6100b4600f60005256005b6100bf601060005256005b6100ca601160005256005b6100d5601260005256005b6100e0601360005256005b6100eb601460005256005b6100f6601560005256005b610101601660005256005b61010c601760005256005b610117601860005256005b610122601960005256005b61012d601a60005256005b610138601b60005256005b610143601c60005256005b61014e601d60005256005b610159601e60005256005b610164601f60005256005b61016f602060005256005b61017a602160005256005b610185602260005256005b610190602360005256005b61019b602460005256005b6101a6602560005256005b6101b1602660005256005b6101bc602760005256005b6101c7602860005256005b6101d2602960005256005b6101dd602a60005256005b6101e8602b60005256005b6101f3602c60005256005b6101fe602d60005256005b610209602e60005256005b610214602f60005256005b61021f603060005256005b61022a603160005256005b610235603260005256005b610240603360005256005b61024b603460005256005b610256603560005256005b610261603660005256005b61026c603760005256005b610277603860005256005b610282603960005256005b61028d603a60005256005b610298603b60005256005b6102a3603c60005256005b6102ae603d60005256005b6102b9603e60005256005b6102c4603f60005256005b6102cf604060005256005b6102da604160005256005b6102e5604260005256005b6102f0604360005256005b6102fb604460005256005b610306604560005256005b610311604660005256005b61031c604760005256005b610327604860005256005b610332604960005256005b61033d604a60005256005b610348604b60005256005b610353604c60005256005b61035e604d60005256005b610369604e60005256005b610374604f60005256005b61037f605060005256005b61038a605160005256005b610395605260005256005b6103a0605360005256005b6103ab605460005256005b6103b6605560005256005b6103c1605660005256005b6103cc605760005256005b6103d7605860005256005b6103e2605960005256005b6103ed605a60005256005b6103f8605b60005256005b610403605c60005256005b61040e605d60005256005b610419605e60005256005b610424605f60005256005b61042f606060005256005b61043a606160005256005b610445606260005256005b610450606360005256005b61045b606460005256005b610003565b60206000f2", - "data" : "0x", - "gas" : "1000000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "389596", - "out" : "0x0000000000000000000000000000000000000000000000000000000000000064", - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6103e85b60019003806000146104605761001a600160005256005b610025600260005256005b610030600360005256005b61003b600460005256005b610046600560005256005b610051600660005256005b61005c600760005256005b610067600860005256005b610072600960005256005b61007d600a60005256005b610088600b60005256005b610093600c60005256005b61009e600d60005256005b6100a9600e60005256005b6100b4600f60005256005b6100bf601060005256005b6100ca601160005256005b6100d5601260005256005b6100e0601360005256005b6100eb601460005256005b6100f6601560005256005b610101601660005256005b61010c601760005256005b610117601860005256005b610122601960005256005b61012d601a60005256005b610138601b60005256005b610143601c60005256005b61014e601d60005256005b610159601e60005256005b610164601f60005256005b61016f602060005256005b61017a602160005256005b610185602260005256005b610190602360005256005b61019b602460005256005b6101a6602560005256005b6101b1602660005256005b6101bc602760005256005b6101c7602860005256005b6101d2602960005256005b6101dd602a60005256005b6101e8602b60005256005b6101f3602c60005256005b6101fe602d60005256005b610209602e60005256005b610214602f60005256005b61021f603060005256005b61022a603160005256005b610235603260005256005b610240603360005256005b61024b603460005256005b610256603560005256005b610261603660005256005b61026c603760005256005b610277603860005256005b610282603960005256005b61028d603a60005256005b610298603b60005256005b6102a3603c60005256005b6102ae603d60005256005b6102b9603e60005256005b6102c4603f60005256005b6102cf604060005256005b6102da604160005256005b6102e5604260005256005b6102f0604360005256005b6102fb604460005256005b610306604560005256005b610311604660005256005b61031c604760005256005b610327604860005256005b610332604960005256005b61033d604a60005256005b610348604b60005256005b610353604c60005256005b61035e604d60005256005b610369604e60005256005b610374604f60005256005b61037f605060005256005b61038a605160005256005b610395605260005256005b6103a0605360005256005b6103ab605460005256005b6103b6605560005256005b6103c1605660005256005b6103cc605760005256005b6103d7605860005256005b6103e2605960005256005b6103ed605a60005256005b6103f8605b60005256005b610403605c60005256005b61040e605d60005256005b610419605e60005256005b610424605f60005256005b61042f606060005256005b61043a606160005256005b610445606260005256005b610450606360005256005b61045b606460005256005b610003565b60206000f2", - "nonce" : "0", - "storage" : { - } - } - }, - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "0x6103e85b60019003806000146104605761001a600160005256005b610025600260005256005b610030600360005256005b61003b600460005256005b610046600560005256005b610051600660005256005b61005c600760005256005b610067600860005256005b610072600960005256005b61007d600a60005256005b610088600b60005256005b610093600c60005256005b61009e600d60005256005b6100a9600e60005256005b6100b4600f60005256005b6100bf601060005256005b6100ca601160005256005b6100d5601260005256005b6100e0601360005256005b6100eb601460005256005b6100f6601560005256005b610101601660005256005b61010c601760005256005b610117601860005256005b610122601960005256005b61012d601a60005256005b610138601b60005256005b610143601c60005256005b61014e601d60005256005b610159601e60005256005b610164601f60005256005b61016f602060005256005b61017a602160005256005b610185602260005256005b610190602360005256005b61019b602460005256005b6101a6602560005256005b6101b1602660005256005b6101bc602760005256005b6101c7602860005256005b6101d2602960005256005b6101dd602a60005256005b6101e8602b60005256005b6101f3602c60005256005b6101fe602d60005256005b610209602e60005256005b610214602f60005256005b61021f603060005256005b61022a603160005256005b610235603260005256005b610240603360005256005b61024b603460005256005b610256603560005256005b610261603660005256005b61026c603760005256005b610277603860005256005b610282603960005256005b61028d603a60005256005b610298603b60005256005b6102a3603c60005256005b6102ae603d60005256005b6102b9603e60005256005b6102c4603f60005256005b6102cf604060005256005b6102da604160005256005b6102e5604260005256005b6102f0604360005256005b6102fb604460005256005b610306604560005256005b610311604660005256005b61031c604760005256005b610327604860005256005b610332604960005256005b61033d604a60005256005b610348604b60005256005b610353604c60005256005b61035e604d60005256005b610369604e60005256005b610374604f60005256005b61037f605060005256005b61038a605160005256005b610395605260005256005b6103a0605360005256005b6103ab605460005256005b6103b6605560005256005b6103c1605660005256005b6103cc605760005256005b6103d7605860005256005b6103e2605960005256005b6103ed605a60005256005b6103f8605b60005256005b610403605c60005256005b61040e605d60005256005b610419605e60005256005b610424605f60005256005b61042f606060005256005b61043a606160005256005b610445606260005256005b610450606360005256005b61045b606460005256005b610003565b60206000f2", - "nonce" : "0", - "storage" : { - } - } - } - }, - -} diff --git a/evmcc/test/vmtests/vm_jump.json b/evmcc/test/vmtests/vm_jump.json deleted file mode 100644 index 6b63edeae..000000000 --- a/evmcc/test/vmtests/vm_jump.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "jumpi_at_the_end" : { - "callcreates" : [ ], - "env" : { - "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", - "currentDifficulty" : "256", - "currentGasLimit" : "10000000", - "currentNumber" : "0", - "currentTimestamp" : "1", - "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" - }, - "exec" : { - "address" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6", - "caller" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "code" : "(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)", - "data" : "0x", - "gas" : "1000", - "gasPrice" : "100000000000000", - "origin" : "cd1722f3947def4cf144679da39c4c32bdc35681", - "value" : "1000000000000000000" - }, - "gas" : "895", - "out" : "0x0", - "pre" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)", - "nonce" : "0", - "storage" : {} - } - }, - "post" : { - "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : { - "balance" : "1000000000000000000", - "code" : "(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)", - "nonce" : "0", - "storage" : {} - } - } - } -} From fc0fd385366a8ccd50449fbfc7b490ce4d318e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 17:12:26 +0100 Subject: [PATCH 07/28] Move old VM jump tests from EVM JIT to JSON file --- evmcc/test/jump/ackermann.ethel | 7 ------ evmcc/test/jump/ackermann.evm | 1 - evmcc/test/jump/badindirect1.evm | 1 - evmcc/test/jump/badindirect1.lll | 9 -------- evmcc/test/jump/badindirect2.evm | 1 - evmcc/test/jump/badindirect2.lll | 12 ----------- evmcc/test/jump/badjump1.evm | 1 - evmcc/test/jump/badjump1.lll | 6 ------ evmcc/test/jump/badjump2.evm | 1 - evmcc/test/jump/badjump2.lll | 9 -------- evmcc/test/jump/call1.ethel | 5 ----- evmcc/test/jump/call1.evm | 1 - evmcc/test/jump/call2.ethel | 5 ----- evmcc/test/jump/call2.evm | 1 - evmcc/test/jump/fac.ethel | 5 ----- evmcc/test/jump/fac.evm | 1 - evmcc/test/jump/fac_tail.ethel | 5 ----- evmcc/test/jump/fac_tail.evm | 1 - evmcc/test/jump/fib1.ethel | 6 ------ evmcc/test/jump/fib1.evm | 1 - evmcc/test/jump/for1.evm | 1 - evmcc/test/jump/for1.lll | 3 --- evmcc/test/jump/for2.evm | 1 - evmcc/test/jump/for2.lll | 3 --- evmcc/test/jump/if1.ethel | 1 - evmcc/test/jump/if1.evm | 1 - evmcc/test/jump/if2.ethel | 1 - evmcc/test/jump/if2.evm | 1 - evmcc/test/jump/indirect1.evm | 1 - evmcc/test/jump/indirect1.lll | 13 ----------- evmcc/test/jump/indirect2.evm | 1 - evmcc/test/jump/indirect2.lll | 19 ----------------- evmcc/test/jump/indirect3.evm | 1 - evmcc/test/jump/indirect3.lll | 14 ------------ evmcc/test/jump/indirect4.evm | 1 - evmcc/test/jump/indirect4.lll | 15 ------------- evmcc/test/jump/jump1.evm | 1 - evmcc/test/jump/jump1.lll | 11 ---------- evmcc/test/jump/jump2.evm | 1 - evmcc/test/jump/jump2.lll | 10 --------- evmcc/test/jump/jump3.evm | 1 - evmcc/test/jump/jump3.lll | 10 --------- evmcc/test/jump/jump4.evm | 1 - evmcc/test/jump/jump4.lll | 17 --------------- evmcc/test/jump/jump5.evm | 1 - evmcc/test/jump/jump5.lll | 16 -------------- evmcc/test/jump/jump6.evm | 1 - evmcc/test/jump/jump6.lll | 32 ---------------------------- evmcc/test/jump/jumpi_at_the_end.evm | 1 - evmcc/test/jump/jumpi_at_the_end.lll | 1 - evmcc/test/jump/loop1.evm | 1 - evmcc/test/jump/loop1.lll | 27 ----------------------- evmcc/test/jump/loop2.evm | 1 - evmcc/test/jump/loop2.lll | 28 ------------------------ evmcc/test/jump/rec1.ethel | 4 ---- evmcc/test/jump/rec1.evm | 1 - evmcc/test/jump/when1.asm | 10 --------- evmcc/test/jump/when1.evm | 1 - evmcc/test/jump/when1.lll | 2 -- 59 files changed, 335 deletions(-) delete mode 100644 evmcc/test/jump/ackermann.ethel delete mode 100644 evmcc/test/jump/ackermann.evm delete mode 100644 evmcc/test/jump/badindirect1.evm delete mode 100644 evmcc/test/jump/badindirect1.lll delete mode 100644 evmcc/test/jump/badindirect2.evm delete mode 100644 evmcc/test/jump/badindirect2.lll delete mode 100644 evmcc/test/jump/badjump1.evm delete mode 100644 evmcc/test/jump/badjump1.lll delete mode 100644 evmcc/test/jump/badjump2.evm delete mode 100644 evmcc/test/jump/badjump2.lll delete mode 100644 evmcc/test/jump/call1.ethel delete mode 100644 evmcc/test/jump/call1.evm delete mode 100644 evmcc/test/jump/call2.ethel delete mode 100644 evmcc/test/jump/call2.evm delete mode 100644 evmcc/test/jump/fac.ethel delete mode 100644 evmcc/test/jump/fac.evm delete mode 100644 evmcc/test/jump/fac_tail.ethel delete mode 100644 evmcc/test/jump/fac_tail.evm delete mode 100644 evmcc/test/jump/fib1.ethel delete mode 100644 evmcc/test/jump/fib1.evm delete mode 100644 evmcc/test/jump/for1.evm delete mode 100644 evmcc/test/jump/for1.lll delete mode 100644 evmcc/test/jump/for2.evm delete mode 100644 evmcc/test/jump/for2.lll delete mode 100644 evmcc/test/jump/if1.ethel delete mode 100644 evmcc/test/jump/if1.evm delete mode 100644 evmcc/test/jump/if2.ethel delete mode 100644 evmcc/test/jump/if2.evm delete mode 100644 evmcc/test/jump/indirect1.evm delete mode 100644 evmcc/test/jump/indirect1.lll delete mode 100644 evmcc/test/jump/indirect2.evm delete mode 100644 evmcc/test/jump/indirect2.lll delete mode 100644 evmcc/test/jump/indirect3.evm delete mode 100644 evmcc/test/jump/indirect3.lll delete mode 100644 evmcc/test/jump/indirect4.evm delete mode 100644 evmcc/test/jump/indirect4.lll delete mode 100644 evmcc/test/jump/jump1.evm delete mode 100644 evmcc/test/jump/jump1.lll delete mode 100644 evmcc/test/jump/jump2.evm delete mode 100644 evmcc/test/jump/jump2.lll delete mode 100644 evmcc/test/jump/jump3.evm delete mode 100644 evmcc/test/jump/jump3.lll delete mode 100644 evmcc/test/jump/jump4.evm delete mode 100644 evmcc/test/jump/jump4.lll delete mode 100644 evmcc/test/jump/jump5.evm delete mode 100644 evmcc/test/jump/jump5.lll delete mode 100644 evmcc/test/jump/jump6.evm delete mode 100644 evmcc/test/jump/jump6.lll delete mode 100644 evmcc/test/jump/jumpi_at_the_end.evm delete mode 100644 evmcc/test/jump/jumpi_at_the_end.lll delete mode 100644 evmcc/test/jump/loop1.evm delete mode 100644 evmcc/test/jump/loop1.lll delete mode 100644 evmcc/test/jump/loop2.evm delete mode 100644 evmcc/test/jump/loop2.lll delete mode 100644 evmcc/test/jump/rec1.ethel delete mode 100644 evmcc/test/jump/rec1.evm delete mode 100644 evmcc/test/jump/when1.asm delete mode 100644 evmcc/test/jump/when1.evm delete mode 100644 evmcc/test/jump/when1.lll diff --git a/evmcc/test/jump/ackermann.ethel b/evmcc/test/jump/ackermann.ethel deleted file mode 100644 index 971fd2b8d..000000000 --- a/evmcc/test/jump/ackermann.ethel +++ /dev/null @@ -1,7 +0,0 @@ -let A m n = - if m == 0 then n+1 - else if n == 0 then A (m-1) 1 - else A (m-1) (A (m) (n-1)) - -return A 3 8 - diff --git a/evmcc/test/jump/ackermann.evm b/evmcc/test/jump/ackermann.evm deleted file mode 100644 index 964844045..000000000 --- a/evmcc/test/jump/ackermann.evm +++ /dev/null @@ -1 +0,0 @@ -6009600360086012585d60005460206000f26000820e6047596000810e603859603460018303603084600185036012585d6012585d60445860436001830360016012585d604b5860018101905090509058 \ No newline at end of file diff --git a/evmcc/test/jump/badindirect1.evm b/evmcc/test/jump/badindirect1.evm deleted file mode 100644 index b2a8aad67..000000000 --- a/evmcc/test/jump/badindirect1.evm +++ /dev/null @@ -1 +0,0 @@ -601b602502585d diff --git a/evmcc/test/jump/badindirect1.lll b/evmcc/test/jump/badindirect1.lll deleted file mode 100644 index d6291be68..000000000 --- a/evmcc/test/jump/badindirect1.lll +++ /dev/null @@ -1,9 +0,0 @@ -;; Indirect jump out of code - -(asm -27 -37 -MUL -JUMP -JUMPDEST -) \ No newline at end of file diff --git a/evmcc/test/jump/badindirect2.evm b/evmcc/test/jump/badindirect2.evm deleted file mode 100644 index 22217523d..000000000 --- a/evmcc/test/jump/badindirect2.evm +++ /dev/null @@ -1 +0,0 @@ -60016003600302596000600058 diff --git a/evmcc/test/jump/badindirect2.lll b/evmcc/test/jump/badindirect2.lll deleted file mode 100644 index 53a6294f7..000000000 --- a/evmcc/test/jump/badindirect2.lll +++ /dev/null @@ -1,12 +0,0 @@ -;; Indirect jump into data - -(asm -1 ;; 0 -3 -3 -MUL ;; 6 -JUMPI ;; 7 -0 ;; 8 -0 -JUMP -) \ No newline at end of file diff --git a/evmcc/test/jump/badjump1.evm b/evmcc/test/jump/badjump1.evm deleted file mode 100644 index 5c11a8661..000000000 --- a/evmcc/test/jump/badjump1.evm +++ /dev/null @@ -1 +0,0 @@ -6103e758 diff --git a/evmcc/test/jump/badjump1.lll b/evmcc/test/jump/badjump1.lll deleted file mode 100644 index 1834a62ef..000000000 --- a/evmcc/test/jump/badjump1.lll +++ /dev/null @@ -1,6 +0,0 @@ -;; Direct jump out of code. - -(asm -999 -JUMP -) \ No newline at end of file diff --git a/evmcc/test/jump/badjump2.evm b/evmcc/test/jump/badjump2.evm deleted file mode 100644 index 900a1c15a..000000000 --- a/evmcc/test/jump/badjump2.evm +++ /dev/null @@ -1 +0,0 @@ -6004586000600058 diff --git a/evmcc/test/jump/badjump2.lll b/evmcc/test/jump/badjump2.lll deleted file mode 100644 index ce61276d7..000000000 --- a/evmcc/test/jump/badjump2.lll +++ /dev/null @@ -1,9 +0,0 @@ -;; Direct jump into data - -(asm -4 ;; 0 0-3 -JUMP ;; 2 -0 ;; 3 3-4 -0 ;; 5 4-7 -JUMP ;; 6 -) \ No newline at end of file diff --git a/evmcc/test/jump/call1.ethel b/evmcc/test/jump/call1.ethel deleted file mode 100644 index 414ad0124..000000000 --- a/evmcc/test/jump/call1.ethel +++ /dev/null @@ -1,5 +0,0 @@ -let f n = n + 1 - -return f 2 - - diff --git a/evmcc/test/jump/call1.evm b/evmcc/test/jump/call1.evm deleted file mode 100644 index 252aaf778..000000000 --- a/evmcc/test/jump/call1.evm +++ /dev/null @@ -1 +0,0 @@ -600760026010585d60005460206000f28060010190509058 \ No newline at end of file diff --git a/evmcc/test/jump/call2.ethel b/evmcc/test/jump/call2.ethel deleted file mode 100644 index bdeb9b734..000000000 --- a/evmcc/test/jump/call2.ethel +++ /dev/null @@ -1,5 +0,0 @@ -let f a b = a + b - -return f 2 3 - - diff --git a/evmcc/test/jump/call2.evm b/evmcc/test/jump/call2.evm deleted file mode 100644 index 6832e044d..000000000 --- a/evmcc/test/jump/call2.evm +++ /dev/null @@ -1 +0,0 @@ -6009600260036012585d60005460206000f2818101905090509058 \ No newline at end of file diff --git a/evmcc/test/jump/fac.ethel b/evmcc/test/jump/fac.ethel deleted file mode 100644 index 8bfe94dd6..000000000 --- a/evmcc/test/jump/fac.ethel +++ /dev/null @@ -1,5 +0,0 @@ -let fac n = - if n == 0 then 1 - else n * fac (n-1) - -return fac 60 \ No newline at end of file diff --git a/evmcc/test/jump/fac.evm b/evmcc/test/jump/fac.evm deleted file mode 100644 index 04cd3e4f4..000000000 --- a/evmcc/test/jump/fac.evm +++ /dev/null @@ -1 +0,0 @@ -6007603c6010585d60005460206000f26000810e6026596020600182036010585d8102602858600190509058 \ No newline at end of file diff --git a/evmcc/test/jump/fac_tail.ethel b/evmcc/test/jump/fac_tail.ethel deleted file mode 100644 index 9ce5ecac7..000000000 --- a/evmcc/test/jump/fac_tail.ethel +++ /dev/null @@ -1,5 +0,0 @@ -let fac a n = - if n == 0 then a - else fac (a*n) (n-1) - -return fac 1 60 \ No newline at end of file diff --git a/evmcc/test/jump/fac_tail.evm b/evmcc/test/jump/fac_tail.evm deleted file mode 100644 index 8384d94e4..000000000 --- a/evmcc/test/jump/fac_tail.evm +++ /dev/null @@ -1 +0,0 @@ -60096001603c6012585d60005460206000f26000810e6029596025818302600183036012585d602a5881905090509058 \ No newline at end of file diff --git a/evmcc/test/jump/fib1.ethel b/evmcc/test/jump/fib1.ethel deleted file mode 100644 index 81b869f41..000000000 --- a/evmcc/test/jump/fib1.ethel +++ /dev/null @@ -1,6 +0,0 @@ -let fib n = - if n < 3 then 1 - else fib (n-1) + fib (n-2) - -return fib 10 - diff --git a/evmcc/test/jump/fib1.evm b/evmcc/test/jump/fib1.evm deleted file mode 100644 index 5042a192f..000000000 --- a/evmcc/test/jump/fib1.evm +++ /dev/null @@ -1 +0,0 @@ -6007600a6010585d60005460206000f26003810a602f596020600282036010585d602a600183036010585d01603158600190509058 \ No newline at end of file diff --git a/evmcc/test/jump/for1.evm b/evmcc/test/jump/for1.evm deleted file mode 100644 index f8e65cbf2..000000000 --- a/evmcc/test/jump/for1.evm +++ /dev/null @@ -1 +0,0 @@ -600a60805460006080530b0f60255960a0536080530160a054600160805303608054600558 diff --git a/evmcc/test/jump/for1.lll b/evmcc/test/jump/for1.lll deleted file mode 100644 index 419fc9b54..000000000 --- a/evmcc/test/jump/for1.lll +++ /dev/null @@ -1,3 +0,0 @@ -(for [i]:10 (> @i 0) [i](- @i 1) - [j](+ @i @j) -) diff --git a/evmcc/test/jump/for2.evm b/evmcc/test/jump/for2.evm deleted file mode 100644 index 628297778..000000000 --- a/evmcc/test/jump/for2.evm +++ /dev/null @@ -1 +0,0 @@ -6000608054600a6080530a0f60255960a0536080530160a054600160805301608054600558 diff --git a/evmcc/test/jump/for2.lll b/evmcc/test/jump/for2.lll deleted file mode 100644 index de17d65ac..000000000 --- a/evmcc/test/jump/for2.lll +++ /dev/null @@ -1,3 +0,0 @@ -(for [i]:0 (< @i 10) [i](+ @i 1) - [j](+ @i @j) -) diff --git a/evmcc/test/jump/if1.ethel b/evmcc/test/jump/if1.ethel deleted file mode 100644 index 85c3e126b..000000000 --- a/evmcc/test/jump/if1.ethel +++ /dev/null @@ -1 +0,0 @@ -return if 0 then 1 else 2 \ No newline at end of file diff --git a/evmcc/test/jump/if1.evm b/evmcc/test/jump/if1.evm deleted file mode 100644 index 51fbe04bd..000000000 --- a/evmcc/test/jump/if1.evm +++ /dev/null @@ -1 +0,0 @@ -60006300000010596002630000001258600160005460206000f2 \ No newline at end of file diff --git a/evmcc/test/jump/if2.ethel b/evmcc/test/jump/if2.ethel deleted file mode 100644 index 2a58d6365..000000000 --- a/evmcc/test/jump/if2.ethel +++ /dev/null @@ -1 +0,0 @@ -return if 1 then 1 else 2 \ No newline at end of file diff --git a/evmcc/test/jump/if2.evm b/evmcc/test/jump/if2.evm deleted file mode 100644 index 6d823b374..000000000 --- a/evmcc/test/jump/if2.evm +++ /dev/null @@ -1 +0,0 @@ -60016300000010596002630000001258600160005460206000f2 \ No newline at end of file diff --git a/evmcc/test/jump/indirect1.evm b/evmcc/test/jump/indirect1.evm deleted file mode 100644 index ab6928304..000000000 --- a/evmcc/test/jump/indirect1.evm +++ /dev/null @@ -1 +0,0 @@ -600460030158005d6001600054 diff --git a/evmcc/test/jump/indirect1.lll b/evmcc/test/jump/indirect1.lll deleted file mode 100644 index 1ee7dc347..000000000 --- a/evmcc/test/jump/indirect1.lll +++ /dev/null @@ -1,13 +0,0 @@ -;; Indirect JUMP - -(asm -4 ;; 0 -3 ;; 2 -ADD ;; 4 -JUMP ;; 5 -STOP ;; 6 -JUMPDEST ;; 7 -1 -0 -MSTORE -) \ No newline at end of file diff --git a/evmcc/test/jump/indirect2.evm b/evmcc/test/jump/indirect2.evm deleted file mode 100644 index e9697eaa1..000000000 --- a/evmcc/test/jump/indirect2.evm +++ /dev/null @@ -1 +0,0 @@ -600860060158005d6001600054005d600260005400 diff --git a/evmcc/test/jump/indirect2.lll b/evmcc/test/jump/indirect2.lll deleted file mode 100644 index f2f068630..000000000 --- a/evmcc/test/jump/indirect2.lll +++ /dev/null @@ -1,19 +0,0 @@ -;; Indirect JUMP - -(asm -8 ;; 0 -6 ;; 2 -ADD ;; 4 -JUMP ;; 5 --> 14 -STOP ;; 6 -JUMPDEST ;; 7 -1 ;; 8 -0 ;; 10 -MSTORE ;; 12 -STOP ;; 13 -JUMPDEST ;; 14 -2 -0 -MSTORE -STOP -) \ No newline at end of file diff --git a/evmcc/test/jump/indirect3.evm b/evmcc/test/jump/indirect3.evm deleted file mode 100644 index 1fb0a356c..000000000 --- a/evmcc/test/jump/indirect3.evm +++ /dev/null @@ -1 +0,0 @@ -6001600460050159005d6001600054 diff --git a/evmcc/test/jump/indirect3.lll b/evmcc/test/jump/indirect3.lll deleted file mode 100644 index d6a679f9a..000000000 --- a/evmcc/test/jump/indirect3.lll +++ /dev/null @@ -1,14 +0,0 @@ -;; Indirect JUMP - -(asm -1 ;; 0 -4 ;; 2 -5 ;; 4 -ADD ;; 6 -JUMPI ;; 7 -STOP ;; 8 -JUMPDEST ;; 9 -1 -0 -MSTORE -) \ No newline at end of file diff --git a/evmcc/test/jump/indirect4.evm b/evmcc/test/jump/indirect4.evm deleted file mode 100644 index f0e31a8f4..000000000 --- a/evmcc/test/jump/indirect4.evm +++ /dev/null @@ -1 +0,0 @@ -60006007600501596001600054005d00 diff --git a/evmcc/test/jump/indirect4.lll b/evmcc/test/jump/indirect4.lll deleted file mode 100644 index 7fbe0b833..000000000 --- a/evmcc/test/jump/indirect4.lll +++ /dev/null @@ -1,15 +0,0 @@ -;; Indirect JUMP - -(asm -0 ;; 0 -7 ;; 2 -5 ;; 4 -ADD ;; 6 -JUMPI ;; 7 -1 ;; 8 -0 ;; 9 -MSTORE ;; 10 -STOP ;; 11 -JUMPDEST ;; 12 -STOP -) \ No newline at end of file diff --git a/evmcc/test/jump/jump1.evm b/evmcc/test/jump/jump1.evm deleted file mode 100644 index 0df9b4036..000000000 --- a/evmcc/test/jump/jump1.evm +++ /dev/null @@ -1 +0,0 @@ -600458006001600154 diff --git a/evmcc/test/jump/jump1.lll b/evmcc/test/jump/jump1.lll deleted file mode 100644 index 33119edb3..000000000 --- a/evmcc/test/jump/jump1.lll +++ /dev/null @@ -1,11 +0,0 @@ -;; Direct JUMP. -;; output: memory[1] == 1 - -(asm -4 ;; 0 -JUMP ;; 2 -STOP ;; 3 -1 ;; 4 -1 ;; 6 -MSTORE ;; 8 -) \ No newline at end of file diff --git a/evmcc/test/jump/jump2.evm b/evmcc/test/jump/jump2.evm deleted file mode 100644 index 35d75941d..000000000 --- a/evmcc/test/jump/jump2.evm +++ /dev/null @@ -1 +0,0 @@ -6008586001600154 diff --git a/evmcc/test/jump/jump2.lll b/evmcc/test/jump/jump2.lll deleted file mode 100644 index a70d50ecb..000000000 --- a/evmcc/test/jump/jump2.lll +++ /dev/null @@ -1,10 +0,0 @@ -;; Direct JUMP to the end of code. -;; output: memory should have size 0. - -(asm -8 ;; 0 -JUMP ;; 2 -1 ;; 3 -1 ;; 5 -MSTORE ;; 7 -) \ No newline at end of file diff --git a/evmcc/test/jump/jump3.evm b/evmcc/test/jump/jump3.evm deleted file mode 100644 index 599d4a764..000000000 --- a/evmcc/test/jump/jump3.evm +++ /dev/null @@ -1 +0,0 @@ -602a586001600154 diff --git a/evmcc/test/jump/jump3.lll b/evmcc/test/jump/jump3.lll deleted file mode 100644 index bc897e30c..000000000 --- a/evmcc/test/jump/jump3.lll +++ /dev/null @@ -1,10 +0,0 @@ -;; Direct JUMP past the end of code. -;; output: memory should have size 0. - -(asm -42 -JUMP -1 -1 -MSTORE -) \ No newline at end of file diff --git a/evmcc/test/jump/jump4.evm b/evmcc/test/jump/jump4.evm deleted file mode 100644 index 41713f43e..000000000 --- a/evmcc/test/jump/jump4.evm +++ /dev/null @@ -1 +0,0 @@ -600b6009580000600558005d6001600154 diff --git a/evmcc/test/jump/jump4.lll b/evmcc/test/jump/jump4.lll deleted file mode 100644 index 131baee2d..000000000 --- a/evmcc/test/jump/jump4.lll +++ /dev/null @@ -1,17 +0,0 @@ -;; Direct JUMP. -;; output: memory[1] = 1 - -(asm -11 ;; 0 -9 ;; 2 -JUMP ;; 4 --> 9 -STOP ;; 5 -STOP ;; 6 -5 ;; 7 -JUMP ;; 9 --> 11 -STOP ;; 10 -JUMPDEST -1 ;; 11 -1 -MSTORE -) \ No newline at end of file diff --git a/evmcc/test/jump/jump5.evm b/evmcc/test/jump/jump5.evm deleted file mode 100644 index c36d9615b..000000000 --- a/evmcc/test/jump/jump5.evm +++ /dev/null @@ -1 +0,0 @@ -6005600e585d600160015400600f5800 diff --git a/evmcc/test/jump/jump5.lll b/evmcc/test/jump/jump5.lll deleted file mode 100644 index d28b7d4ac..000000000 --- a/evmcc/test/jump/jump5.lll +++ /dev/null @@ -1,16 +0,0 @@ -;; Direct JUMP. -;; output: memory[1] = 1 - -(asm -5 ;; 0 -14 ;; 2 -JUMP ;; 4 --> 14 -JUMPDEST ;; 5 -1 ;; 6 -1 ;; 8 -MSTORE ;; 10 -STOP ;; 11 -15 ;; 12 -JUMP ;; 14 --> 5 -STOP ;; 15 -) \ No newline at end of file diff --git a/evmcc/test/jump/jump6.evm b/evmcc/test/jump/jump6.evm deleted file mode 100644 index 029db7191..000000000 --- a/evmcc/test/jump/jump6.evm +++ /dev/null @@ -1 +0,0 @@ -600358600f600d58006014600758005d6001600154005d600260025400 diff --git a/evmcc/test/jump/jump6.lll b/evmcc/test/jump/jump6.lll deleted file mode 100644 index 1116aa663..000000000 --- a/evmcc/test/jump/jump6.lll +++ /dev/null @@ -1,32 +0,0 @@ -;; Direct JUMP. -;; output: memory[1] = 1 - -;; 0, 2 --> 3 .. 7 --> 13 -*-> 15 .. 19 - -(asm -3 ;; 0 -JUMP ;; 2 - -15 ;; 3 <- start -13 ;; 5 -JUMP ;; 7 <- b -STOP ;; 8 - -20 ;; 9 -7 ;; 11 - -JUMP ;; 13 <- a -STOP ;; 14 - -JUMPDEST ;; 15 <- c -1 ;; 16 -1 ;; 18 -MSTORE ;; 19 -STOP ;; 20 - -JUMPDEST ;; 21 <- d -2 ;; 22 -2 ;; 24 -MSTORE ;; 26 -STOP ;; 27 -) \ No newline at end of file diff --git a/evmcc/test/jump/jumpi_at_the_end.evm b/evmcc/test/jump/jumpi_at_the_end.evm deleted file mode 100644 index 2d7411761..000000000 --- a/evmcc/test/jump/jumpi_at_the_end.evm +++ /dev/null @@ -1 +0,0 @@ -600a6000545d6000536001900380600054600659 diff --git a/evmcc/test/jump/jumpi_at_the_end.lll b/evmcc/test/jump/jumpi_at_the_end.lll deleted file mode 100644 index 263ada6a7..000000000 --- a/evmcc/test/jump/jumpi_at_the_end.lll +++ /dev/null @@ -1 +0,0 @@ -(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI) \ No newline at end of file diff --git a/evmcc/test/jump/loop1.evm b/evmcc/test/jump/loop1.evm deleted file mode 100644 index 7724d6308..000000000 --- a/evmcc/test/jump/loop1.evm +++ /dev/null @@ -1 +0,0 @@ -600a600181038060025960005460015460025400 diff --git a/evmcc/test/jump/loop1.lll b/evmcc/test/jump/loop1.lll deleted file mode 100644 index 0044ec1fb..000000000 --- a/evmcc/test/jump/loop1.lll +++ /dev/null @@ -1,27 +0,0 @@ -;; Produces 1 2 3 4 5 6 7 8 9 10 on the stack and exits - -(asm -10 - -;; 2 -1 -DUP2 -SUB -DUP1 -2 -JUMPI - -;; stack = 1 2 3 4 5 6 7 8 9 10 -0 -MSTORE -1 -MSTORE -2 -MSTORE -;;3 -;;MSTORE - -STOP -) - - diff --git a/evmcc/test/jump/loop2.evm b/evmcc/test/jump/loop2.evm deleted file mode 100644 index faffa4e5b..000000000 --- a/evmcc/test/jump/loop2.evm +++ /dev/null @@ -1 +0,0 @@ -600a80600190038060025960005460015460025400 diff --git a/evmcc/test/jump/loop2.lll b/evmcc/test/jump/loop2.lll deleted file mode 100644 index 9996c52ba..000000000 --- a/evmcc/test/jump/loop2.lll +++ /dev/null @@ -1,28 +0,0 @@ -;; Produces 1 2 3 4 5 6 7 8 9 10 on the stack and exits - -(asm -10 - -;; 2 -DUP1 -1 -SWAP1 -SUB -DUP1 -2 -JUMPI - -;; stack = 1 2 3 4 5 6 7 8 9 10 -0 -MSTORE -1 -MSTORE -2 -MSTORE -;;3 -;;MSTORE - -STOP -) - - diff --git a/evmcc/test/jump/rec1.ethel b/evmcc/test/jump/rec1.ethel deleted file mode 100644 index f83c8e81e..000000000 --- a/evmcc/test/jump/rec1.ethel +++ /dev/null @@ -1,4 +0,0 @@ -let f n = - if n == 0 then 2 else f (n-1) - -return f 10 diff --git a/evmcc/test/jump/rec1.evm b/evmcc/test/jump/rec1.evm deleted file mode 100644 index 2ae62aff6..000000000 --- a/evmcc/test/jump/rec1.evm +++ /dev/null @@ -1 +0,0 @@ -6007600a6010585d60005460206000f26000810e6024596020600182036010585d602658600290509058 \ No newline at end of file diff --git a/evmcc/test/jump/when1.asm b/evmcc/test/jump/when1.asm deleted file mode 100644 index 01d41c266..000000000 --- a/evmcc/test/jump/when1.asm +++ /dev/null @@ -1,10 +0,0 @@ -.code: - PUSH 1 - NOT - PUSH [tag0] - JUMPI - PUSH 13 - PUSH 128 - MSTORE -tag0: - diff --git a/evmcc/test/jump/when1.evm b/evmcc/test/jump/when1.evm deleted file mode 100644 index 303b02623..000000000 --- a/evmcc/test/jump/when1.evm +++ /dev/null @@ -1 +0,0 @@ -60010f600b59600d608054 diff --git a/evmcc/test/jump/when1.lll b/evmcc/test/jump/when1.lll deleted file mode 100644 index 990a6e64a..000000000 --- a/evmcc/test/jump/when1.lll +++ /dev/null @@ -1,2 +0,0 @@ -(when (> 1 0) [i] 13) - \ No newline at end of file From 40c63ba549b2c08996466b4902c459b7585a72b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Tue, 24 Feb 2015 18:13:11 +0100 Subject: [PATCH 08/28] Unused class removed --- libevmjit/Common.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/libevmjit/Common.h b/libevmjit/Common.h index 62731292f..cd0523b12 100644 --- a/libevmjit/Common.h +++ b/libevmjit/Common.h @@ -22,8 +22,6 @@ using bytes = std::vector; using bytes_ref = std::tuple; using code_iterator = byte const*; -struct NoteChannel {}; // FIXME: Use some log library? - enum class ReturnCode { // Success codes From 7b4a663c4f03151efd96cc33627fd342f903fcd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 11:44:06 +0100 Subject: [PATCH 09/28] Correct and tested EVM JIT to Interpreter fallback in case of high gas limit --- libevmjit-cpp/JitVM.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libevmjit-cpp/JitVM.cpp b/libevmjit-cpp/JitVM.cpp index 55dcd94f8..e28fcd39f 100644 --- a/libevmjit-cpp/JitVM.cpp +++ b/libevmjit-cpp/JitVM.cpp @@ -1,10 +1,14 @@ #pragma GCC diagnostic ignored "-Wconversion" + #include "JitVM.h" + +#include +#include #include #include -#include #include + #include "Utils.h" namespace dev @@ -27,12 +31,13 @@ bytesConstRef JitVM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _step) if (rejected) { - UNTESTED; - std::cerr << "Rejected\n"; + cwarn << "Execution rejected by EVM JIT (gas limit: " << m_gas << "), executing with interpreter"; VMFactory::setKind(VMKind::Interpreter); m_fallbackVM = VMFactory::create(m_gas); VMFactory::setKind(VMKind::JIT); - return m_fallbackVM->go(_ext, _onOp, _step); + auto&& output = m_fallbackVM->go(_ext, _onOp, _step); + m_gas = m_fallbackVM->gas(); // copy remaining gas, Executive expects it + return output; } m_data.gas = static_cast(m_gas); From 04309bcaf6fb9a40da1c5027f3d329e73dfe8fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 14:29:47 +0100 Subject: [PATCH 10/28] Move Array helper to separated compilation unit --- libevmjit/Array.cpp | 233 ++++++++++++++++++++++++++++++++++++++++++++ libevmjit/Array.h | 62 ++++++++++++ libevmjit/Stack.cpp | 204 -------------------------------------- libevmjit/Stack.h | 46 +-------- 4 files changed, 296 insertions(+), 249 deletions(-) create mode 100644 libevmjit/Array.cpp create mode 100644 libevmjit/Array.h diff --git a/libevmjit/Array.cpp b/libevmjit/Array.cpp new file mode 100644 index 000000000..bd874a9dc --- /dev/null +++ b/libevmjit/Array.cpp @@ -0,0 +1,233 @@ +#include "Array.h" + +#include "preprocessor/llvm_includes_start.h" +#include +#include "preprocessor/llvm_includes_end.h" + +#include "RuntimeManager.h" +#include "Runtime.h" +#include "Utils.h" + +#include // DEBUG only + +namespace dev +{ +namespace eth +{ +namespace jit +{ + +static const auto c_reallocStep = 1; +static const auto c_reallocMultipier = 2; + +llvm::Value* LazyFunction::call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args) +{ + if (!m_func) + m_func = m_creator(); + + return _builder.CreateCall(m_func, {_args.begin(), _args.size()}); +} + +llvm::Function* Array::createArrayPushFunc() +{ + llvm::Type* argTypes[] = {m_array->getType(), Type::Word}; + auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "array.push", getModule()); + func->setDoesNotThrow(); + func->setDoesNotCapture(1); + + llvm::Type* reallocArgTypes[] = {Type::BytePtr, Type::Size}; + auto reallocFunc = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, reallocArgTypes, false), llvm::Function::ExternalLinkage, "ext_realloc", getModule()); + reallocFunc->setDoesNotThrow(); + reallocFunc->setDoesNotAlias(0); + reallocFunc->setDoesNotCapture(1); + + auto arrayPtr = &func->getArgumentList().front(); + arrayPtr->setName("arrayPtr"); + auto value = arrayPtr->getNextNode(); + value->setName("value"); + + InsertPointGuard guard{m_builder}; + auto entryBB = llvm::BasicBlock::Create(m_builder.getContext(), "Entry", func); + auto reallocBB = llvm::BasicBlock::Create(m_builder.getContext(), "Realloc", func); + auto pushBB = llvm::BasicBlock::Create(m_builder.getContext(), "Push", func); + + m_builder.SetInsertPoint(entryBB); + auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); + auto sizePtr = m_builder.CreateStructGEP(arrayPtr, 1, "sizePtr"); + auto capPtr = m_builder.CreateStructGEP(arrayPtr, 2, "capPtr"); + auto data = m_builder.CreateLoad(dataPtr, "data"); + auto size = m_builder.CreateLoad(sizePtr, "size"); + auto cap = m_builder.CreateLoad(capPtr, "cap"); + auto reallocReq = m_builder.CreateICmpEQ(cap, size, "reallocReq"); + m_builder.CreateCondBr(reallocReq, reallocBB, pushBB); + + m_builder.SetInsertPoint(reallocBB); + auto newCap = m_builder.CreateNUWAdd(cap, m_builder.getInt64(c_reallocStep), "newCap"); + //newCap = m_builder.CreateNUWMul(newCap, m_builder.getInt64(c_reallocMultipier)); + auto reallocSize = m_builder.CreateShl(newCap, 5, "reallocSize"); // size in bytes: newCap * 32 + auto bytes = m_builder.CreateBitCast(data, Type::BytePtr, "bytes"); + auto newBytes = m_builder.CreateCall2(reallocFunc, bytes, reallocSize, "newBytes"); + auto newData = m_builder.CreateBitCast(newBytes, Type::WordPtr, "newData"); + m_builder.CreateStore(newData, dataPtr); + m_builder.CreateStore(newCap, capPtr); + m_builder.CreateBr(pushBB); + + m_builder.SetInsertPoint(pushBB); + auto dataPhi = m_builder.CreatePHI(Type::WordPtr, 2, "dataPhi"); + dataPhi->addIncoming(data, entryBB); + dataPhi->addIncoming(newData, reallocBB); + auto newElemPtr = m_builder.CreateGEP(dataPhi, size, "newElemPtr"); + m_builder.CreateStore(value, newElemPtr); + auto newSize = m_builder.CreateNUWAdd(size, m_builder.getInt64(1), "newSize"); + m_builder.CreateStore(newSize, sizePtr); + m_builder.CreateRetVoid(); + + return func; +} + +llvm::Function* Array::createArraySetFunc() +{ + llvm::Type* argTypes[] = {m_array->getType(), Type::Size, Type::Word}; + auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "array.set", getModule()); + func->setDoesNotThrow(); + func->setDoesNotCapture(1); + + auto arrayPtr = &func->getArgumentList().front(); + arrayPtr->setName("arrayPtr"); + auto index = arrayPtr->getNextNode(); + index->setName("index"); + auto value = index->getNextNode(); + value->setName("value"); + + InsertPointGuard guard{m_builder}; + m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); + auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); + auto data = m_builder.CreateLoad(dataPtr, "data"); + auto valuePtr = m_builder.CreateGEP(data, index, "valuePtr"); + m_builder.CreateStore(value, valuePtr); + m_builder.CreateRetVoid(); + return func; +} + +llvm::Function* Array::createArrayGetFunc() +{ + llvm::Type* argTypes[] = {m_array->getType(), Type::Size}; + auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Word, argTypes, false), llvm::Function::PrivateLinkage, "array.get", getModule()); + func->setDoesNotThrow(); + func->setDoesNotCapture(1); + + auto arrayPtr = &func->getArgumentList().front(); + arrayPtr->setName("arrayPtr"); + auto index = arrayPtr->getNextNode(); + index->setName("index"); + + InsertPointGuard guard{m_builder}; + m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); + auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); + auto data = m_builder.CreateLoad(dataPtr, "data"); + auto valuePtr = m_builder.CreateGEP(data, index, "valuePtr"); + auto value = m_builder.CreateLoad(valuePtr, "value"); + m_builder.CreateRet(value); + return func; +} + +llvm::Function* Array::createFreeFunc() +{ + auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, m_array->getType(), false), llvm::Function::PrivateLinkage, "array.free", getModule()); + func->setDoesNotThrow(); + func->setDoesNotCapture(1); + + auto freeFunc = llvm::Function::Create(llvm::FunctionType::get(Type::Void, Type::BytePtr, false), llvm::Function::ExternalLinkage, "ext_free", getModule()); + freeFunc->setDoesNotThrow(); + freeFunc->setDoesNotCapture(1); + + auto arrayPtr = &func->getArgumentList().front(); + arrayPtr->setName("arrayPtr"); + + InsertPointGuard guard{m_builder}; + m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); + auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); + auto data = m_builder.CreateLoad(dataPtr, "data"); + auto mem = m_builder.CreateBitCast(data, Type::BytePtr, "mem"); + m_builder.CreateCall(freeFunc, mem); + m_builder.CreateRetVoid(); + return func; +} + +Array::Array(llvm::IRBuilder<>& _builder, char const* _name) : + CompilerHelper(_builder), + m_pushFunc([this](){ return createArrayPushFunc(); }), + m_setFunc([this](){ return createArraySetFunc(); }), + m_getFunc([this](){ return createArrayGetFunc(); }), + m_freeFunc([this](){ return createFreeFunc(); }) +{ + llvm::Type* elementTys[] = {Type::WordPtr, Type::Size, Type::Size}; + static auto arrayTy = llvm::StructType::create(elementTys, "Array"); + + m_array = m_builder.CreateAlloca(arrayTy, nullptr, _name); + m_builder.CreateStore(llvm::ConstantAggregateZero::get(arrayTy), m_array); +} + +void Array::pop(llvm::Value* _count) +{ + auto sizePtr = m_builder.CreateStructGEP(m_array, 1, "sizePtr"); + auto size = m_builder.CreateLoad(sizePtr, "size"); + auto newSize = m_builder.CreateNUWSub(size, _count, "newSize"); + m_builder.CreateStore(newSize, sizePtr); +} + +llvm::Value* Array::size() +{ + auto sizePtr = m_builder.CreateStructGEP(m_array, 1, "sizePtr"); + return m_builder.CreateLoad(sizePtr, "array.size"); +} + +} +} +} + +namespace +{ + struct AllocatedMemoryWatchdog + { + std::set allocatedMemory; + + ~AllocatedMemoryWatchdog() + { + if (!allocatedMemory.empty()) + DLOG(mem) << allocatedMemory.size() << " MEM LEAKS!\n"; + } + }; + + AllocatedMemoryWatchdog watchdog; +} + +extern "C" +{ + using namespace dev::eth::jit; + + EXPORT void* ext_realloc(void* _data, size_t _size) + { + //std::cerr << "REALLOC: " << _data << " [" << _size << "]" << std::endl; + auto newData = std::realloc(_data, _size); + if (_data != newData) + { + DLOG(mem) << "REALLOC: " << _data << " -> " << newData << " [" << _size << "]\n"; + watchdog.allocatedMemory.erase(_data); + watchdog.allocatedMemory.insert(newData); + } + return newData; + } + + EXPORT void ext_free(void* _data) + { + std::free(_data); + if (_data) + { + DLOG(mem) << "FREE : " << _data << "\n"; + watchdog.allocatedMemory.erase(_data); + } + } + +} // extern "C" + diff --git a/libevmjit/Array.h b/libevmjit/Array.h new file mode 100644 index 000000000..cadeab7c9 --- /dev/null +++ b/libevmjit/Array.h @@ -0,0 +1,62 @@ +#pragma once + +#include + +#include "CompilerHelper.h" + +namespace dev +{ +namespace eth +{ +namespace jit +{ + +class LazyFunction +{ +public: + using Creator = std::function; + + LazyFunction(Creator _creator) : + m_creator(_creator) + {} + + llvm::Value* call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args); + +private: + llvm::Function* m_func = nullptr; + Creator m_creator; +}; + +class Array : public CompilerHelper +{ +public: + Array(llvm::IRBuilder<>& _builder, char const* _name); + + void push(llvm::Value* _value) { m_pushFunc.call(m_builder, {m_array, _value}); } + void set(llvm::Value* _index, llvm::Value* _value) { m_setFunc.call(m_builder, {m_array, _index, _value}); } + llvm::Value* get(llvm::Value* _index) { return m_getFunc.call(m_builder, {m_array, _index}); } + void pop(llvm::Value* _count); + llvm::Value* size(); + void free() { m_freeFunc.call(m_builder, {m_array}); } + + llvm::Value* getPointerTo() const { return m_array; } + +private: + llvm::Value* m_array = nullptr; + + LazyFunction m_pushFunc; + LazyFunction m_setFunc; + LazyFunction m_getFunc; + LazyFunction m_freeFunc; + + llvm::Function* createArrayPushFunc(); + llvm::Function* createArraySetFunc(); + llvm::Function* createArrayGetFunc(); + llvm::Function* createFreeFunc(); +}; + +} +} +} + + diff --git a/libevmjit/Stack.cpp b/libevmjit/Stack.cpp index dd279ec7b..85bd98fdd 100644 --- a/libevmjit/Stack.cpp +++ b/libevmjit/Stack.cpp @@ -17,171 +17,6 @@ namespace eth namespace jit { -static const auto c_reallocStep = 1; -static const auto c_reallocMultipier = 2; - -llvm::Value* LazyFunction::call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args) -{ - if (!m_func) - m_func = m_creator(); - - return _builder.CreateCall(m_func, {_args.begin(), _args.size()}); -} - -llvm::Function* Array::createArrayPushFunc() -{ - llvm::Type* argTypes[] = {m_array->getType(), Type::Word}; - auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "array.push", getModule()); - func->setDoesNotThrow(); - func->setDoesNotCapture(1); - - llvm::Type* reallocArgTypes[] = {Type::BytePtr, Type::Size}; - auto reallocFunc = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, reallocArgTypes, false), llvm::Function::ExternalLinkage, "ext_realloc", getModule()); - reallocFunc->setDoesNotThrow(); - reallocFunc->setDoesNotAlias(0); - reallocFunc->setDoesNotCapture(1); - - auto arrayPtr = &func->getArgumentList().front(); - arrayPtr->setName("arrayPtr"); - auto value = arrayPtr->getNextNode(); - value->setName("value"); - - InsertPointGuard guard{m_builder}; - auto entryBB = llvm::BasicBlock::Create(m_builder.getContext(), "Entry", func); - auto reallocBB = llvm::BasicBlock::Create(m_builder.getContext(), "Realloc", func); - auto pushBB = llvm::BasicBlock::Create(m_builder.getContext(), "Push", func); - - m_builder.SetInsertPoint(entryBB); - auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); - auto sizePtr = m_builder.CreateStructGEP(arrayPtr, 1, "sizePtr"); - auto capPtr = m_builder.CreateStructGEP(arrayPtr, 2, "capPtr"); - auto data = m_builder.CreateLoad(dataPtr, "data"); - auto size = m_builder.CreateLoad(sizePtr, "size"); - auto cap = m_builder.CreateLoad(capPtr, "cap"); - auto reallocReq = m_builder.CreateICmpEQ(cap, size, "reallocReq"); - m_builder.CreateCondBr(reallocReq, reallocBB, pushBB); - - m_builder.SetInsertPoint(reallocBB); - auto newCap = m_builder.CreateNUWAdd(cap, m_builder.getInt64(c_reallocStep), "newCap"); - //newCap = m_builder.CreateNUWMul(newCap, m_builder.getInt64(c_reallocMultipier)); - auto reallocSize = m_builder.CreateShl(newCap, 5, "reallocSize"); // size in bytes: newCap * 32 - auto bytes = m_builder.CreateBitCast(data, Type::BytePtr, "bytes"); - auto newBytes = m_builder.CreateCall2(reallocFunc, bytes, reallocSize, "newBytes"); - auto newData = m_builder.CreateBitCast(newBytes, Type::WordPtr, "newData"); - m_builder.CreateStore(newData, dataPtr); - m_builder.CreateStore(newCap, capPtr); - m_builder.CreateBr(pushBB); - - m_builder.SetInsertPoint(pushBB); - auto dataPhi = m_builder.CreatePHI(Type::WordPtr, 2, "dataPhi"); - dataPhi->addIncoming(data, entryBB); - dataPhi->addIncoming(newData, reallocBB); - auto newElemPtr = m_builder.CreateGEP(dataPhi, size, "newElemPtr"); - m_builder.CreateStore(value, newElemPtr); - auto newSize = m_builder.CreateNUWAdd(size, m_builder.getInt64(1), "newSize"); - m_builder.CreateStore(newSize, sizePtr); - m_builder.CreateRetVoid(); - - return func; -} - -llvm::Function* Array::createArraySetFunc() -{ - llvm::Type* argTypes[] = {m_array->getType(), Type::Size, Type::Word}; - auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "array.set", getModule()); - func->setDoesNotThrow(); - func->setDoesNotCapture(1); - - auto arrayPtr = &func->getArgumentList().front(); - arrayPtr->setName("arrayPtr"); - auto index = arrayPtr->getNextNode(); - index->setName("index"); - auto value = index->getNextNode(); - value->setName("value"); - - InsertPointGuard guard{m_builder}; - m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); - auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); - auto data = m_builder.CreateLoad(dataPtr, "data"); - auto valuePtr = m_builder.CreateGEP(data, index, "valuePtr"); - m_builder.CreateStore(value, valuePtr); - m_builder.CreateRetVoid(); - return func; -} - -llvm::Function* Array::createArrayGetFunc() -{ - llvm::Type* argTypes[] = {m_array->getType(), Type::Size}; - auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Word, argTypes, false), llvm::Function::PrivateLinkage, "array.get", getModule()); - func->setDoesNotThrow(); - func->setDoesNotCapture(1); - - auto arrayPtr = &func->getArgumentList().front(); - arrayPtr->setName("arrayPtr"); - auto index = arrayPtr->getNextNode(); - index->setName("index"); - - InsertPointGuard guard{m_builder}; - m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); - auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); - auto data = m_builder.CreateLoad(dataPtr, "data"); - auto valuePtr = m_builder.CreateGEP(data, index, "valuePtr"); - auto value = m_builder.CreateLoad(valuePtr, "value"); - m_builder.CreateRet(value); - return func; -} - -llvm::Function* Array::createFreeFunc() -{ - auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, m_array->getType(), false), llvm::Function::PrivateLinkage, "array.free", getModule()); - func->setDoesNotThrow(); - func->setDoesNotCapture(1); - - auto freeFunc = llvm::Function::Create(llvm::FunctionType::get(Type::Void, Type::BytePtr, false), llvm::Function::ExternalLinkage, "ext_free", getModule()); - freeFunc->setDoesNotThrow(); - freeFunc->setDoesNotCapture(1); - - auto arrayPtr = &func->getArgumentList().front(); - arrayPtr->setName("arrayPtr"); - - InsertPointGuard guard{m_builder}; - m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); - auto dataPtr = m_builder.CreateStructGEP(arrayPtr, 0, "dataPtr"); - auto data = m_builder.CreateLoad(dataPtr, "data"); - auto mem = m_builder.CreateBitCast(data, Type::BytePtr, "mem"); - m_builder.CreateCall(freeFunc, mem); - m_builder.CreateRetVoid(); - return func; -} - -Array::Array(llvm::IRBuilder<>& _builder, char const* _name) : - CompilerHelper(_builder), - m_pushFunc([this](){ return createArrayPushFunc(); }), - m_setFunc([this](){ return createArraySetFunc(); }), - m_getFunc([this](){ return createArrayGetFunc(); }), - m_freeFunc([this](){ return createFreeFunc(); }) -{ - llvm::Type* elementTys[] = {Type::WordPtr, Type::Size, Type::Size}; - static auto arrayTy = llvm::StructType::create(elementTys, "Array"); - - m_array = m_builder.CreateAlloca(arrayTy, nullptr, _name); - m_builder.CreateStore(llvm::ConstantAggregateZero::get(arrayTy), m_array); -} - -void Array::pop(llvm::Value* _count) -{ - auto sizePtr = m_builder.CreateStructGEP(m_array, 1, "sizePtr"); - auto size = m_builder.CreateLoad(sizePtr, "size"); - auto newSize = m_builder.CreateNUWSub(size, _count, "newSize"); - m_builder.CreateStore(newSize, sizePtr); -} - -llvm::Value* Array::size() -{ - auto sizePtr = m_builder.CreateStructGEP(m_array, 1, "sizePtr"); - return m_builder.CreateLoad(sizePtr, "array.size"); -} - Stack::Stack(llvm::IRBuilder<>& _builder, RuntimeManager& _runtimeManager): CompilerHelper(_builder), m_runtimeManager(_runtimeManager), @@ -344,22 +179,6 @@ void Stack::push(llvm::Value* _value) } } -namespace -{ - struct AllocatedMemoryWatchdog - { - std::set allocatedMemory; - - ~AllocatedMemoryWatchdog() - { - if (!allocatedMemory.empty()) - DLOG(mem) << allocatedMemory.size() << " MEM LEAKS!\n"; - } - }; - - AllocatedMemoryWatchdog watchdog; -} - extern "C" { using namespace dev::eth::jit; @@ -386,28 +205,5 @@ extern "C" } } - EXPORT void* ext_realloc(void* _data, size_t _size) - { - //std::cerr << "REALLOC: " << _data << " [" << _size << "]" << std::endl; - auto newData = std::realloc(_data, _size); - if (_data != newData) - { - DLOG(mem) << "REALLOC: " << _data << " -> " << newData << " [" << _size << "]\n"; - watchdog.allocatedMemory.erase(_data); - watchdog.allocatedMemory.insert(newData); - } - return newData; - } - - EXPORT void ext_free(void* _data) - { - std::free(_data); - if (_data) - { - DLOG(mem) << "FREE : " << _data << "\n"; - watchdog.allocatedMemory.erase(_data); - } - } - } // extern "C" diff --git a/libevmjit/Stack.h b/libevmjit/Stack.h index ac64d427e..3c526f0d3 100644 --- a/libevmjit/Stack.h +++ b/libevmjit/Stack.h @@ -2,7 +2,7 @@ #include -#include "CompilerHelper.h" +#include "Array.h" namespace dev { @@ -12,50 +12,6 @@ namespace jit { class RuntimeManager; -class LazyFunction -{ -public: - using Creator = std::function; - - LazyFunction(Creator _creator) : - m_creator(_creator) - {} - - llvm::Value* call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args); - -private: - llvm::Function* m_func = nullptr; - Creator m_creator; -}; - -class Array : public CompilerHelper -{ -public: - Array(llvm::IRBuilder<>& _builder, char const* _name); - - void push(llvm::Value* _value) { m_pushFunc.call(m_builder, {m_array, _value}); } - void set(llvm::Value* _index, llvm::Value* _value) { m_setFunc.call(m_builder, {m_array, _index, _value}); } - llvm::Value* get(llvm::Value* _index) { return m_getFunc.call(m_builder, {m_array, _index}); } - void pop(llvm::Value* _count); - llvm::Value* size(); - void free() { m_freeFunc.call(m_builder, {m_array}); } - - llvm::Value* getPointerTo() const { return m_array; } - -private: - llvm::Value* m_array = nullptr; - - LazyFunction m_pushFunc; - LazyFunction m_setFunc; - LazyFunction m_getFunc; - LazyFunction m_freeFunc; - - llvm::Function* createArrayPushFunc(); - llvm::Function* createArraySetFunc(); - llvm::Function* createArrayGetFunc(); - llvm::Function* createFreeFunc(); -}; - class Stack : public CompilerHelper { public: From ffc2120149ad3426a633c4e20f8d4c066db13cfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 15:54:57 +0100 Subject: [PATCH 11/28] Update gas.check helper function: Runtime pointer not needed --- libevmjit/Compiler.cpp | 4 +--- libevmjit/GasMeter.cpp | 42 ++++++++++++++++++++------------------ libevmjit/RuntimeManager.h | 2 +- libevmjit/Type.cpp | 6 ++++++ libevmjit/Type.h | 3 +++ 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index 8e8641ea3..ab95458e8 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include "preprocessor/llvm_includes_end.h" #include "Instruction.h" @@ -162,8 +161,7 @@ std::unique_ptr Compiler::compile(code_iterator _begin, code_itera auto abortBB = llvm::BasicBlock::Create(m_mainFunc->getContext(), "Abort", m_mainFunc); auto firstBB = m_basicBlocks.empty() ? m_stopBB : m_basicBlocks.begin()->second.llvm(); - auto expectTrue = llvm::MDBuilder{m_builder.getContext()}.createBranchWeights(1, 0); - m_builder.CreateCondBr(normalFlow, firstBB, abortBB, expectTrue); + m_builder.CreateCondBr(normalFlow, firstBB, abortBB, Type::expectTrue); for (auto basicBlockPairIt = m_basicBlocks.begin(); basicBlockPairIt != m_basicBlocks.end(); ++basicBlockPairIt) { diff --git a/libevmjit/GasMeter.cpp b/libevmjit/GasMeter.cpp index ca21714e0..92435ba91 100644 --- a/libevmjit/GasMeter.cpp +++ b/libevmjit/GasMeter.cpp @@ -82,34 +82,36 @@ GasMeter::GasMeter(llvm::IRBuilder<>& _builder, RuntimeManager& _runtimeManager) CompilerHelper(_builder), m_runtimeManager(_runtimeManager) { - auto module = getModule(); - - llvm::Type* gasCheckArgs[] = {Type::RuntimePtr, Type::Gas}; - m_gasCheckFunc = llvm::Function::Create(llvm::FunctionType::get(Type::Void, gasCheckArgs, false), llvm::Function::PrivateLinkage, "gas.check", module); - InsertPointGuard guard(m_builder); + llvm::Type* gasCheckArgs[] = {Type::Gas->getPointerTo(), Type::Gas, Type::BytePtr}; + m_gasCheckFunc = llvm::Function::Create(llvm::FunctionType::get(Type::Void, gasCheckArgs, false), llvm::Function::PrivateLinkage, "gas.check", getModule()); + m_gasCheckFunc->setDoesNotThrow(); + m_gasCheckFunc->setDoesNotCapture(1); auto checkBB = llvm::BasicBlock::Create(_builder.getContext(), "Check", m_gasCheckFunc); - auto outOfGasBB = llvm::BasicBlock::Create(_builder.getContext(), "OutOfGas", m_gasCheckFunc); auto updateBB = llvm::BasicBlock::Create(_builder.getContext(), "Update", m_gasCheckFunc); + auto outOfGasBB = llvm::BasicBlock::Create(_builder.getContext(), "OutOfGas", m_gasCheckFunc); - auto rt = &m_gasCheckFunc->getArgumentList().front(); - rt->setName("rt"); - auto cost = rt->getNextNode(); + auto gasPtr = &m_gasCheckFunc->getArgumentList().front(); + gasPtr->setName("gasPtr"); + auto cost = gasPtr->getNextNode(); cost->setName("cost"); + auto jmpBuf = cost->getNextNode(); + jmpBuf->setName("jmpBuf"); + InsertPointGuard guard(m_builder); m_builder.SetInsertPoint(checkBB); - auto gas = m_runtimeManager.getGas(); - gas = m_builder.CreateNSWSub(gas, cost, "gasUpdated"); - auto isOutOfGas = m_builder.CreateICmpSLT(gas, m_builder.getInt64(0), "isOutOfGas"); // gas < 0, with gas == 0 we can still do 0 cost instructions - m_builder.CreateCondBr(isOutOfGas, outOfGasBB, updateBB); - - m_builder.SetInsertPoint(outOfGasBB); - m_runtimeManager.abort(); - m_builder.CreateUnreachable(); + auto gas = m_builder.CreateLoad(gasPtr, "gas"); + auto gasUpdated = m_builder.CreateNSWSub(gas, cost, "gasUpdated"); + auto gasOk = m_builder.CreateICmpSGE(gasUpdated, m_builder.getInt64(0), "gasOk"); // gas >= 0, with gas == 0 we can still do 0 cost instructions + m_builder.CreateCondBr(gasOk, updateBB, outOfGasBB, Type::expectTrue); m_builder.SetInsertPoint(updateBB); - m_runtimeManager.setGas(gas); + m_builder.CreateStore(gasUpdated, gasPtr); m_builder.CreateRetVoid(); + + m_builder.SetInsertPoint(outOfGasBB); + m_runtimeManager.abort(jmpBuf); + m_builder.CreateUnreachable(); } void GasMeter::count(Instruction _inst) @@ -117,7 +119,7 @@ void GasMeter::count(Instruction _inst) if (!m_checkCall) { // Create gas check call with mocked block cost at begining of current cost-block - m_checkCall = createCall(m_gasCheckFunc, {m_runtimeManager.getRuntimePtr(), llvm::UndefValue::get(Type::Gas)}); + m_checkCall = createCall(m_gasCheckFunc, {m_runtimeManager.getGasPtr(), llvm::UndefValue::get(Type::Gas), m_runtimeManager.getJmpBuf()}); } m_blockCost += getStepCost(_inst); @@ -134,7 +136,7 @@ void GasMeter::count(llvm::Value* _cost) } assert(_cost->getType() == Type::Gas); - createCall(m_gasCheckFunc, {m_runtimeManager.getRuntimePtr(), _cost}); + createCall(m_gasCheckFunc, {m_runtimeManager.getGasPtr(), _cost, m_runtimeManager.getJmpBufExt()}); } void GasMeter::countExp(llvm::Value* _exponent) diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index 2f1fb390a..c74460e6a 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -31,6 +31,7 @@ public: llvm::Value* getCodeSize(); llvm::Value* getCallDataSize(); llvm::Value* getJmpBuf() { return m_jmpBuf; } + llvm::Value* getJmpBufExt(); void setGas(llvm::Value* _gas); void registerReturnData(llvm::Value* _index, llvm::Value* _size); @@ -49,7 +50,6 @@ public: private: llvm::Value* getPtr(RuntimeData::Index _index); void set(RuntimeData::Index _index, llvm::Value* _value); - llvm::Value* getJmpBufExt(); llvm::Function* m_longjmp = nullptr; llvm::Value* const m_jmpBuf; diff --git a/libevmjit/Type.cpp b/libevmjit/Type.cpp index 8e2bc13fc..00a143dea 100644 --- a/libevmjit/Type.cpp +++ b/libevmjit/Type.cpp @@ -1,4 +1,7 @@ #include "Type.h" + +#include + #include "RuntimeManager.h" namespace dev @@ -23,6 +26,7 @@ llvm::PointerType* Type::EnvPtr; llvm::PointerType* Type::RuntimeDataPtr; llvm::PointerType* Type::RuntimePtr; llvm::ConstantInt* Constant::gasMax; +llvm::MDNode* Type::expectTrue; void Type::init(llvm::LLVMContext& _context) { @@ -46,6 +50,8 @@ void Type::init(llvm::LLVMContext& _context) RuntimePtr = RuntimeManager::getRuntimeType()->getPointerTo(); Constant::gasMax = llvm::ConstantInt::getSigned(Type::Gas, std::numeric_limits::max()); + + expectTrue = llvm::MDBuilder{_context}.createBranchWeights(1, 0); } } diff --git a/libevmjit/Type.h b/libevmjit/Type.h index b8a4a09eb..ffacc5407 100644 --- a/libevmjit/Type.h +++ b/libevmjit/Type.h @@ -40,6 +40,9 @@ struct Type static llvm::PointerType* RuntimeDataPtr; static llvm::PointerType* RuntimePtr; + // TODO: Redesign static LLVM objects + static llvm::MDNode* expectTrue; + static void init(llvm::LLVMContext& _context); }; From 8bc19786d076061c6dc1667d061215ba220841a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 17:35:30 +0100 Subject: [PATCH 12/28] Pass jmpbuf as mem.require argument --- libevmjit/GasMeter.cpp | 8 ++++---- libevmjit/GasMeter.h | 4 ++-- libevmjit/Memory.cpp | 13 ++++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libevmjit/GasMeter.cpp b/libevmjit/GasMeter.cpp index 92435ba91..34dff5a69 100644 --- a/libevmjit/GasMeter.cpp +++ b/libevmjit/GasMeter.cpp @@ -125,7 +125,7 @@ void GasMeter::count(Instruction _inst) m_blockCost += getStepCost(_inst); } -void GasMeter::count(llvm::Value* _cost) +void GasMeter::count(llvm::Value* _cost, llvm::Value* _jmpBuf) { if (_cost->getType() == Type::Word) { @@ -136,7 +136,7 @@ void GasMeter::count(llvm::Value* _cost) } assert(_cost->getType() == Type::Gas); - createCall(m_gasCheckFunc, {m_runtimeManager.getGasPtr(), _cost, m_runtimeManager.getJmpBufExt()}); + createCall(m_gasCheckFunc, {m_runtimeManager.getGasPtr(), _cost, _jmpBuf ? _jmpBuf : m_runtimeManager.getJmpBuf()}); } void GasMeter::countExp(llvm::Value* _exponent) @@ -215,10 +215,10 @@ void GasMeter::commitCostBlock() assert(m_blockCost == 0); } -void GasMeter::countMemory(llvm::Value* _additionalMemoryInWords) +void GasMeter::countMemory(llvm::Value* _additionalMemoryInWords, llvm::Value* _jmpBuf) { static_assert(c_memoryGas == 1, "Memory gas cost has changed. Update GasMeter."); - count(_additionalMemoryInWords); + count(_additionalMemoryInWords, _jmpBuf); } void GasMeter::countCopy(llvm::Value* _copyWords) diff --git a/libevmjit/GasMeter.h b/libevmjit/GasMeter.h index 4056cd64d..550b5474c 100644 --- a/libevmjit/GasMeter.h +++ b/libevmjit/GasMeter.h @@ -20,7 +20,7 @@ public: void count(Instruction _inst); /// Count additional cost - void count(llvm::Value* _cost); + void count(llvm::Value* _cost, llvm::Value* _jmpBuf = nullptr); /// Calculate & count gas cost for SSTORE instruction void countSStore(class Ext& _ext, llvm::Value* _index, llvm::Value* _newValue); @@ -41,7 +41,7 @@ public: void giveBack(llvm::Value* _gas); /// Generate code that checks the cost of additional memory used by program - void countMemory(llvm::Value* _additionalMemoryInWords); + void countMemory(llvm::Value* _additionalMemoryInWords, llvm::Value* _jmpBuf); /// Count addional gas cost for memory copy void countCopy(llvm::Value* _copyWords); diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 647c5f26a..53a40ffc5 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -27,7 +27,7 @@ llvm::Function* Memory::getRequireFunc() auto& func = m_require; if (!func) { - llvm::Type* argTypes[] = {Type::RuntimePtr, Type::Word, Type::Word}; + llvm::Type* argTypes[] = {Type::RuntimePtr, Type::Word, Type::Word, Type::BytePtr}; func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "mem.require", getModule()); auto rt = func->arg_begin(); rt->setName("rt"); @@ -35,6 +35,8 @@ llvm::Function* Memory::getRequireFunc() offset->setName("offset"); auto size = offset->getNextNode(); size->setName("size"); + auto jmpBuf = size->getNextNode(); + jmpBuf->setName("jmpBuf"); llvm::Type* resizeArgs[] = {Type::RuntimePtr, Type::WordPtr}; auto resize = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, resizeArgs, false), llvm::Function::ExternalLinkage, "mem_resize", getModule()); @@ -79,7 +81,7 @@ llvm::Function* Memory::getRequireFunc() sizeRequired = m_builder.CreateMul(wordsRequired, Constant::get(32), "roundedSizeReq"); auto words = m_builder.CreateUDiv(currSize, Constant::get(32), "words"); // size is always 32*k auto newWords = m_builder.CreateSub(wordsRequired, words, "addtionalWords"); - m_gasMeter.countMemory(newWords); + m_gasMeter.countMemory(newWords, jmpBuf); // Resize m_builder.CreateStore(sizeRequired, sizePtr); auto newData = m_builder.CreateCall2(resize, rt, sizePtr, "newData"); @@ -112,8 +114,6 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType, GasMet auto index = rt->getNextNode(); index->setName("index"); - auto valueSize = _valueType->getPrimitiveSizeInBits() / 8; - this->require(index, Constant::get(valueSize)); auto ptr = getBytePtr(index); if (isWord) ptr = m_builder.CreateBitCast(ptr, Type::WordPtr, "wordPtr"); @@ -163,16 +163,19 @@ llvm::Function* Memory::getStoreByteFunc() llvm::Value* Memory::loadWord(llvm::Value* _addr) { + require(_addr, Constant::get(Type::Word->getPrimitiveSizeInBits() / 8)); return createCall(getLoadWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr}); } void Memory::storeWord(llvm::Value* _addr, llvm::Value* _word) { + require(_addr, Constant::get(Type::Word->getPrimitiveSizeInBits() / 8)); createCall(getStoreWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr, _word}); } void Memory::storeByte(llvm::Value* _addr, llvm::Value* _word) { + require(_addr, Constant::get(Type::Byte->getPrimitiveSizeInBits() / 8)); auto byte = m_builder.CreateTrunc(_word, Type::Byte, "byte"); createCall(getStoreByteFunc(), {getRuntimeManager().getRuntimePtr(), _addr, byte}); } @@ -204,7 +207,7 @@ void Memory::require(llvm::Value* _offset, llvm::Value* _size) if (!constant->getValue()) return; } - createCall(getRequireFunc(), {getRuntimeManager().getRuntimePtr(), _offset, _size}); + createCall(getRequireFunc(), {getRuntimeManager().getRuntimePtr(), _offset, _size, getRuntimeManager().getJmpBuf()}); } void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* _srcIdx, From dac3759ba9c4248fba95277d4c476633fa4ec259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 17:53:58 +0100 Subject: [PATCH 13/28] Extract gas pointer from RuntimeData --- libevmjit/RuntimeManager.cpp | 6 ++++++ libevmjit/RuntimeManager.h | 1 + 2 files changed, 7 insertions(+) diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 62c24326e..6249dedf9 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -101,6 +101,8 @@ RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder, llvm::Value* _jmpBuf auto rtPtr = getRuntimePtr(); m_dataPtr = m_builder.CreateLoad(m_builder.CreateStructGEP(rtPtr, 0), "data"); assert(m_dataPtr->getType() == Type::RuntimeDataPtr); + m_gasPtr = m_builder.CreateStructGEP(m_dataPtr, 0, "gas"); + assert(m_gasPtr->getType() == Type::Gas->getPointerTo()); m_envPtr = m_builder.CreateLoad(m_builder.CreateStructGEP(rtPtr, 1), "env"); assert(m_envPtr->getType() == Type::EnvPtr); } @@ -238,6 +240,10 @@ llvm::Value* RuntimeManager::getGas() llvm::Value* RuntimeManager::getGasPtr() { + if (getMainFunction()) + return m_gasPtr; + + // TODO: eliminated this case return getPtr(RuntimeData::Gas); } diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index c74460e6a..a4a7f33d5 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -54,6 +54,7 @@ private: llvm::Function* m_longjmp = nullptr; llvm::Value* const m_jmpBuf; llvm::Value* m_dataPtr = nullptr; + llvm::Value* m_gasPtr = nullptr; llvm::Value* m_envPtr = nullptr; code_iterator m_codeBegin = {}; From e01a122b700ef05f484a0cf63f1ef3a573f79174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 18:36:11 +0100 Subject: [PATCH 14/28] Remove external jmpBuf pointer --- libevmjit/Memory.cpp | 27 ++++++++++++++------------- libevmjit/Memory.h | 2 +- libevmjit/Runtime.h | 1 - libevmjit/RuntimeManager.cpp | 13 +------------ libevmjit/RuntimeManager.h | 2 -- 5 files changed, 16 insertions(+), 29 deletions(-) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 53a40ffc5..4afe84997 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -40,9 +40,6 @@ llvm::Function* Memory::getRequireFunc() llvm::Type* resizeArgs[] = {Type::RuntimePtr, Type::WordPtr}; auto resize = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, resizeArgs, false), llvm::Function::ExternalLinkage, "mem_resize", getModule()); - llvm::AttrBuilder attrBuilder; - attrBuilder.addAttribute(llvm::Attribute::NoAlias).addAttribute(llvm::Attribute::NoCapture).addAttribute(llvm::Attribute::NonNull).addAttribute(llvm::Attribute::ReadOnly); - resize->setAttributes(llvm::AttributeSet::get(resize->getContext(), 1, attrBuilder)); auto preBB = llvm::BasicBlock::Create(func->getContext(), "Pre", func); auto checkBB = llvm::BasicBlock::Create(func->getContext(), "Check", func); @@ -63,7 +60,7 @@ llvm::Function* Memory::getRequireFunc() auto sizeRequired = m_builder.CreateExtractValue(uaddRes, 0, "sizeReq"); auto overflow1 = m_builder.CreateExtractValue(uaddRes, 1, "overflow1"); auto rtPtr = getRuntimeManager().getRuntimePtr(); - auto sizePtr = m_builder.CreateStructGEP(rtPtr, 4); + auto sizePtr = m_builder.CreateStructGEP(rtPtr, 3); auto currSize = m_builder.CreateLoad(sizePtr, "currSize"); auto tooSmall = m_builder.CreateICmpULE(currSize, sizeRequired, "tooSmall"); auto resizeNeeded = m_builder.CreateOr(tooSmall, overflow1, "resizeNeeded"); @@ -85,7 +82,7 @@ llvm::Function* Memory::getRequireFunc() // Resize m_builder.CreateStore(sizeRequired, sizePtr); auto newData = m_builder.CreateCall2(resize, rt, sizePtr, "newData"); - auto dataPtr = m_builder.CreateStructGEP(rtPtr, 3); + auto dataPtr = m_builder.CreateStructGEP(rtPtr, 2); m_builder.CreateStore(newData, dataPtr); m_builder.CreateBr(returnBB); @@ -96,7 +93,7 @@ llvm::Function* Memory::getRequireFunc() return func; } -llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType, GasMeter&) +llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) { auto isWord = _valueType == Type::Word; @@ -140,7 +137,7 @@ llvm::Function* Memory::getLoadWordFunc() { auto& func = m_loadWord; if (!func) - func = createFunc(false, Type::Word, m_gasMeter); + func = createFunc(false, Type::Word); return func; } @@ -148,7 +145,7 @@ llvm::Function* Memory::getStoreWordFunc() { auto& func = m_storeWord; if (!func) - func = createFunc(true, Type::Word, m_gasMeter); + func = createFunc(true, Type::Word); return func; } @@ -156,7 +153,7 @@ llvm::Function* Memory::getStoreByteFunc() { auto& func = m_storeByte; if (!func) - func = createFunc(true, Type::Byte, m_gasMeter); + func = createFunc(true, Type::Byte); return func; } @@ -183,15 +180,19 @@ void Memory::storeByte(llvm::Value* _addr, llvm::Value* _word) llvm::Value* Memory::getData() { auto rtPtr = getRuntimeManager().getRuntimePtr(); - auto dataPtr = m_builder.CreateStructGEP(rtPtr, 3); - return m_builder.CreateLoad(dataPtr, "data"); + auto dataPtr = m_builder.CreateStructGEP(rtPtr, 2); + auto data = m_builder.CreateLoad(dataPtr, "data"); + assert(data->getType() == Type::BytePtr); + return data; } llvm::Value* Memory::getSize() { auto rtPtr = getRuntimeManager().getRuntimePtr(); - auto sizePtr = m_builder.CreateStructGEP(rtPtr, 4); - return m_builder.CreateLoad(sizePtr, "size"); + auto sizePtr = m_builder.CreateStructGEP(rtPtr, 3); + auto size = m_builder.CreateLoad(sizePtr, "size"); + assert(size->getType() == Type::Word); + return size; } llvm::Value* Memory::getBytePtr(llvm::Value* _index) diff --git a/libevmjit/Memory.h b/libevmjit/Memory.h index e8edce735..92a8ce126 100644 --- a/libevmjit/Memory.h +++ b/libevmjit/Memory.h @@ -30,7 +30,7 @@ public: private: GasMeter& m_gasMeter; - llvm::Function* createFunc(bool _isStore, llvm::Type* _type, GasMeter& _gasMeter); + llvm::Function* createFunc(bool _isStore, llvm::Type* _type); llvm::Function* getRequireFunc(); llvm::Function* getLoadWordFunc(); diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 69f2788a4..ac2e0acd7 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -25,7 +25,6 @@ public: private: RuntimeData& m_data; ///< Pointer to data. Expected by compiled contract. Env& m_env; ///< Pointer to environment proxy. Expected by compiled contract. - void* m_currJmpBuf = nullptr; ///< Pointer to jump buffer. Expected by compiled contract. byte* m_memoryData = nullptr; i256 m_memorySize; MemoryImpl m_memory; diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 6249dedf9..b267a1c93 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -50,7 +50,6 @@ llvm::StructType* RuntimeManager::getRuntimeType() { Type::RuntimeDataPtr, // data Type::EnvPtr, // Env* - Type::BytePtr, // jmpbuf Type::BytePtr, // memory data Type::Word, // memory size }; @@ -93,10 +92,6 @@ RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder, llvm::Value* _jmpBuf { m_longjmp = llvm::Intrinsic::getDeclaration(getModule(), llvm::Intrinsic::eh_sjlj_longjmp); - // save jmpBuf to be used in helper functions - auto ptr = m_builder.CreateStructGEP(getRuntimePtr(), 2); - m_builder.CreateStore(m_jmpBuf, ptr); - // Unpack data auto rtPtr = getRuntimePtr(); m_dataPtr = m_builder.CreateLoad(m_builder.CreateStructGEP(rtPtr, 0), "data"); @@ -154,7 +149,7 @@ void RuntimeManager::set(RuntimeData::Index _index, llvm::Value* _value) void RuntimeManager::registerReturnData(llvm::Value* _offset, llvm::Value* _size) { - auto memPtr = getBuilder().CreateStructGEP(getRuntimePtr(), 3); + auto memPtr = getBuilder().CreateStructGEP(getRuntimePtr(), 2); auto mem = getBuilder().CreateLoad(memPtr, "memory"); auto idx = m_builder.CreateTrunc(_offset, Type::Size, "idx"); // Never allow memory index be a type bigger than i64 // TODO: Report bug & fix to LLVM auto returnDataPtr = getBuilder().CreateGEP(mem, idx); @@ -225,12 +220,6 @@ llvm::Value* RuntimeManager::getCallDataSize() return getBuilder().CreateZExt(value, Type::Word); } -llvm::Value* RuntimeManager::getJmpBufExt() -{ - auto ptr = getBuilder().CreateStructGEP(getRuntimePtr(), 2); - return getBuilder().CreateLoad(ptr, "jmpBufExt"); -} - llvm::Value* RuntimeManager::getGas() { auto gas = get(RuntimeData::Gas); diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index a4a7f33d5..94e1eb303 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -31,7 +31,6 @@ public: llvm::Value* getCodeSize(); llvm::Value* getCallDataSize(); llvm::Value* getJmpBuf() { return m_jmpBuf; } - llvm::Value* getJmpBufExt(); void setGas(llvm::Value* _gas); void registerReturnData(llvm::Value* _index, llvm::Value* _size); @@ -40,7 +39,6 @@ public: void exit(ReturnCode _returnCode); void abort(llvm::Value* _jmpBuf); - void abort() { abort(getJmpBufExt()); } void setStack(Stack& _stack) { m_stack = &_stack; } From 41f1e0d03581309351686659e5ca2fa185a319ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Wed, 25 Feb 2015 21:02:10 +0100 Subject: [PATCH 15/28] Create Array for memory --- libevmjit/Array.cpp | 24 +++++++++++++++++++----- libevmjit/Array.h | 3 +++ libevmjit/Memory.cpp | 7 +++++-- libevmjit/Memory.h | 4 +++- libevmjit/Runtime.h | 3 +++ libevmjit/RuntimeManager.cpp | 9 +++++++++ libevmjit/RuntimeManager.h | 2 ++ 7 files changed, 44 insertions(+), 8 deletions(-) diff --git a/libevmjit/Array.cpp b/libevmjit/Array.cpp index bd874a9dc..b44e4e174 100644 --- a/libevmjit/Array.cpp +++ b/libevmjit/Array.cpp @@ -154,6 +154,13 @@ llvm::Function* Array::createFreeFunc() return func; } +llvm::Type* Array::getType() +{ + llvm::Type* elementTys[] = {Type::WordPtr, Type::Size, Type::Size}; + static auto arrayTy = llvm::StructType::create(elementTys, "Array"); + return arrayTy; +} + Array::Array(llvm::IRBuilder<>& _builder, char const* _name) : CompilerHelper(_builder), m_pushFunc([this](){ return createArrayPushFunc(); }), @@ -161,13 +168,20 @@ Array::Array(llvm::IRBuilder<>& _builder, char const* _name) : m_getFunc([this](){ return createArrayGetFunc(); }), m_freeFunc([this](){ return createFreeFunc(); }) { - llvm::Type* elementTys[] = {Type::WordPtr, Type::Size, Type::Size}; - static auto arrayTy = llvm::StructType::create(elementTys, "Array"); - - m_array = m_builder.CreateAlloca(arrayTy, nullptr, _name); - m_builder.CreateStore(llvm::ConstantAggregateZero::get(arrayTy), m_array); + m_array = m_builder.CreateAlloca(getType(), nullptr, _name); + m_builder.CreateStore(llvm::ConstantAggregateZero::get(getType()), m_array); } +Array::Array(llvm::IRBuilder<>& _builder, llvm::Value* _array) : + CompilerHelper(_builder), + m_array(_array), + m_pushFunc([this](){ return createArrayPushFunc(); }), + m_setFunc([this](){ return createArraySetFunc(); }), + m_getFunc([this](){ return createArrayGetFunc(); }), + m_freeFunc([this](){ return createFreeFunc(); }) +{} + + void Array::pop(llvm::Value* _count) { auto sizePtr = m_builder.CreateStructGEP(m_array, 1, "sizePtr"); diff --git a/libevmjit/Array.h b/libevmjit/Array.h index cadeab7c9..0cd7abb17 100644 --- a/libevmjit/Array.h +++ b/libevmjit/Array.h @@ -31,6 +31,7 @@ class Array : public CompilerHelper { public: Array(llvm::IRBuilder<>& _builder, char const* _name); + Array(llvm::IRBuilder<>& _builder, llvm::Value* _array); void push(llvm::Value* _value) { m_pushFunc.call(m_builder, {m_array, _value}); } void set(llvm::Value* _index, llvm::Value* _value) { m_setFunc.call(m_builder, {m_array, _index, _value}); } @@ -41,6 +42,8 @@ public: llvm::Value* getPointerTo() const { return m_array; } + static llvm::Type* getType(); + private: llvm::Value* m_array = nullptr; diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 4afe84997..db4c36c70 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -19,6 +19,7 @@ namespace jit Memory::Memory(RuntimeManager& _runtimeManager, GasMeter& _gasMeter): RuntimeHelper(_runtimeManager), // TODO: RuntimeHelper not needed + m_memory{getBuilder(), _runtimeManager.getMem()}, m_gasMeter(_gasMeter) {} @@ -27,7 +28,7 @@ llvm::Function* Memory::getRequireFunc() auto& func = m_require; if (!func) { - llvm::Type* argTypes[] = {Type::RuntimePtr, Type::Word, Type::Word, Type::BytePtr}; + llvm::Type* argTypes[] = {Type::RuntimePtr, Type::Word, Type::Word, Type::BytePtr, Array::getType()->getPointerTo()}; func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "mem.require", getModule()); auto rt = func->arg_begin(); rt->setName("rt"); @@ -37,6 +38,8 @@ llvm::Function* Memory::getRequireFunc() size->setName("size"); auto jmpBuf = size->getNextNode(); jmpBuf->setName("jmpBuf"); + auto mem = jmpBuf->getNextNode(); + mem->setName("mem"); llvm::Type* resizeArgs[] = {Type::RuntimePtr, Type::WordPtr}; auto resize = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, resizeArgs, false), llvm::Function::ExternalLinkage, "mem_resize", getModule()); @@ -208,7 +211,7 @@ void Memory::require(llvm::Value* _offset, llvm::Value* _size) if (!constant->getValue()) return; } - createCall(getRequireFunc(), {getRuntimeManager().getRuntimePtr(), _offset, _size, getRuntimeManager().getJmpBuf()}); + createCall(getRequireFunc(), {getRuntimeManager().getRuntimePtr(), _offset, _size, getRuntimeManager().getJmpBuf(), getRuntimeManager().getMem()}); } void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* _srcIdx, diff --git a/libevmjit/Memory.h b/libevmjit/Memory.h index 92a8ce126..beb535226 100644 --- a/libevmjit/Memory.h +++ b/libevmjit/Memory.h @@ -1,6 +1,6 @@ #pragma once -#include "CompilerHelper.h" +#include "Array.h" namespace dev { @@ -28,6 +28,8 @@ public: void require(llvm::Value* _offset, llvm::Value* _size); private: + Array m_memory; + GasMeter& m_gasMeter; llvm::Function* createFunc(bool _isStore, llvm::Type* _type); diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index ac2e0acd7..55b84d575 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -27,6 +27,9 @@ private: Env& m_env; ///< Pointer to environment proxy. Expected by compiled contract. byte* m_memoryData = nullptr; i256 m_memorySize; + byte* m_memData = nullptr; + uint64_t m_memSize = 0; + uint64_t m_memCap = 0; MemoryImpl m_memory; }; diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index b267a1c93..b6f945c97 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -52,6 +52,7 @@ llvm::StructType* RuntimeManager::getRuntimeType() Type::EnvPtr, // Env* Type::BytePtr, // memory data Type::Word, // memory size + Array::getType() }; type = llvm::StructType::create(elems, "Runtime"); } @@ -122,6 +123,14 @@ llvm::Value* RuntimeManager::getDataPtr() return dataPtr; } +llvm::Value* RuntimeManager::getMem() +{ + auto rtPtr = getRuntimePtr(); + auto memPtr = m_builder.CreateStructGEP(rtPtr, 4, "mem"); + assert(memPtr->getType() == Array::getType()->getPointerTo()); + return memPtr; +} + llvm::Value* RuntimeManager::getEnvPtr() { assert(getMainFunction()); // Available only in main function diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index 94e1eb303..0462c7d6a 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -33,6 +33,8 @@ public: llvm::Value* getJmpBuf() { return m_jmpBuf; } void setGas(llvm::Value* _gas); + llvm::Value* getMem(); + void registerReturnData(llvm::Value* _index, llvm::Value* _size); void registerSuicide(llvm::Value* _balanceAddress); From 6d337d274aa308b4e76bfb2b8b274021a6aa1679 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 26 Feb 2015 14:59:57 +0100 Subject: [PATCH 16/28] Using Array as a second memory --- libevmjit/Array.cpp | 85 +++++++++++++++++++++++++++++++---- libevmjit/Array.h | 21 ++++++--- libevmjit/ExecutionEngine.cpp | 5 +++ libevmjit/Memory.cpp | 29 ++++++++---- libevmjit/Runtime.h | 1 + 5 files changed, 117 insertions(+), 24 deletions(-) diff --git a/libevmjit/Array.cpp b/libevmjit/Array.cpp index b44e4e174..1c0fff098 100644 --- a/libevmjit/Array.cpp +++ b/libevmjit/Array.cpp @@ -1,6 +1,7 @@ #include "Array.h" #include "preprocessor/llvm_includes_start.h" +#include #include #include "preprocessor/llvm_includes_end.h" @@ -20,12 +21,12 @@ namespace jit static const auto c_reallocStep = 1; static const auto c_reallocMultipier = 2; -llvm::Value* LazyFunction::call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args) +llvm::Value* LazyFunction::call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args, llvm::Twine const& _name) { if (!m_func) m_func = m_creator(); - return _builder.CreateCall(m_func, {_args.begin(), _args.size()}); + return _builder.CreateCall(m_func, {_args.begin(), _args.size()}, _name); } llvm::Function* Array::createArrayPushFunc() @@ -35,12 +36,6 @@ llvm::Function* Array::createArrayPushFunc() func->setDoesNotThrow(); func->setDoesNotCapture(1); - llvm::Type* reallocArgTypes[] = {Type::BytePtr, Type::Size}; - auto reallocFunc = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, reallocArgTypes, false), llvm::Function::ExternalLinkage, "ext_realloc", getModule()); - reallocFunc->setDoesNotThrow(); - reallocFunc->setDoesNotAlias(0); - reallocFunc->setDoesNotCapture(1); - auto arrayPtr = &func->getArgumentList().front(); arrayPtr->setName("arrayPtr"); auto value = arrayPtr->getNextNode(); @@ -66,7 +61,7 @@ llvm::Function* Array::createArrayPushFunc() //newCap = m_builder.CreateNUWMul(newCap, m_builder.getInt64(c_reallocMultipier)); auto reallocSize = m_builder.CreateShl(newCap, 5, "reallocSize"); // size in bytes: newCap * 32 auto bytes = m_builder.CreateBitCast(data, Type::BytePtr, "bytes"); - auto newBytes = m_builder.CreateCall2(reallocFunc, bytes, reallocSize, "newBytes"); + auto newBytes = m_reallocFunc.call(m_builder, {bytes, reallocSize}, "newBytes"); auto newData = m_builder.CreateBitCast(newBytes, Type::WordPtr, "newData"); m_builder.CreateStore(newData, dataPtr); m_builder.CreateStore(newCap, capPtr); @@ -131,6 +126,28 @@ llvm::Function* Array::createArrayGetFunc() return func; } +llvm::Function* Array::createGetPtrFunc() +{ + llvm::Type* argTypes[] = {m_array->getType(), Type::Size}; + auto func = llvm::Function::Create(llvm::FunctionType::get(Type::WordPtr, argTypes, false), llvm::Function::PrivateLinkage, "array.getPtr", getModule()); + func->setDoesNotThrow(); + func->setDoesNotCapture(1); + + auto arrayPtr = &func->getArgumentList().front(); + arrayPtr->setName("arrayPtr"); + auto index = arrayPtr->getNextNode(); + index->setName("index"); + + InsertPointGuard guard{m_builder}; + m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); + auto dataPtr = m_builder.CreateBitCast(arrayPtr, Type::BytePtr->getPointerTo(), "dataPtr"); + auto data = m_builder.CreateLoad(dataPtr, "data"); + auto bytePtr = m_builder.CreateGEP(data, index, "bytePtr"); + auto wordPtr = m_builder.CreateBitCast(bytePtr, Type::WordPtr, "wordPtr"); + m_builder.CreateRet(wordPtr); + return func; +} + llvm::Function* Array::createFreeFunc() { auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, m_array->getType(), false), llvm::Function::PrivateLinkage, "array.free", getModule()); @@ -154,6 +171,49 @@ llvm::Function* Array::createFreeFunc() return func; } +llvm::Function* Array::getReallocFunc() +{ + if (auto func = getModule()->getFunction("ext_realloc")) + return func; + + llvm::Type* reallocArgTypes[] = {Type::BytePtr, Type::Size}; + auto reallocFunc = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, reallocArgTypes, false), llvm::Function::ExternalLinkage, "ext_realloc", getModule()); + reallocFunc->setDoesNotThrow(); + reallocFunc->setDoesNotAlias(0); + reallocFunc->setDoesNotCapture(1); + return reallocFunc; +} + +llvm::Function* Array::createExtendFunc() +{ + llvm::Type* argTypes[] = {m_array->getType(), Type::Size}; + auto func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "array.extend", getModule()); + func->setDoesNotThrow(); + func->setDoesNotCapture(1); + + auto arrayPtr = &func->getArgumentList().front(); + arrayPtr->setName("arrayPtr"); + auto newSize = arrayPtr->getNextNode(); + newSize->setName("newSize"); + + InsertPointGuard guard{m_builder}; + m_builder.SetInsertPoint(llvm::BasicBlock::Create(m_builder.getContext(), {}, func)); + auto dataPtr = m_builder.CreateBitCast(arrayPtr, Type::BytePtr->getPointerTo(), "dataPtr");// TODO: Use byte* in Array + auto sizePtr = m_builder.CreateStructGEP(arrayPtr, 1, "sizePtr"); + auto capPtr = m_builder.CreateStructGEP(arrayPtr, 2, "capPtr"); + auto data = m_builder.CreateLoad(dataPtr, "data"); + auto size = m_builder.CreateLoad(sizePtr, "size"); + auto extSize = m_builder.CreateNUWSub(newSize, size, "extSize"); + auto newData = m_reallocFunc.call(m_builder, {data, newSize}, "newData"); // TODO: Check realloc result for null + auto extPtr = m_builder.CreateGEP(newData, size, "extPtr"); + m_builder.CreateMemSet(extPtr, m_builder.getInt8(0), extSize, 16); + m_builder.CreateStore(newData, dataPtr); + m_builder.CreateStore(newSize, sizePtr); + m_builder.CreateStore(newSize, capPtr); + m_builder.CreateRetVoid(); + return func; +} + llvm::Type* Array::getType() { llvm::Type* elementTys[] = {Type::WordPtr, Type::Size, Type::Size}; @@ -196,6 +256,13 @@ llvm::Value* Array::size() return m_builder.CreateLoad(sizePtr, "array.size"); } +void Array::extend(llvm::Value* _arrayPtr, llvm::Value* _size) +{ + assert(_arrayPtr->getType() == m_array->getType()); + assert(_size->getType() == Type::Size); + m_extendFunc.call(m_builder, {_arrayPtr, _size}); +} + } } } diff --git a/libevmjit/Array.h b/libevmjit/Array.h index 0cd7abb17..cab81943a 100644 --- a/libevmjit/Array.h +++ b/libevmjit/Array.h @@ -20,7 +20,7 @@ public: m_creator(_creator) {} - llvm::Value* call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args); + llvm::Value* call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args, llvm::Twine const& _name = {}); private: llvm::Function* m_func = nullptr; @@ -40,6 +40,9 @@ public: llvm::Value* size(); void free() { m_freeFunc.call(m_builder, {m_array}); } + void extend(llvm::Value* _arrayPtr, llvm::Value* _size); + llvm::Value* getPtr(llvm::Value* _arrayPtr, llvm::Value* _index) { return m_getPtrFunc.call(m_builder, {_arrayPtr, _index}); } + llvm::Value* getPointerTo() const { return m_array; } static llvm::Type* getType(); @@ -47,15 +50,21 @@ public: private: llvm::Value* m_array = nullptr; - LazyFunction m_pushFunc; - LazyFunction m_setFunc; - LazyFunction m_getFunc; - LazyFunction m_freeFunc; - llvm::Function* createArrayPushFunc(); llvm::Function* createArraySetFunc(); llvm::Function* createArrayGetFunc(); + llvm::Function* createGetPtrFunc(); llvm::Function* createFreeFunc(); + llvm::Function* createExtendFunc(); + llvm::Function* getReallocFunc(); + + LazyFunction m_pushFunc = {[this](){ return createArrayPushFunc(); }}; // TODO: If works on MSVC, remove form initialization list + LazyFunction m_setFunc; + LazyFunction m_getPtrFunc = {[this](){ return createGetPtrFunc(); }}; + LazyFunction m_getFunc; + LazyFunction m_freeFunc; + LazyFunction m_extendFunc = {[this](){ return createExtendFunc(); }}; + LazyFunction m_reallocFunc = {[this](){ return getReallocFunc(); }}; }; } diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index dd8fb7e62..8d091c6f9 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -160,6 +160,11 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) if (g_stats) statsCollector.stats.push_back(std::move(listener)); + if (runtime.m_memData) + { + std::cerr << "MEM: " << (size_t) runtime.m_memData << " [" << runtime.m_memSize << ", " << runtime.m_memCap << "}\n"; + } + return returnCode; } diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index db4c36c70..a90b20032 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -87,6 +87,8 @@ llvm::Function* Memory::getRequireFunc() auto newData = m_builder.CreateCall2(resize, rt, sizePtr, "newData"); auto dataPtr = m_builder.CreateStructGEP(rtPtr, 2); m_builder.CreateStore(newData, dataPtr); + auto extendSize = m_builder.CreateTrunc(sizeRequired, Type::Size, "extendSize"); + m_memory.extend(mem, extendSize); m_builder.CreateBr(returnBB); // BB "Return" @@ -100,8 +102,8 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) { auto isWord = _valueType == Type::Word; - llvm::Type* storeArgs[] = {Type::RuntimePtr, Type::Word, _valueType}; - llvm::Type* loadArgs[] = {Type::RuntimePtr, Type::Word}; + llvm::Type* storeArgs[] = {Type::RuntimePtr, Type::Word, _valueType, Array::getType()->getPointerTo()}; + llvm::Type* loadArgs[] = {Type::RuntimePtr, Type::Word, Array::getType()->getPointerTo()}; auto name = _isStore ? isWord ? "mstore" : "mstore8" : "mload"; auto funcType = _isStore ? llvm::FunctionType::get(Type::Void, storeArgs, false) : llvm::FunctionType::get(Type::Word, loadArgs, false); auto func = llvm::Function::Create(funcType, llvm::Function::PrivateLinkage, name, getModule()); @@ -119,15 +121,24 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) ptr = m_builder.CreateBitCast(ptr, Type::WordPtr, "wordPtr"); if (_isStore) { - llvm::Value* value = index->getNextNode(); - value->setName("value"); - if (isWord) - value = Endianness::toBE(m_builder, value); + auto valueArg = index->getNextNode(); + valueArg->setName("value"); + auto mem = valueArg->getNextNode(); + mem->setName("mem"); + auto value = isWord ? Endianness::toBE(m_builder, valueArg) : valueArg; m_builder.CreateStore(value, ptr); + auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); + auto valuePtr = m_builder.CreateBitCast(memPtr, _valueType->getPointerTo(), "valuePtr"); + m_builder.CreateStore(value, valuePtr); m_builder.CreateRetVoid(); } else { + auto mem = index->getNextNode(); + mem->setName("mem"); + auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); + + llvm::Value* ret = m_builder.CreateLoad(ptr); ret = Endianness::toNative(m_builder, ret); m_builder.CreateRet(ret); @@ -164,20 +175,20 @@ llvm::Function* Memory::getStoreByteFunc() llvm::Value* Memory::loadWord(llvm::Value* _addr) { require(_addr, Constant::get(Type::Word->getPrimitiveSizeInBits() / 8)); - return createCall(getLoadWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr}); + return createCall(getLoadWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr, getRuntimeManager().getMem()}); } void Memory::storeWord(llvm::Value* _addr, llvm::Value* _word) { require(_addr, Constant::get(Type::Word->getPrimitiveSizeInBits() / 8)); - createCall(getStoreWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr, _word}); + createCall(getStoreWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr, _word, getRuntimeManager().getMem()}); } void Memory::storeByte(llvm::Value* _addr, llvm::Value* _word) { require(_addr, Constant::get(Type::Byte->getPrimitiveSizeInBits() / 8)); auto byte = m_builder.CreateTrunc(_word, Type::Byte, "byte"); - createCall(getStoreByteFunc(), {getRuntimeManager().getRuntimePtr(), _addr, byte}); + createCall(getStoreByteFunc(), {getRuntimeManager().getRuntimePtr(), _addr, byte, getRuntimeManager().getMem()}); } llvm::Value* Memory::getData() diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 55b84d575..fb612fb9d 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -27,6 +27,7 @@ private: Env& m_env; ///< Pointer to environment proxy. Expected by compiled contract. byte* m_memoryData = nullptr; i256 m_memorySize; +public: byte* m_memData = nullptr; uint64_t m_memSize = 0; uint64_t m_memCap = 0; From 2293923a641bdbbcd4823f84a702cad820e8d310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 26 Feb 2015 15:32:41 +0100 Subject: [PATCH 17/28] Load memory data from Array memory --- libevmjit/Memory.cpp | 11 ++++++----- libevmjit/Runtime.cpp | 2 +- libevmjit/RuntimeManager.cpp | 2 +- libevmjit/RuntimeManager.h | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index a90b20032..756f2a590 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -139,7 +139,7 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); - llvm::Value* ret = m_builder.CreateLoad(ptr); + llvm::Value* ret = m_builder.CreateLoad(memPtr); ret = Endianness::toNative(m_builder, ret); m_builder.CreateRet(ret); } @@ -193,9 +193,8 @@ void Memory::storeByte(llvm::Value* _addr, llvm::Value* _word) llvm::Value* Memory::getData() { - auto rtPtr = getRuntimeManager().getRuntimePtr(); - auto dataPtr = m_builder.CreateStructGEP(rtPtr, 2); - auto data = m_builder.CreateLoad(dataPtr, "data"); + auto memPtr = m_builder.CreateBitCast(getRuntimeManager().getMem(), Type::BytePtr->getPointerTo()); + auto data = m_builder.CreateLoad(memPtr, "data"); assert(data->getType() == Type::BytePtr); return data; } @@ -255,8 +254,10 @@ void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* auto src = m_builder.CreateGEP(_srcPtr, idx64, "src"); auto dstIdx = m_builder.CreateTrunc(_destMemIdx, Type::Size, "dstIdx"); // Never allow memory index be a type bigger than i64 - auto dst = m_builder.CreateGEP(getData(), dstIdx, "dst"); + auto dst = m_memory.getPtr(getRuntimeManager().getMem(), dstIdx); + auto dst2 = m_builder.CreateGEP(getData(), dstIdx, "dst2"); m_builder.CreateMemCpy(dst, src, bytesToCopy, 0); + m_builder.CreateMemCpy(dst2, src, bytesToCopy, 0); } } diff --git a/libevmjit/Runtime.cpp b/libevmjit/Runtime.cpp index 69937368c..e7953a417 100644 --- a/libevmjit/Runtime.cpp +++ b/libevmjit/Runtime.cpp @@ -19,7 +19,7 @@ bytes_ref Runtime::getReturnData() const auto data = m_data.callData; auto size = static_cast(m_data.callDataSize); - if (data < m_memory.data() || data >= m_memory.data() + m_memory.size() || size == 0) + if (data < m_memData || data >= m_memData + m_memSize || size == 0) { assert(size == 0); // data can be an invalid pointer only if size is 0 m_data.callData = nullptr; diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index b6f945c97..3e18c8c18 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -158,7 +158,7 @@ void RuntimeManager::set(RuntimeData::Index _index, llvm::Value* _value) void RuntimeManager::registerReturnData(llvm::Value* _offset, llvm::Value* _size) { - auto memPtr = getBuilder().CreateStructGEP(getRuntimePtr(), 2); + auto memPtr = m_builder.CreateBitCast(getMem(), Type::BytePtr->getPointerTo()); auto mem = getBuilder().CreateLoad(memPtr, "memory"); auto idx = m_builder.CreateTrunc(_offset, Type::Size, "idx"); // Never allow memory index be a type bigger than i64 // TODO: Report bug & fix to LLVM auto returnDataPtr = getBuilder().CreateGEP(mem, idx); diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index 0462c7d6a..65b63c72b 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -35,7 +35,7 @@ public: llvm::Value* getMem(); - void registerReturnData(llvm::Value* _index, llvm::Value* _size); + void registerReturnData(llvm::Value* _index, llvm::Value* _size); // TODO: Move to Memory. void registerSuicide(llvm::Value* _balanceAddress); void exit(ReturnCode _returnCode); From 3197dca8a50167d0d350179fd8ed2264582ee4bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Thu, 26 Feb 2015 16:57:43 +0100 Subject: [PATCH 18/28] Remove old memory backend --- libevmjit/Array.cpp | 4 ++-- libevmjit/Array.h | 2 +- libevmjit/ExecutionEngine.cpp | 1 - libevmjit/ExecutionEngine.h | 5 ---- libevmjit/Memory.cpp | 43 ++++------------------------------- libevmjit/Runtime.h | 5 +--- 6 files changed, 9 insertions(+), 51 deletions(-) diff --git a/libevmjit/Array.cpp b/libevmjit/Array.cpp index 1c0fff098..21de061c6 100644 --- a/libevmjit/Array.cpp +++ b/libevmjit/Array.cpp @@ -250,9 +250,9 @@ void Array::pop(llvm::Value* _count) m_builder.CreateStore(newSize, sizePtr); } -llvm::Value* Array::size() +llvm::Value* Array::size(llvm::Value* _array) { - auto sizePtr = m_builder.CreateStructGEP(m_array, 1, "sizePtr"); + auto sizePtr = m_builder.CreateStructGEP(_array ? _array : m_array, 1, "sizePtr"); return m_builder.CreateLoad(sizePtr, "array.size"); } diff --git a/libevmjit/Array.h b/libevmjit/Array.h index cab81943a..70e9e5f01 100644 --- a/libevmjit/Array.h +++ b/libevmjit/Array.h @@ -37,7 +37,7 @@ public: void set(llvm::Value* _index, llvm::Value* _value) { m_setFunc.call(m_builder, {m_array, _index, _value}); } llvm::Value* get(llvm::Value* _index) { return m_getFunc.call(m_builder, {m_array, _index}); } void pop(llvm::Value* _count); - llvm::Value* size(); + llvm::Value* size(llvm::Value* _array = nullptr); void free() { m_freeFunc.call(m_builder, {m_array}); } void extend(llvm::Value* _arrayPtr, llvm::Value* _size); diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index 8d091c6f9..0b2365f01 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -153,7 +153,6 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) if (returnCode == ReturnCode::Return) { returnData = runtime.getReturnData(); // Save reference to return data - std::swap(m_memory, runtime.getMemory()); // Take ownership of memory } listener->stateChanged(ExecState::Finished); diff --git a/libevmjit/ExecutionEngine.h b/libevmjit/ExecutionEngine.h index c0567828c..99cc77cce 100644 --- a/libevmjit/ExecutionEngine.h +++ b/libevmjit/ExecutionEngine.h @@ -49,11 +49,6 @@ public: /// Reference to returned data (RETURN opcode used) bytes_ref returnData; - -private: - /// After execution, if RETURN used, memory is moved there - /// to allow client copy the returned data - bytes m_memory; }; } diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 756f2a590..bfb48a245 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -41,9 +41,6 @@ llvm::Function* Memory::getRequireFunc() auto mem = jmpBuf->getNextNode(); mem->setName("mem"); - llvm::Type* resizeArgs[] = {Type::RuntimePtr, Type::WordPtr}; - auto resize = llvm::Function::Create(llvm::FunctionType::get(Type::BytePtr, resizeArgs, false), llvm::Function::ExternalLinkage, "mem_resize", getModule()); - auto preBB = llvm::BasicBlock::Create(func->getContext(), "Pre", func); auto checkBB = llvm::BasicBlock::Create(func->getContext(), "Check", func); auto resizeBB = llvm::BasicBlock::Create(func->getContext(), "Resize", func); @@ -62,10 +59,8 @@ llvm::Function* Memory::getRequireFunc() auto uaddRes = m_builder.CreateCall2(uaddWO, offset, size, "res"); auto sizeRequired = m_builder.CreateExtractValue(uaddRes, 0, "sizeReq"); auto overflow1 = m_builder.CreateExtractValue(uaddRes, 1, "overflow1"); - auto rtPtr = getRuntimeManager().getRuntimePtr(); - auto sizePtr = m_builder.CreateStructGEP(rtPtr, 3); - auto currSize = m_builder.CreateLoad(sizePtr, "currSize"); - auto tooSmall = m_builder.CreateICmpULE(currSize, sizeRequired, "tooSmall"); + auto currSize = m_memory.size(mem); + auto tooSmall = m_builder.CreateICmpULE(m_builder.CreateZExt(currSize, Type::Word), sizeRequired, "tooSmall"); auto resizeNeeded = m_builder.CreateOr(tooSmall, overflow1, "resizeNeeded"); m_builder.CreateCondBr(resizeNeeded, resizeBB, returnBB); // OPT branch weights? @@ -79,14 +74,10 @@ llvm::Function* Memory::getRequireFunc() wordsRequired = m_builder.CreateSelect(overflow, Constant::get(-1), wordsRequired); wordsRequired = m_builder.CreateUDiv(wordsRequired, Constant::get(32), "wordsReq"); sizeRequired = m_builder.CreateMul(wordsRequired, Constant::get(32), "roundedSizeReq"); - auto words = m_builder.CreateUDiv(currSize, Constant::get(32), "words"); // size is always 32*k - auto newWords = m_builder.CreateSub(wordsRequired, words, "addtionalWords"); + auto words = m_builder.CreateUDiv(currSize, m_builder.getInt64(32), "words"); // size is always 32*k + auto newWords = m_builder.CreateSub(wordsRequired, m_builder.CreateZExt(words, Type::Word), "addtionalWords"); m_gasMeter.countMemory(newWords, jmpBuf); // Resize - m_builder.CreateStore(sizeRequired, sizePtr); - auto newData = m_builder.CreateCall2(resize, rt, sizePtr, "newData"); - auto dataPtr = m_builder.CreateStructGEP(rtPtr, 2); - m_builder.CreateStore(newData, dataPtr); auto extendSize = m_builder.CreateTrunc(sizeRequired, Type::Size, "extendSize"); m_memory.extend(mem, extendSize); m_builder.CreateBr(returnBB); @@ -116,9 +107,6 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) auto index = rt->getNextNode(); index->setName("index"); - auto ptr = getBytePtr(index); - if (isWord) - ptr = m_builder.CreateBitCast(ptr, Type::WordPtr, "wordPtr"); if (_isStore) { auto valueArg = index->getNextNode(); @@ -126,7 +114,6 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) auto mem = valueArg->getNextNode(); mem->setName("mem"); auto value = isWord ? Endianness::toBE(m_builder, valueArg) : valueArg; - m_builder.CreateStore(value, ptr); auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); auto valuePtr = m_builder.CreateBitCast(memPtr, _valueType->getPointerTo(), "valuePtr"); m_builder.CreateStore(value, valuePtr); @@ -137,8 +124,6 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) auto mem = index->getNextNode(); mem->setName("mem"); auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); - - llvm::Value* ret = m_builder.CreateLoad(memPtr); ret = Endianness::toNative(m_builder, ret); m_builder.CreateRet(ret); @@ -201,11 +186,7 @@ llvm::Value* Memory::getData() llvm::Value* Memory::getSize() { - auto rtPtr = getRuntimeManager().getRuntimePtr(); - auto sizePtr = m_builder.CreateStructGEP(rtPtr, 3); - auto size = m_builder.CreateLoad(sizePtr, "size"); - assert(size->getType() == Type::Word); - return size; + return m_builder.CreateZExt(m_memory.size(), Type::Word, "msize"); // TODO: Allow placing i64 on stack } llvm::Value* Memory::getBytePtr(llvm::Value* _index) @@ -263,17 +244,3 @@ void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* } } } - - -extern "C" -{ - using namespace dev::eth::jit; - - EXPORT byte* mem_resize(Runtime* _rt, i256* _size) // TODO: Use uint64 as size OR use realloc in LLVM IR - { - auto size = _size->a; // Trunc to 64-bit - auto& memory = _rt->getMemory(); - memory.resize(size); - return memory.data(); - } -} diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index fb612fb9d..8015f1b28 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -18,8 +18,6 @@ public: Runtime(const Runtime&) = delete; Runtime& operator=(const Runtime&) = delete; - MemoryImpl& getMemory() { return m_memory; } - bytes_ref getReturnData() const; private: @@ -28,10 +26,9 @@ private: byte* m_memoryData = nullptr; i256 m_memorySize; public: - byte* m_memData = nullptr; + byte* m_memData = nullptr; // FIXME: Remember to free memory uint64_t m_memSize = 0; uint64_t m_memCap = 0; - MemoryImpl m_memory; }; } From 5ddbb10ce51be21222edf9b3a91030c49dcf190c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 10:31:34 +0100 Subject: [PATCH 19/28] Remove Runtime pointer from memory helper functions --- libevmjit/GasMeter.cpp | 8 ++++---- libevmjit/GasMeter.h | 4 ++-- libevmjit/Memory.cpp | 37 +++++++++++++++++------------------- libevmjit/RuntimeManager.cpp | 22 ++++++++++----------- libevmjit/RuntimeManager.h | 1 + 5 files changed, 34 insertions(+), 38 deletions(-) diff --git a/libevmjit/GasMeter.cpp b/libevmjit/GasMeter.cpp index 34dff5a69..5b748650d 100644 --- a/libevmjit/GasMeter.cpp +++ b/libevmjit/GasMeter.cpp @@ -125,7 +125,7 @@ void GasMeter::count(Instruction _inst) m_blockCost += getStepCost(_inst); } -void GasMeter::count(llvm::Value* _cost, llvm::Value* _jmpBuf) +void GasMeter::count(llvm::Value* _cost, llvm::Value* _jmpBuf, llvm::Value* _gasPtr) { if (_cost->getType() == Type::Word) { @@ -136,7 +136,7 @@ void GasMeter::count(llvm::Value* _cost, llvm::Value* _jmpBuf) } assert(_cost->getType() == Type::Gas); - createCall(m_gasCheckFunc, {m_runtimeManager.getGasPtr(), _cost, _jmpBuf ? _jmpBuf : m_runtimeManager.getJmpBuf()}); + createCall(m_gasCheckFunc, {_gasPtr ? _gasPtr : m_runtimeManager.getGasPtr(), _cost, _jmpBuf ? _jmpBuf : m_runtimeManager.getJmpBuf()}); } void GasMeter::countExp(llvm::Value* _exponent) @@ -215,10 +215,10 @@ void GasMeter::commitCostBlock() assert(m_blockCost == 0); } -void GasMeter::countMemory(llvm::Value* _additionalMemoryInWords, llvm::Value* _jmpBuf) +void GasMeter::countMemory(llvm::Value* _additionalMemoryInWords, llvm::Value* _jmpBuf, llvm::Value* _gasPtr) { static_assert(c_memoryGas == 1, "Memory gas cost has changed. Update GasMeter."); - count(_additionalMemoryInWords, _jmpBuf); + count(_additionalMemoryInWords, _jmpBuf, _gasPtr); } void GasMeter::countCopy(llvm::Value* _copyWords) diff --git a/libevmjit/GasMeter.h b/libevmjit/GasMeter.h index 550b5474c..aecc07315 100644 --- a/libevmjit/GasMeter.h +++ b/libevmjit/GasMeter.h @@ -20,7 +20,7 @@ public: void count(Instruction _inst); /// Count additional cost - void count(llvm::Value* _cost, llvm::Value* _jmpBuf = nullptr); + void count(llvm::Value* _cost, llvm::Value* _jmpBuf = nullptr, llvm::Value* _gasPtr = nullptr); /// Calculate & count gas cost for SSTORE instruction void countSStore(class Ext& _ext, llvm::Value* _index, llvm::Value* _newValue); @@ -41,7 +41,7 @@ public: void giveBack(llvm::Value* _gas); /// Generate code that checks the cost of additional memory used by program - void countMemory(llvm::Value* _additionalMemoryInWords, llvm::Value* _jmpBuf); + void countMemory(llvm::Value* _additionalMemoryInWords, llvm::Value* _jmpBuf, llvm::Value* _gasPtr); /// Count addional gas cost for memory copy void countCopy(llvm::Value* _copyWords); diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index bfb48a245..efc0ecf95 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -28,18 +28,19 @@ llvm::Function* Memory::getRequireFunc() auto& func = m_require; if (!func) { - llvm::Type* argTypes[] = {Type::RuntimePtr, Type::Word, Type::Word, Type::BytePtr, Array::getType()->getPointerTo()}; + llvm::Type* argTypes[] = {Array::getType()->getPointerTo(), Type::Word, Type::Word, Type::BytePtr, Type::GasPtr}; func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "mem.require", getModule()); - auto rt = func->arg_begin(); - rt->setName("rt"); - auto offset = rt->getNextNode(); + + auto mem = &func->getArgumentList().front(); + mem->setName("mem"); + auto offset = mem->getNextNode(); offset->setName("offset"); auto size = offset->getNextNode(); size->setName("size"); auto jmpBuf = size->getNextNode(); jmpBuf->setName("jmpBuf"); - auto mem = jmpBuf->getNextNode(); - mem->setName("mem"); + auto gas = jmpBuf->getNextNode(); + gas->setName("gas"); auto preBB = llvm::BasicBlock::Create(func->getContext(), "Pre", func); auto checkBB = llvm::BasicBlock::Create(func->getContext(), "Check", func); @@ -76,7 +77,7 @@ llvm::Function* Memory::getRequireFunc() sizeRequired = m_builder.CreateMul(wordsRequired, Constant::get(32), "roundedSizeReq"); auto words = m_builder.CreateUDiv(currSize, m_builder.getInt64(32), "words"); // size is always 32*k auto newWords = m_builder.CreateSub(wordsRequired, m_builder.CreateZExt(words, Type::Word), "addtionalWords"); - m_gasMeter.countMemory(newWords, jmpBuf); + m_gasMeter.countMemory(newWords, jmpBuf, gas); // Resize auto extendSize = m_builder.CreateTrunc(sizeRequired, Type::Size, "extendSize"); m_memory.extend(mem, extendSize); @@ -93,8 +94,8 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) { auto isWord = _valueType == Type::Word; - llvm::Type* storeArgs[] = {Type::RuntimePtr, Type::Word, _valueType, Array::getType()->getPointerTo()}; - llvm::Type* loadArgs[] = {Type::RuntimePtr, Type::Word, Array::getType()->getPointerTo()}; + llvm::Type* storeArgs[] = {Array::getType()->getPointerTo(), Type::Word, _valueType}; + llvm::Type* loadArgs[] = {Array::getType()->getPointerTo(), Type::Word}; auto name = _isStore ? isWord ? "mstore" : "mstore8" : "mload"; auto funcType = _isStore ? llvm::FunctionType::get(Type::Void, storeArgs, false) : llvm::FunctionType::get(Type::Word, loadArgs, false); auto func = llvm::Function::Create(funcType, llvm::Function::PrivateLinkage, name, getModule()); @@ -102,17 +103,15 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) InsertPointGuard guard(m_builder); // Restores insert point at function exit m_builder.SetInsertPoint(llvm::BasicBlock::Create(func->getContext(), {}, func)); - auto rt = func->arg_begin(); - rt->setName("rt"); - auto index = rt->getNextNode(); + auto mem = &func->getArgumentList().front(); + mem->setName("mem"); + auto index = mem->getNextNode(); index->setName("index"); if (_isStore) { auto valueArg = index->getNextNode(); valueArg->setName("value"); - auto mem = valueArg->getNextNode(); - mem->setName("mem"); auto value = isWord ? Endianness::toBE(m_builder, valueArg) : valueArg; auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); auto valuePtr = m_builder.CreateBitCast(memPtr, _valueType->getPointerTo(), "valuePtr"); @@ -121,8 +120,6 @@ llvm::Function* Memory::createFunc(bool _isStore, llvm::Type* _valueType) } else { - auto mem = index->getNextNode(); - mem->setName("mem"); auto memPtr = m_memory.getPtr(mem, m_builder.CreateTrunc(index, Type::Size)); llvm::Value* ret = m_builder.CreateLoad(memPtr); ret = Endianness::toNative(m_builder, ret); @@ -160,20 +157,20 @@ llvm::Function* Memory::getStoreByteFunc() llvm::Value* Memory::loadWord(llvm::Value* _addr) { require(_addr, Constant::get(Type::Word->getPrimitiveSizeInBits() / 8)); - return createCall(getLoadWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr, getRuntimeManager().getMem()}); + return createCall(getLoadWordFunc(), {getRuntimeManager().getMem(), _addr}); } void Memory::storeWord(llvm::Value* _addr, llvm::Value* _word) { require(_addr, Constant::get(Type::Word->getPrimitiveSizeInBits() / 8)); - createCall(getStoreWordFunc(), {getRuntimeManager().getRuntimePtr(), _addr, _word, getRuntimeManager().getMem()}); + createCall(getStoreWordFunc(), {getRuntimeManager().getMem(), _addr, _word}); } void Memory::storeByte(llvm::Value* _addr, llvm::Value* _word) { require(_addr, Constant::get(Type::Byte->getPrimitiveSizeInBits() / 8)); auto byte = m_builder.CreateTrunc(_word, Type::Byte, "byte"); - createCall(getStoreByteFunc(), {getRuntimeManager().getRuntimePtr(), _addr, byte, getRuntimeManager().getMem()}); + createCall(getStoreByteFunc(), {getRuntimeManager().getMem(), _addr, byte}); } llvm::Value* Memory::getData() @@ -202,7 +199,7 @@ void Memory::require(llvm::Value* _offset, llvm::Value* _size) if (!constant->getValue()) return; } - createCall(getRequireFunc(), {getRuntimeManager().getRuntimePtr(), _offset, _size, getRuntimeManager().getJmpBuf(), getRuntimeManager().getMem()}); + createCall(getRequireFunc(), {getRuntimeManager().getMem(), _offset, _size, getRuntimeManager().getJmpBuf(), getRuntimeManager().getGasPtr()}); } void Memory::copyBytes(llvm::Value* _srcPtr, llvm::Value* _srcSize, llvm::Value* _srcIdx, diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 3e18c8c18..f6b5df43e 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -5,6 +5,7 @@ #include "preprocessor/llvm_includes_end.h" #include "Stack.h" +#include "Utils.h" namespace dev { @@ -99,6 +100,8 @@ RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder, llvm::Value* _jmpBuf assert(m_dataPtr->getType() == Type::RuntimeDataPtr); m_gasPtr = m_builder.CreateStructGEP(m_dataPtr, 0, "gas"); assert(m_gasPtr->getType() == Type::Gas->getPointerTo()); + m_memPtr = m_builder.CreateStructGEP(rtPtr, 4, "mem"); + assert(m_memPtr->getType() == Array::getType()->getPointerTo()); m_envPtr = m_builder.CreateLoad(m_builder.CreateStructGEP(rtPtr, 1), "env"); assert(m_envPtr->getType() == Type::EnvPtr); } @@ -123,14 +126,6 @@ llvm::Value* RuntimeManager::getDataPtr() return dataPtr; } -llvm::Value* RuntimeManager::getMem() -{ - auto rtPtr = getRuntimePtr(); - auto memPtr = m_builder.CreateStructGEP(rtPtr, 4, "mem"); - assert(memPtr->getType() == Array::getType()->getPointerTo()); - return memPtr; -} - llvm::Value* RuntimeManager::getEnvPtr() { assert(getMainFunction()); // Available only in main function @@ -238,11 +233,14 @@ llvm::Value* RuntimeManager::getGas() llvm::Value* RuntimeManager::getGasPtr() { - if (getMainFunction()) - return m_gasPtr; + assert(getMainFunction()); + return m_gasPtr; +} - // TODO: eliminated this case - return getPtr(RuntimeData::Gas); +llvm::Value* RuntimeManager::getMem() +{ + assert(getMainFunction()); + return m_memPtr; } void RuntimeManager::setGas(llvm::Value* _gas) diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index 65b63c72b..52298d1d0 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -55,6 +55,7 @@ private: llvm::Value* const m_jmpBuf; llvm::Value* m_dataPtr = nullptr; llvm::Value* m_gasPtr = nullptr; + llvm::Value* m_memPtr = nullptr; llvm::Value* m_envPtr = nullptr; code_iterator m_codeBegin = {}; From 2aa0548674848877fda8b3220e05743237e94388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 14:47:01 +0100 Subject: [PATCH 20/28] Reimplementation of mem.require helper function. Uses 64-bit arithmetics. --- libevmjit/Memory.cpp | 57 +++++++++++++++++++++++--------------------- libevmjit/Runtime.h | 2 +- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index efc0ecf95..3af54818e 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -30,14 +30,15 @@ llvm::Function* Memory::getRequireFunc() { llvm::Type* argTypes[] = {Array::getType()->getPointerTo(), Type::Word, Type::Word, Type::BytePtr, Type::GasPtr}; func = llvm::Function::Create(llvm::FunctionType::get(Type::Void, argTypes, false), llvm::Function::PrivateLinkage, "mem.require", getModule()); + func->setDoesNotThrow(); auto mem = &func->getArgumentList().front(); mem->setName("mem"); - auto offset = mem->getNextNode(); - offset->setName("offset"); - auto size = offset->getNextNode(); - size->setName("size"); - auto jmpBuf = size->getNextNode(); + auto blkOffset = mem->getNextNode(); + blkOffset->setName("blkOffset"); + auto blkSize = blkOffset->getNextNode(); + blkSize->setName("blkSize"); + auto jmpBuf = blkSize->getNextNode(); jmpBuf->setName("jmpBuf"); auto gas = jmpBuf->getNextNode(); gas->setName("gas"); @@ -51,36 +52,38 @@ llvm::Function* Memory::getRequireFunc() // BB "Pre": Ignore checks with size 0 m_builder.SetInsertPoint(preBB); - auto sizeIsZero = m_builder.CreateICmpEQ(size, Constant::get(0)); - m_builder.CreateCondBr(sizeIsZero, returnBB, checkBB); + m_builder.CreateCondBr(m_builder.CreateICmpNE(blkSize, Constant::get(0)), checkBB, returnBB, Type::expectTrue); // BB "Check" m_builder.SetInsertPoint(checkBB); - auto uaddWO = llvm::Intrinsic::getDeclaration(getModule(), llvm::Intrinsic::uadd_with_overflow, Type::Word); - auto uaddRes = m_builder.CreateCall2(uaddWO, offset, size, "res"); - auto sizeRequired = m_builder.CreateExtractValue(uaddRes, 0, "sizeReq"); - auto overflow1 = m_builder.CreateExtractValue(uaddRes, 1, "overflow1"); - auto currSize = m_memory.size(mem); - auto tooSmall = m_builder.CreateICmpULE(m_builder.CreateZExt(currSize, Type::Word), sizeRequired, "tooSmall"); - auto resizeNeeded = m_builder.CreateOr(tooSmall, overflow1, "resizeNeeded"); - m_builder.CreateCondBr(resizeNeeded, resizeBB, returnBB); // OPT branch weights? + static const auto c_inputMax = uint64_t(2) << 40; // max value of blkSize and blkOffset that will not result in integer overflow in calculations below + auto blkOffsetOk = m_builder.CreateICmpULE(blkOffset, Constant::get(c_inputMax), "blkOffsetOk"); + auto blkO = m_builder.CreateSelect(blkOffsetOk, m_builder.CreateTrunc(blkOffset, Type::Size), m_builder.getInt64(c_inputMax), "bklO"); + auto blkSizeOk = m_builder.CreateICmpULE(blkSize, Constant::get(c_inputMax), "blkSizeOk"); + auto blkS = m_builder.CreateSelect(blkSizeOk, m_builder.CreateTrunc(blkSize, Type::Size), m_builder.getInt64(c_inputMax), "bklS"); + + auto sizeReq0 = m_builder.CreateNUWAdd(blkO, blkS, "sizeReq0"); + auto sizeReq = m_builder.CreateAnd(m_builder.CreateNUWAdd(sizeReq0, m_builder.getInt64(31)), uint64_t(-1) << 5, "sizeReq"); // s' = ((s0 + 31) / 32) * 32 + auto sizeCur = m_memory.size(mem); + auto sizeOk = m_builder.CreateICmpULE(sizeReq, sizeCur, "sizeOk"); + + m_builder.CreateCondBr(sizeOk, returnBB, resizeBB, Type::expectTrue); // BB "Resize" m_builder.SetInsertPoint(resizeBB); // Check gas first - uaddRes = m_builder.CreateCall2(uaddWO, sizeRequired, Constant::get(31), "res"); - auto wordsRequired = m_builder.CreateExtractValue(uaddRes, 0); - auto overflow2 = m_builder.CreateExtractValue(uaddRes, 1, "overflow2"); - auto overflow = m_builder.CreateOr(overflow1, overflow2, "overflow"); - wordsRequired = m_builder.CreateSelect(overflow, Constant::get(-1), wordsRequired); - wordsRequired = m_builder.CreateUDiv(wordsRequired, Constant::get(32), "wordsReq"); - sizeRequired = m_builder.CreateMul(wordsRequired, Constant::get(32), "roundedSizeReq"); - auto words = m_builder.CreateUDiv(currSize, m_builder.getInt64(32), "words"); // size is always 32*k - auto newWords = m_builder.CreateSub(wordsRequired, m_builder.CreateZExt(words, Type::Word), "addtionalWords"); - m_gasMeter.countMemory(newWords, jmpBuf, gas); + auto sizeExt = m_builder.CreateNUWSub(sizeReq, sizeCur, "sizeExt"); + auto sizeSum = m_builder.CreateNUWAdd(sizeReq, sizeCur, "sizeSum"); + auto costL = m_builder.CreateLShr(sizeExt, 5, "costL"); + auto costQ1 = m_builder.CreateLShr(sizeExt, 20, "costQ1"); + auto costQ2 = m_builder.CreateLShr(sizeSum, 20, "costQ2"); + auto costQ = m_builder.CreateNUWAdd(costQ1, costQ2, "costQ"); + auto cost = m_builder.CreateNUWAdd(costL, costQ, "cost"); + auto costOk = m_builder.CreateAnd(blkOffsetOk, blkSizeOk, "costOk"); + auto c = m_builder.CreateSelect(costOk, costL, m_builder.getInt64(std::numeric_limits::max()), "c"); + m_gasMeter.countMemory(c, jmpBuf, gas); // Resize - auto extendSize = m_builder.CreateTrunc(sizeRequired, Type::Size, "extendSize"); - m_memory.extend(mem, extendSize); + m_memory.extend(mem, sizeReq); m_builder.CreateBr(returnBB); // BB "Return" diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 8015f1b28..5b8052330 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -27,7 +27,7 @@ private: i256 m_memorySize; public: byte* m_memData = nullptr; // FIXME: Remember to free memory - uint64_t m_memSize = 0; + uint64_t m_memSize = 0; // TODO: Init array in LLVM, to allow more optimization uint64_t m_memCap = 0; }; From 33089170952551af61cce4502af11a6c2f5155f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 15:36:51 +0100 Subject: [PATCH 21/28] Quadratic memory cost --- libevmjit/Memory.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 3af54818e..9f8c34198 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -56,7 +56,7 @@ llvm::Function* Memory::getRequireFunc() // BB "Check" m_builder.SetInsertPoint(checkBB); - static const auto c_inputMax = uint64_t(2) << 40; // max value of blkSize and blkOffset that will not result in integer overflow in calculations below + static const auto c_inputMax = uint64_t(1) << 32; // max value of blkSize and blkOffset that will not result in integer overflow in calculations below auto blkOffsetOk = m_builder.CreateICmpULE(blkOffset, Constant::get(c_inputMax), "blkOffsetOk"); auto blkO = m_builder.CreateSelect(blkOffsetOk, m_builder.CreateTrunc(blkOffset, Type::Size), m_builder.getInt64(c_inputMax), "bklO"); auto blkSizeOk = m_builder.CreateICmpULE(blkSize, Constant::get(c_inputMax), "blkSizeOk"); @@ -72,15 +72,15 @@ llvm::Function* Memory::getRequireFunc() // BB "Resize" m_builder.SetInsertPoint(resizeBB); // Check gas first - auto sizeExt = m_builder.CreateNUWSub(sizeReq, sizeCur, "sizeExt"); - auto sizeSum = m_builder.CreateNUWAdd(sizeReq, sizeCur, "sizeSum"); - auto costL = m_builder.CreateLShr(sizeExt, 5, "costL"); - auto costQ1 = m_builder.CreateLShr(sizeExt, 20, "costQ1"); - auto costQ2 = m_builder.CreateLShr(sizeSum, 20, "costQ2"); - auto costQ = m_builder.CreateNUWAdd(costQ1, costQ2, "costQ"); - auto cost = m_builder.CreateNUWAdd(costL, costQ, "cost"); + auto w1 = m_builder.CreateLShr(sizeReq, 5); + auto w1s = m_builder.CreateNUWMul(w1, w1); + auto c1 = m_builder.CreateAdd(w1, m_builder.CreateLShr(w1s, 10)); + auto w0 = m_builder.CreateLShr(sizeCur, 5); + auto w0s = m_builder.CreateNUWMul(w0, w0); + auto c0 = m_builder.CreateAdd(w0, m_builder.CreateLShr(w0s, 10)); + auto cc = m_builder.CreateNUWSub(c1, c0); auto costOk = m_builder.CreateAnd(blkOffsetOk, blkSizeOk, "costOk"); - auto c = m_builder.CreateSelect(costOk, costL, m_builder.getInt64(std::numeric_limits::max()), "c"); + auto c = m_builder.CreateSelect(costOk, cc, m_builder.getInt64(std::numeric_limits::max()), "c"); m_gasMeter.countMemory(c, jmpBuf, gas); // Resize m_memory.extend(mem, sizeReq); From f84523cb51231f0084aec04c7a1cbed408561c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 16:16:30 +0100 Subject: [PATCH 22/28] Init memory array in LLVM --- libevmjit/Array.cpp | 4 +++- libevmjit/Runtime.h | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libevmjit/Array.cpp b/libevmjit/Array.cpp index 21de061c6..92ba6193d 100644 --- a/libevmjit/Array.cpp +++ b/libevmjit/Array.cpp @@ -239,7 +239,9 @@ Array::Array(llvm::IRBuilder<>& _builder, llvm::Value* _array) : m_setFunc([this](){ return createArraySetFunc(); }), m_getFunc([this](){ return createArrayGetFunc(); }), m_freeFunc([this](){ return createFreeFunc(); }) -{} +{ + m_builder.CreateStore(llvm::ConstantAggregateZero::get(getType()), m_array); +} void Array::pop(llvm::Value* _count) diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 5b8052330..4fc1705c4 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -26,9 +26,9 @@ private: byte* m_memoryData = nullptr; i256 m_memorySize; public: - byte* m_memData = nullptr; // FIXME: Remember to free memory - uint64_t m_memSize = 0; // TODO: Init array in LLVM, to allow more optimization - uint64_t m_memCap = 0; + byte* m_memData; // FIXME: Remember to free memory + uint64_t m_memSize; + uint64_t m_memCap; }; } From c4b9aca7ee1ffcf9aae2e9b74ed04317c68f9a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 17:22:23 +0100 Subject: [PATCH 23/28] Change Runtime interface --- libevmjit/ExecutionEngine.cpp | 3 ++- libevmjit/ExecutionEngine.h | 5 ++++- libevmjit/Runtime.cpp | 15 ++++++++------- libevmjit/Runtime.h | 9 +++------ 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index 0b2365f01..e773b1a9f 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -117,7 +117,8 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) static StatsCollector statsCollector; auto mainFuncName = codeHash(_data->codeHash); - Runtime runtime(_data, _env); // TODO: I don't know why but it must be created before getFunctionAddress() calls + Runtime runtime; + runtime.init(_data, _env); auto entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); if (!entryFuncPtr) diff --git a/libevmjit/ExecutionEngine.h b/libevmjit/ExecutionEngine.h index 99cc77cce..26da6977c 100644 --- a/libevmjit/ExecutionEngine.h +++ b/libevmjit/ExecutionEngine.h @@ -2,7 +2,7 @@ #include -#include "RuntimeData.h" +#include "Runtime.h" namespace dev { @@ -49,6 +49,9 @@ public: /// Reference to returned data (RETURN opcode used) bytes_ref returnData; + +private: + Runtime m_runtime; }; } diff --git a/libevmjit/Runtime.cpp b/libevmjit/Runtime.cpp index e7953a417..78454ef4f 100644 --- a/libevmjit/Runtime.cpp +++ b/libevmjit/Runtime.cpp @@ -9,20 +9,21 @@ namespace eth namespace jit { -Runtime::Runtime(RuntimeData* _data, Env* _env) : - m_data(*_data), - m_env(*_env) -{} +void Runtime::init(RuntimeData* _data, Env* _env) +{ + m_data = _data; + m_env = _env; +} bytes_ref Runtime::getReturnData() const { - auto data = m_data.callData; - auto size = static_cast(m_data.callDataSize); + auto data = m_data->callData; + auto size = static_cast(m_data->callDataSize); if (data < m_memData || data >= m_memData + m_memSize || size == 0) { assert(size == 0); // data can be an invalid pointer only if size is 0 - m_data.callData = nullptr; + m_data->callData = nullptr; return {}; } diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 4fc1705c4..91f26beaa 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -13,16 +13,13 @@ using MemoryImpl = bytes; class Runtime { public: - Runtime(RuntimeData* _data, Env* _env); - - Runtime(const Runtime&) = delete; - Runtime& operator=(const Runtime&) = delete; + void init(RuntimeData* _data, Env* _env); bytes_ref getReturnData() const; private: - RuntimeData& m_data; ///< Pointer to data. Expected by compiled contract. - Env& m_env; ///< Pointer to environment proxy. Expected by compiled contract. + RuntimeData* m_data = nullptr; ///< Pointer to data. Expected by compiled contract. + Env* m_env = nullptr; ///< Pointer to environment proxy. Expected by compiled contract. byte* m_memoryData = nullptr; i256 m_memorySize; public: From 8da5fc27b08bd7cf6d50da3345fbb56bc8992fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 17:39:16 +0100 Subject: [PATCH 24/28] Fix wrong llvm::Twine usage (or MSVC bug) --- libevmjit/Array.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libevmjit/Array.h b/libevmjit/Array.h index 70e9e5f01..41842f0c9 100644 --- a/libevmjit/Array.h +++ b/libevmjit/Array.h @@ -20,7 +20,7 @@ public: m_creator(_creator) {} - llvm::Value* call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args, llvm::Twine const& _name = {}); + llvm::Value* call(llvm::IRBuilder<>& _builder, std::initializer_list const& _args, llvm::Twine const& _name = ""); private: llvm::Function* m_func = nullptr; From 164ef01a9c8c56f1e372c643628eb083eb4dc80f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 18:10:33 +0100 Subject: [PATCH 25/28] Free memory data, place Runtime in ExecutionEngine --- libevmjit/ExecutionEngine.cpp | 15 ++++----------- libevmjit/Runtime.cpp | 11 +++++++++++ libevmjit/Runtime.h | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/libevmjit/ExecutionEngine.cpp b/libevmjit/ExecutionEngine.cpp index e773b1a9f..c9578b4ee 100644 --- a/libevmjit/ExecutionEngine.cpp +++ b/libevmjit/ExecutionEngine.cpp @@ -117,8 +117,7 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) static StatsCollector statsCollector; auto mainFuncName = codeHash(_data->codeHash); - Runtime runtime; - runtime.init(_data, _env); + m_runtime.init(_data, _env); auto entryFuncPtr = (EntryFuncPtr)ee->getFunctionAddress(mainFuncName); if (!entryFuncPtr) @@ -148,23 +147,17 @@ ReturnCode ExecutionEngine::run(RuntimeData* _data, Env* _env) return ReturnCode::LLVMLinkError; listener->stateChanged(ExecState::Execution); - auto returnCode = entryFuncPtr(&runtime); + auto returnCode = entryFuncPtr(&m_runtime); listener->stateChanged(ExecState::Return); if (returnCode == ReturnCode::Return) - { - returnData = runtime.getReturnData(); // Save reference to return data - } + returnData = m_runtime.getReturnData(); // Save reference to return data + listener->stateChanged(ExecState::Finished); if (g_stats) statsCollector.stats.push_back(std::move(listener)); - if (runtime.m_memData) - { - std::cerr << "MEM: " << (size_t) runtime.m_memData << " [" << runtime.m_memSize << ", " << runtime.m_memCap << "}\n"; - } - return returnCode; } diff --git a/libevmjit/Runtime.cpp b/libevmjit/Runtime.cpp index 78454ef4f..952ee2645 100644 --- a/libevmjit/Runtime.cpp +++ b/libevmjit/Runtime.cpp @@ -1,5 +1,7 @@ #include "Runtime.h" +#include +#include #include namespace dev @@ -15,6 +17,15 @@ void Runtime::init(RuntimeData* _data, Env* _env) m_env = _env; } +Runtime::~Runtime() +{ + if (m_memData) + { + std::cerr << "MEM: " << (size_t)m_memData << " [" << m_memSize << "]\n"; + std::free(m_memData); + } +} + bytes_ref Runtime::getReturnData() const { auto data = m_data->callData; diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 91f26beaa..4755a8698 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -14,6 +14,7 @@ class Runtime { public: void init(RuntimeData* _data, Env* _env); + EXPORT ~Runtime(); bytes_ref getReturnData() const; @@ -22,8 +23,7 @@ private: Env* m_env = nullptr; ///< Pointer to environment proxy. Expected by compiled contract. byte* m_memoryData = nullptr; i256 m_memorySize; -public: - byte* m_memData; // FIXME: Remember to free memory + byte* m_memData; uint64_t m_memSize; uint64_t m_memCap; }; From 5524317d52e4a1d496225ab8ae7b65f9d2bf3dee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Fri, 27 Feb 2015 19:16:26 +0100 Subject: [PATCH 26/28] Delete old memory pointers --- libevmjit/Common.h | 2 -- libevmjit/ExecStats.h | 1 + libevmjit/Runtime.h | 9 +++------ libevmjit/RuntimeManager.cpp | 6 ++---- libevmjit/Stack.cpp | 3 --- 5 files changed, 6 insertions(+), 15 deletions(-) diff --git a/libevmjit/Common.h b/libevmjit/Common.h index cd0523b12..7e3380c2e 100644 --- a/libevmjit/Common.h +++ b/libevmjit/Common.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include @@ -18,7 +17,6 @@ namespace jit { using byte = uint8_t; -using bytes = std::vector; using bytes_ref = std::tuple; using code_iterator = byte const*; diff --git a/libevmjit/ExecStats.h b/libevmjit/ExecStats.h index 1ac9b6995..0451ccb05 100644 --- a/libevmjit/ExecStats.h +++ b/libevmjit/ExecStats.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include diff --git a/libevmjit/Runtime.h b/libevmjit/Runtime.h index 4755a8698..895128a59 100644 --- a/libevmjit/Runtime.h +++ b/libevmjit/Runtime.h @@ -8,7 +8,6 @@ namespace eth { namespace jit { -using MemoryImpl = bytes; class Runtime { @@ -21,11 +20,9 @@ public: private: RuntimeData* m_data = nullptr; ///< Pointer to data. Expected by compiled contract. Env* m_env = nullptr; ///< Pointer to environment proxy. Expected by compiled contract. - byte* m_memoryData = nullptr; - i256 m_memorySize; - byte* m_memData; - uint64_t m_memSize; - uint64_t m_memCap; + byte* m_memData = nullptr; + uint64_t m_memSize = 0; + uint64_t m_memCap = 0; }; } diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index f6b5df43e..87b47c057 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -51,9 +51,7 @@ llvm::StructType* RuntimeManager::getRuntimeType() { Type::RuntimeDataPtr, // data Type::EnvPtr, // Env* - Type::BytePtr, // memory data - Type::Word, // memory size - Array::getType() + Array::getType() // memory }; type = llvm::StructType::create(elems, "Runtime"); } @@ -100,7 +98,7 @@ RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder, llvm::Value* _jmpBuf assert(m_dataPtr->getType() == Type::RuntimeDataPtr); m_gasPtr = m_builder.CreateStructGEP(m_dataPtr, 0, "gas"); assert(m_gasPtr->getType() == Type::Gas->getPointerTo()); - m_memPtr = m_builder.CreateStructGEP(rtPtr, 4, "mem"); + m_memPtr = m_builder.CreateStructGEP(rtPtr, 2, "mem"); assert(m_memPtr->getType() == Array::getType()->getPointerTo()); m_envPtr = m_builder.CreateLoad(m_builder.CreateStructGEP(rtPtr, 1), "env"); assert(m_envPtr->getType() == Type::EnvPtr); diff --git a/libevmjit/Stack.cpp b/libevmjit/Stack.cpp index 85bd98fdd..3a686c766 100644 --- a/libevmjit/Stack.cpp +++ b/libevmjit/Stack.cpp @@ -158,7 +158,6 @@ llvm::Value* Stack::get(size_t _index) void Stack::set(size_t _index, llvm::Value* _value) { m_stack.set(m_builder.CreateSub(m_stack.size(), m_builder.getInt64(_index + 1)), _value); - //createCall(getSetFunc(), {m_runtimeManager.getRuntimePtr(), m_builder.getInt64(_index), _value}); } void Stack::pop(size_t _count) @@ -166,13 +165,11 @@ void Stack::pop(size_t _count) // FIXME: Pop does not check for stack underflow but looks like not needed // We should place stack.require() check and begining of every BB m_stack.pop(m_builder.getInt64(_count)); - //createCall(getPopFunc(), {m_runtimeManager.getRuntimePtr(), m_builder.getInt64(_count), m_runtimeManager.getJmpBuf()}); } void Stack::push(llvm::Value* _value) { m_stack.push(_value); - //createCall(getPushFunc(), {m_runtimeManager.getRuntimePtr(), _value}); } } From 32a4bebb7930b624e9a6fbba985553a7fa5a2282 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Mon, 2 Mar 2015 11:14:57 +0100 Subject: [PATCH 27/28] Fix memory leaks --- libevmjit/Array.cpp | 10 +++++++--- libevmjit/Common.h | 4 +++- libevmjit/Compiler.cpp | 23 ++++++++++++----------- libevmjit/Runtime.cpp | 9 +++------ libevmjit/RuntimeManager.cpp | 3 +-- libevmjit/RuntimeManager.h | 5 +++-- libevmjit/interface.cpp | 5 ----- 7 files changed, 29 insertions(+), 30 deletions(-) diff --git a/libevmjit/Array.cpp b/libevmjit/Array.cpp index 92ba6193d..3266038db 100644 --- a/libevmjit/Array.cpp +++ b/libevmjit/Array.cpp @@ -278,7 +278,11 @@ namespace ~AllocatedMemoryWatchdog() { if (!allocatedMemory.empty()) + { DLOG(mem) << allocatedMemory.size() << " MEM LEAKS!\n"; + for (auto&& leak : allocatedMemory) + DLOG(mem) << "\t" << leak << "\n"; + } } }; @@ -289,20 +293,20 @@ extern "C" { using namespace dev::eth::jit; - EXPORT void* ext_realloc(void* _data, size_t _size) + EXPORT void* ext_realloc(void* _data, size_t _size) noexcept { //std::cerr << "REALLOC: " << _data << " [" << _size << "]" << std::endl; auto newData = std::realloc(_data, _size); if (_data != newData) { - DLOG(mem) << "REALLOC: " << _data << " -> " << newData << " [" << _size << "]\n"; + DLOG(mem) << "REALLOC: " << newData << " <- " << _data << " [" << _size << "]\n"; watchdog.allocatedMemory.erase(_data); watchdog.allocatedMemory.insert(newData); } return newData; } - EXPORT void ext_free(void* _data) + EXPORT void ext_free(void* _data) noexcept { std::free(_data); if (_data) diff --git a/libevmjit/Common.h b/libevmjit/Common.h index 7e3380c2e..cbe60483d 100644 --- a/libevmjit/Common.h +++ b/libevmjit/Common.h @@ -4,7 +4,9 @@ #include #ifdef _MSC_VER -#define EXPORT __declspec(dllexport) +#define EXPORT __declspec(dllexport) +#define _ALLOW_KEYWORD_MACROS +#define noexcept throw() #else #define EXPORT #endif diff --git a/libevmjit/Compiler.cpp b/libevmjit/Compiler.cpp index ab95458e8..6fa82c870 100644 --- a/libevmjit/Compiler.cpp +++ b/libevmjit/Compiler.cpp @@ -132,6 +132,17 @@ std::unique_ptr Compiler::compile(code_iterator _begin, code_itera auto entryBlock = llvm::BasicBlock::Create(m_builder.getContext(), {}, m_mainFunc); m_builder.SetInsertPoint(entryBlock); + createBasicBlocks(_begin, _end); + + // Init runtime structures. + RuntimeManager runtimeManager(m_builder, _begin, _end); + GasMeter gasMeter(m_builder, runtimeManager); + Memory memory(runtimeManager, gasMeter); + Ext ext(runtimeManager, memory); + Stack stack(m_builder, runtimeManager); + runtimeManager.setStack(stack); // Runtime Manager will free stack memory + Arith256 arith(m_builder); + auto jmpBufWords = m_builder.CreateAlloca(Type::BytePtr, m_builder.getInt64(3), "jmpBuf.words"); auto frameaddress = llvm::Intrinsic::getDeclaration(module.get(), llvm::Intrinsic::frameaddress); auto fp = m_builder.CreateCall(frameaddress, m_builder.getInt32(0), "fp"); @@ -144,17 +155,7 @@ std::unique_ptr Compiler::compile(code_iterator _begin, code_itera auto jmpBuf = m_builder.CreateBitCast(jmpBufWords, Type::BytePtr, "jmpBuf"); auto r = m_builder.CreateCall(setjmp, jmpBuf); auto normalFlow = m_builder.CreateICmpEQ(r, m_builder.getInt32(0)); - - createBasicBlocks(_begin, _end); - - // Init runtime structures. - RuntimeManager runtimeManager(m_builder, jmpBuf, _begin, _end); - GasMeter gasMeter(m_builder, runtimeManager); - Memory memory(runtimeManager, gasMeter); - Ext ext(runtimeManager, memory); - Stack stack(m_builder, runtimeManager); - runtimeManager.setStack(stack); // Runtime Manager will free stack memory - Arith256 arith(m_builder); + runtimeManager.setJmpBuf(jmpBuf); // TODO: Create Stop basic block on demand m_stopBB = llvm::BasicBlock::Create(m_mainFunc->getContext(), "Stop", m_mainFunc); diff --git a/libevmjit/Runtime.cpp b/libevmjit/Runtime.cpp index 952ee2645..7e9a7d52e 100644 --- a/libevmjit/Runtime.cpp +++ b/libevmjit/Runtime.cpp @@ -1,7 +1,5 @@ #include "Runtime.h" -#include -#include #include namespace dev @@ -17,13 +15,12 @@ void Runtime::init(RuntimeData* _data, Env* _env) m_env = _env; } +extern "C" void ext_free(void* _data) noexcept; + Runtime::~Runtime() { if (m_memData) - { - std::cerr << "MEM: " << (size_t)m_memData << " [" << m_memSize << "]\n"; - std::free(m_memData); - } + ext_free(m_memData); // Use helper free to check memory leaks } bytes_ref Runtime::getReturnData() const diff --git a/libevmjit/RuntimeManager.cpp b/libevmjit/RuntimeManager.cpp index 87b47c057..d1ccaea8a 100644 --- a/libevmjit/RuntimeManager.cpp +++ b/libevmjit/RuntimeManager.cpp @@ -84,9 +84,8 @@ llvm::Twine getName(RuntimeData::Index _index) } } -RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder, llvm::Value* _jmpBuf, code_iterator _codeBegin, code_iterator _codeEnd): +RuntimeManager::RuntimeManager(llvm::IRBuilder<>& _builder, code_iterator _codeBegin, code_iterator _codeEnd): CompilerHelper(_builder), - m_jmpBuf(_jmpBuf), m_codeBegin(_codeBegin), m_codeEnd(_codeEnd) { diff --git a/libevmjit/RuntimeManager.h b/libevmjit/RuntimeManager.h index 52298d1d0..eb8dadf6f 100644 --- a/libevmjit/RuntimeManager.h +++ b/libevmjit/RuntimeManager.h @@ -16,7 +16,7 @@ class Stack; class RuntimeManager: public CompilerHelper { public: - RuntimeManager(llvm::IRBuilder<>& _builder, llvm::Value* _jmpBuf, code_iterator _codeBegin, code_iterator _codeEnd); + RuntimeManager(llvm::IRBuilder<>& _builder, code_iterator _codeBegin, code_iterator _codeEnd); llvm::Value* getRuntimePtr(); llvm::Value* getDataPtr(); @@ -43,6 +43,7 @@ public: void abort(llvm::Value* _jmpBuf); void setStack(Stack& _stack) { m_stack = &_stack; } + void setJmpBuf(llvm::Value* _jmpBuf) { m_jmpBuf = _jmpBuf; } static llvm::StructType* getRuntimeType(); static llvm::StructType* getRuntimeDataType(); @@ -52,7 +53,7 @@ private: void set(RuntimeData::Index _index, llvm::Value* _value); llvm::Function* m_longjmp = nullptr; - llvm::Value* const m_jmpBuf; + llvm::Value* m_jmpBuf = nullptr; llvm::Value* m_dataPtr = nullptr; llvm::Value* m_gasPtr = nullptr; llvm::Value* m_memPtr = nullptr; diff --git a/libevmjit/interface.cpp b/libevmjit/interface.cpp index 645f3d150..01f743a2e 100644 --- a/libevmjit/interface.cpp +++ b/libevmjit/interface.cpp @@ -5,11 +5,6 @@ extern "C" using namespace dev::eth::jit; -#ifdef _MSC_VER -#define _ALLOW_KEYWORD_MACROS -#define noexcept throw() -#endif - EXPORT void* evmjit_create() noexcept { // TODO: Make sure ExecutionEngine constructor does not throw From 96e0e52e438d3242bfe7e0d9463bded6056df919 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Mon, 2 Mar 2015 11:53:17 +0100 Subject: [PATCH 28/28] Increase memory limit to 2^33 (8GB) --- libevmjit/Memory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libevmjit/Memory.cpp b/libevmjit/Memory.cpp index 9f8c34198..515121e31 100644 --- a/libevmjit/Memory.cpp +++ b/libevmjit/Memory.cpp @@ -56,7 +56,7 @@ llvm::Function* Memory::getRequireFunc() // BB "Check" m_builder.SetInsertPoint(checkBB); - static const auto c_inputMax = uint64_t(1) << 32; // max value of blkSize and blkOffset that will not result in integer overflow in calculations below + static const auto c_inputMax = uint64_t(1) << 33; // max value of blkSize and blkOffset that will not result in integer overflow in calculations below auto blkOffsetOk = m_builder.CreateICmpULE(blkOffset, Constant::get(c_inputMax), "blkOffsetOk"); auto blkO = m_builder.CreateSelect(blkOffsetOk, m_builder.CreateTrunc(blkOffset, Type::Size), m_builder.getInt64(c_inputMax), "bklO"); auto blkSizeOk = m_builder.CreateICmpULE(blkSize, Constant::get(c_inputMax), "blkSizeOk");