Browse Source

Squashed 'evmjit/' changes from 334deeb..533531b

533531b Create helper/external functions on demand (env_balance for now)
e12fa12 Suicide rework
ae6e709 Disalbe bswap constant folding
ec30ce4 Object cache
5be8c59 Byte swap for constants
3df5a12 Do not compile LLVM module if machine code available in memory
2b31cba Memory manager cleanup
6a22491 Clean up ExecutionEngine
28a0623 Clean up ExecutionEngine
de02425 Clean up ExecutionEngine
ece7fe7 Clean up ExecutionEngine
fe90c6f Clean up ExecutionEngine
9d9e73a Using one ExecutionEngine to cache compiled contracts
713b33e Remove global private memory pointers
f8ffdfa Remove global privite pointers to runtime instance and runtime data
6643af5 Use code hash as main function name
e3245e1 Remove addtional cost param from commitCostBlock(). Count additional cost manually. [#81461534]
90cb4a7 More aggresive gas counting optimization: do not commit cost before LOG. [#81461534]
5d5259e Do not auto-commit cost block
c5de54d More aggresive gas counting optimization: do not commit cost before SSTORE.
c5ebca6 More aggresive gas counting optimization: do not commit cost before memory access.
69930b9 Use sub "no-wrap"
6acbfe0 Remove unused function
eaed9c3 Read push data using llvm::APInt
30f0a7a Type usage and other cleanups
4254b3f Fix memory copy [Delivers #84703344]
43e08ea Handle create/call depth limit in CREATE instruction
20190b1 Add -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS needed by LLVM (reverted from commit 66d5a2b5cd)
75fa672 Fix compilation with LLVM pre-3.5 (Ubuntu 14.04) (reverted from commit 6094aa30ad)
6094aa3 Fix compilation with LLVM pre-3.5 (Ubuntu 14.04)
66d5a2b Add -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS needed by LLVM
1b49024 Workaround for Ubuntu broken LLVM package (llvm-3.5-dev does not have correct cmake files)
ed63ced Disable rtti for Cache as LLVM has not rtti
232f9fe Refactor cmake files
8287c60 Own cached objects
6543cc4 Execution Engine cleanups (reverted from commit bd85efa299)
98b265b Merge commit '2332595c9c0d315dc9ecde22d236ae477b931863' into develop
2b83b75 Object cache wit memory leaks
de22a0a Execution Engine cleanups
2332595 Change the name of a module to some hash (for caching)
bd85efa Execution Engine cleanups
b37ce8e Gas counting for CREATE instruction
0a64245 Fix checking memory requirements with size 0
a492760 Using llvm::ExecutionEngine::getFunctionAddress() instead of getPointerToFunction(). Cleanups.
dd63bb3 Remove TODO comment
8f3edbc Disable cache. It's broken.
49bd78b SHA3 gas cost updated
76d30b8 Count additional gas cost for memory copies. Some GasMeter improvments.
077cf7b Count additional cost for EXP exponent
c2699b3 Comment about MCJIT and caching pointers to entry functions
91cd37e Remove logs
47d92e9 Remove dummy int argument in entry function
2e1c90f Change the way entry function is called.
4a9d08d Change the way entry function is called.
70279f8 Changes in setjmps
dbf8174 Update usage of ExtVMFace
dc4bc0e Jit can handle call stack up to 1024
45fb3f5 Move some data from stack to JitVM object to save stack space.
6e318f8 Check current call depth
70348d9 Fix cache key and do not compile to LLVM module when it is not needed
da02a18 Cache key is contract code. Does not work
7c9cf6e Trying to cache compiled contracts with pointer to code as a key (it's not a good idea)
2a7111c ExecBundle - all information needed to execute a JIT-compiled contracts
b3a1734 Disable JIT logs
b1b94de Opcodes update
c9f5694 CMakeLists.txt cleanup (in progress)
63d6997 added missing <csetjmp>
b07f25d Detect endianness without boost help
b176574 Remove usage of boost::lexical_cast
5f4c1c7 Fix evmcc compilation - provide fake runtime data
e3ccc03 Fix MSVC warning
9452da9 Merge remote-tracking branch 'origin/develop' into develop
2fd2446 Simplify ExecutionEngine interface. It is possible to pass raw code instead of LLVM module.
46d1926 fixed gcc warnings (missing field initializers, unused functions)
bd40486 Moving ext_calldataload helper function to evmjit library (does not depend on Env)
2b9b530 Cleanups
c6fcdbc Arith performace tests
adb5a68 A bit of work in evmcc. Not ready yet.
b987258 A TODO comment
5362d50 SDIV & SMOD fixed
58d2bfb External code access in Env reimplemented
4366542 LOGs reimplemented
63719d2 env_call updated
69dae9a env_create updated
6f84f3d Rename sload, sstore & sha3 Env functions
408fda8 Old code removed
116ce60 Remove Env* param from env_sha3 function (not needed)
4fc4e76 Change the way memory is passed to sha3 Env function
cc6bb83 Simplify JIT logs
259d1d2 Old files removed
ddfe85b Update VM gas counter after execution
2b4430e Change Env functions first argument type to opaque Env*
969f1b5 The way runtime data is passed to jit'ed contract changed
b8e0ad1 Fix exporting Env callback symbols
7db676c Client side Env updated
a0d0f85 JIT VM updated
3298e10 Remove mock declaration
49b82cd Move EXP implementation from Ext to Arith256
8672c4b Updating Ext interface
bb6e603 Updating ExecutionEngine interface
0509b3b Changing Runtime interface
aa77158 Separate runtime classes
68648a2 Separating EVM JIT from CPP client (WIP)
99c7113 CMake scripts
5f61bdc Starting cmake scripts
dc82664 C Interface draft 1
94e41d8 correct calculation of LOG cost
fdd5275 fixed bug in implementation of LOG
30eea6e Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
f72cced resolved circular dependency between libevm and libevmjit
c2c96e6 Merge remote-tracking branch 'origin/develop-evmcc' into develop-evmcc
bf6a4d4 output gas updated in vmPerformanceTest.json
d77ee40 EVM code updated in vmPerformanceTests
3517bfc fixed libevmjit dependencies in cmake files
f7d6554 Move mock of ExtVMFace to evmcc tool
89e6d2f made _ext a mandatory arg of Runtime::run()
aa7fc79 libevmface -> libevmcore: updated cmake files
320bdf5 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
86334f5 Handle bytecode as bytes
2bd4d6c Update Instruction.h location
c907c71 codegen for LOG instructions [Delivers #81700490]
cdcbb6b removed references to Memory::dump()
47e654c Merge branch 'develop' into develop-evmcc
7305fb3 fixed bug in llvm ir computing required memory size
4b4265c Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
ae9f57f (1) Handling evmcc options with boost::program_options. (2) Writing out .ll and .bc files
cb87052 unused var removed
9a0f9d3 1) JUMP/I semantics updated. 2) Members of BasicBlock::LocalStack pulled out to BasicBlock
c91c5df Rename BNOT -> NOT, NOT -> ISZERO
29432be Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
ee0e2d3 added struct for compiler options
172fc1c Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
8f7b5d6 removed *.orig file
6f99869 code cleanup and coding-standardization
3fc508f Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
a44a7ab Use llvm.longjmp intrinsic for longjmp [Delivers #81792986]
b6b4f5f Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
8ee32d9 Coding style: use "o_" prefix for output function arguments
40561b1 code cleanup & coding-standardization
aaaf543 Rename Type::i256 -> Type::Word
b5abb70 Use common builder in GasMeter and Memory
33cc50d Empty lines removal
72398d2 Handle unsigned integer overflow in Memory::require() [Delivers #81773288]
350b004 Change Constant::get to support negative values
272c568 Remove Memory::require(size) interface [#81773288]
273b0f6 Deprecate Memory::require(size) function. Risk of unsigned integer overflow.
439561a Use readPushData() in basic block analysis
bfb9660 Use readPushData() in instruction compilation
1008c70 Create dedicated function for pushdata reading
4ff7ba0 Fix u256 to APInt conversion
65af01c removed accidentally added *.orig file
d32daf6 New performance tests [Delivers #81578852]
895d0aa Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
7760b31 Cleaning up warnings and build dependencies [#81588646]
2d6aa46 CMakeLists updated, should now build without LLVM when EVMJIT is not enabled [#81588646]
43093d6 Fix MSIZE and memory resize step [Delivers #81777708]
85f67a5 Improve PUSH compilation
2bbbf6c Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
3725432 Fix case where JUMPI is the last instruction
2524c72 Codegen for SIGNEXTEND [Delivers #81700414]
007641a SIGEXTEND: first try [#81700414]
d778640 Fix BNOT instruction [Delivers #81700198]
dd75da2 BNOT instruction [Delivers #81700198]
e4a77c1 Increase refund counter if deleting a storage item [Delivers #81575908]
22e4d16 Remove old code
af0530b Got rid of some gcc warnings
c6cf723 Fix u256 to APInt conversion
e6b4761 Allow creating LLVM constants directly from u256
33f1253 Update gas counting for SSTORE, no refunding yet [#81575908]
e24c9c2 Improve Compiler code formatting
f06445f Improve VM code formatting
c03d36a Improve Ext code formatting
bc1ef19 Improve GasMeter code formatting
3212b2b Improve ExecutionEngine code formatting
de67937 Improve BasicBlock code formatting
64513d5 Improve Memory code formatting
3ee33cc Improve code formatting
1e8a091 Improve Arith256 code formatting
211d3c0 Change #include setjmp
fa6d4c6 Improve Stack code formatting
7e3a9f4 Remove done FIXME tasks
ce889fc Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
4c9fed9 turned on stack optimization by default in jit compiler
664de37 json test file for performance testing
89d4a1c Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
887bac9 Use clog for JIT logs
6e8d1ce added inlcude of setjmp.h required for jmp_buf type
ac478d2 added dependency on libethereum to evmcc
a3871e5 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
cecf567 MULMOD/ADDMOD implemented in separate functions [FIXES #80566276]
65eaa13 Remove global Runtime pointer
25ccd49 Changed semantics of JUMPDEST so that *the next* instruction is a jump destination
6bf994d 1. Indenting spaces converted to tabs 2. Options changed: -G --> -g
4684c6f Using call helper
2493ef5 Call helper
6da6f3d Handle bad instructions (BadInstruction exception) [#81563132]
ac38bf9 Add raiseException helper to RuntimeManager [#81563132]
31c9dd3 Ignore opOp callback silently
5a923d6 Ignore opOp callback silently
c7ba567 Merge branch 'develop' into develop-evmcc
0da6823 Fix EXTCODECOPY
0eb8311 Restore correct memory access in Ext functions
05bbe53 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
d5ddbfa Added missing changes [#79450108]
6a16efa Get Runtime pointer from main function argument if available
e273299 Change some runtime names
fd7b6da Move return data reference to Runtime [#81470252]
6d428d8 Fix ReturnData::Index::_size
64e3748 Move jmpbuf to Runtime [#81470252]
68ca696 256-bit arithmetic implemented via calls to boost::multiprecision library. [#79450108]
4bcd092 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
a90ebe6 Print compilation/execution times
734dd31 Using RuntimeData pointer in ext functions [#81470252]
a076ced Old bswap intrinsic removed
3cba473 Moving CODE data from Ext to Runtime [#81470252]
83b24b6 Moving CALLDATA data from Ext to Runtime [#81470252]
916f5ab Group instructions that access runtime data [#81470252]
088a4ef Moving the rest word-size data from Ext to Runtime [#81470252]
bfe1216 Moving ORIGIN, CALLER & CALLVALUE data from Ext to Runtime [#81470252]
5c1e344 Add name to data indices [#81470252]
399cf28 Moving ADDRESS data from Ext to Runtime [#81470252]
2b898fc Introducing RuntimeHelper - a compiler helper that depends on runtime data [#81470252]
9ca2663 Use Type::RuntimePtr instead of RuntimeData::getType->getPointerTo()
3670e32 Access stack structure through runtime structure [#81470252]
693c4b3 Add Type::RuntimePtr predefined LLVM type
c388a81 Access memory structure through runtime structure [#81470252]
b579c70 Place current gas counter value in RuntimeData
097b7ae Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
8da55ff Export runtime data to global variable in main function
a60843e Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
547ca38 Propagation of values between basic blocks' local stacks [#80895676]
6c2a120 Introducing RuntimeData struct - a data that will be provided to running program
6580a9b Visual Studio build fix
0dae894 new test cases
d281396 Refactored local stack [#81180320]
d41828f added option to set initial gas
fc7a46b Change the way VMs are created (mostly for tracking where are created)
dcb739e Better assert condition
16de530 Try not to use JIT in any interactive mode
48108f5 Implement VMFace with jit::VM
701d99e Fixed the order in which phi nodes are created (was incorrect) [#80895676]
aaf0f7d Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
044e838 Fixed bug in phi node rewriting [#80895676]
170ca15 Null gas in case of out-of-gas exception [Delivers #81118624]
54c636a Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
f28f8cc Add support for Big Endian architectures [Delivers #79877740]
0757523 Use Endianness in Ext [#79877740]
920ea2e Comment: storage uses native endianness [#79877740]
05741c2 Handle endianness for CALLDATALOAD correctly [#79877740]
5a8ba36 added assert in linkBasicBlocks()
8909c15 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
080cf20 Handling pop() from the empty EVM stack. [#80895676]
49b0769 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
d95083a Remove unreachable basic blocks before "linking"
a6ce4ba Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
1cf3549 minor changes in the compiler driver
a4416e5 Remove unreachable basic blocks before "linking"
c4eb835 added missing CMakeLists.txt
937fbaa Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
0a9e0f5 Propagation of values between basic blocks (and the stack): initial implementation (probably buggy, but simple cases work). [#80895676]
8ba533f Merge branch 'develop' into develop-evmcc
c7eac0d Fix SHA3 instruction :)
5db2038 Handle endianness of MSTORE & MLOAD [#79877740]
51fc9ad Fix compiling empty bytecode
c97ca24 Throw exception if EVM program is not jitable instead of terminating to make tests going
150162e Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
f83e23a Another round of fixing ExtVM interface
54e0824 Updated cmake files after moving the jit compiler to a lib.
58c5a4f Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
607458b BYTE reimplementation
afe0254 Endianness handler
b13f1ac Check if pushed item is a word
b01a75a Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
52ba848 Add support for direct jump outside the code - terminates with STOP
6c3af96 Limit debug output
de8deab Fix for invalid jump table basic block
0febd6a Do not try to add additional cost (call instruction) to cost-block
f31f3bc Using gas provided by test engine and fix for creating fake ExtVMFace.
dfac5a0 Using ExtVM provided by test engine
f0928f5 Tests moved to test/ folder
dd6fbda Fix not allocated arg8 for CALL
15714ce Fix GasMeter not nulling cost call
0f4c8eb VM execution wrapper with similar interface as libevm/VM
9105fb1 Merge branch 'develop' into develop-evmcc
7df24fa Move JIT compiler project to library
34afb85 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
f062fd0 Dumping CFG to .dot: showing indirect jumps with dashed lines
dcafa47 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
72a6fe4 InsertPointGuard definition moved to CompilerHelper.h
8eea475 Get IR module from IR builder on demand
f233122 Added dumping of CFG to a .dot file [Delivers #80816506]
c83739e Get IR module from IR builder
5e13d59 Introducing CompilerHelper - a base class for... compiler helper classes like Memory, GasMeter, etc.
bb51b34 Cleanup block terminator generation
1463897 Basic block compilation in separated function
e094ba9 Placing IRBuilder in Compiler class (for future refactoring)
5586ff5 Some changes about final/stop block
07f6bbf Removing unnecessary `dev` name prefixes
11bf67b Eliminating some `using namespace`
a2da7c9 Change namespace from `evmcc` to `dev::eth::jit`
f1ea6c9 Macros grouping PUSH, DUP and SWAP switch cases
a36a432 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
67ee0b6 Unused rt_exit() function removed
ec2013d Working longjmp solution
00a872e * codegen for CODECALL * fixes for EXTCODECOPY
59a392c Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
564a593 Codegen for EXTCODESIZE & EXTCODECOPY [Delivers #80644732]
9007b74 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
7fcf24d Trying to implement "exceptions" with longjmp (does not work on Windows 64bit at least)
727691f Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
e22238f Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
c57de78 Use longjmp to return OutOfGas code from main function (WIP)
dbb3e81 Try to throw an OutOfGas exception when out of gas. The exception cannot be handled.
04d6ffb Some LLVM function attribute fun
e11a9bb Change a bit  the implementation of GAS instruction (fix)
00e5afc Change a bit  the implementation of GAS instruction
0d679f0 Count gas cost for SSTORE instruction
df93292 Codegen for CODECOPY. [Delivers #80644732]
1c70f3d Prealloc memory and count gas for CALL instruction
d56f60f Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
7d67476 Prealloc memory and count gas for SHA3 and CREATE instructions
42b14ae Fixes in CALLDATACOPY [Delivers #80644732]
9d9e160 InsertPointGuard helper class for IRBuilder
7203120 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
0d97405 Initial implementation for CALLDATACOPY [Delivers #80644732]
82cba7a Use mem.require in mload, mstore & mstore8
0931289 Convenient Memory::require() overload
ab556c6 Private mem.require function that preallocates memory and counts gas fee
01ca987 Give back an amount of gas not used by CALL instructions
fb87a0b Count gas for CALL instructions
07131e4 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
475b85d Fixes in inline asm in some jump tests.
7494fdb Use Constant::get() interface to create LLVM constants
f95999c Allocate memory and count gas for RETURN instruction
7a89751 Change the way compiled program returns
8fb6de0 Define constants and return codes
6caff31 Implemented ADDMOD, MULMOD and GAS [Delivers #80566276]
9b3c446 Codegen for GAS
3a25969 Report error if static-analysed stack is too small
0c259cd Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
a2a496e test cases for JUMPS/phi nodes
6131cca Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
8a52283 Do not check gas cost of value 0
efe23ad Do not commit gas costs on JUMPDEST instruction
7c78ecb Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
293f0de Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
9bdfd59 Change basic block linking order to get better results (still not perfect)
56a17a0 test cases for JUMP
e4cf741 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
6e2bcef Implemented indirect JUMPI and fixes for JUMPs to invalid PCs
2c3d0cc test cases for JUMP(I)
d5f7de4 Always commit cost blocks
39ba3ae Use external counter for gas (external linkage global variable)
4eb65a8 Fix block cost counting (counter not reset)
5470faf Count gas for additional memory
d6e6a5f MSIZE test
0128f09 Wrong resize condition fixed
4f87144 mload function added as implementation of MLOAD
5f1ea8f store8 function added as implementation of MSTORE8
f5a0975 Use mem.store as implementation of MSTORE
f825a60 Generate mem.store function and dependencies (currently unused)
7a7d4e3 Fix for finding jumpTableBlock
d6915b4 Renames & comments
ad43b92 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
fd7069e Indirect jump: jump table generated in separate bblock.
09a5899 Fix stack swap or dup not generating PHI nodes
973e0a2 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
52d1ceb test cases for jumps
5dd3037 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
cfb226b Group gas counting into block of instructions called cost-block.
dab29a9 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
6778940 test cases for JUMP
2b36803 Implementing JUMP/JUMPDEST (work in progress)
e42217d Disable gas checking for now (does not work and makes IR code hard to read)
04cf0cf Generate gas checking function
97644d6 Cleanup LLVM types usage
b7f31af Cleanup LLVM types usage
28d6dd7 Decrement global gas value by instruction step cost
d3f59f6 Introducing GasMeter
7f88487 EXP instruction.
dafa5bc Make the Stack an integral part of BasicBlock
58c5950 JUMP test in assembly
bb19540 Cleanup Compiler
b273b86 Provide end instruction to basic block
16ea3bf Improve basic blocks linking implementation
7a3f3f9 Remove external stack
1cbb9d5 Stack cleanups
a338b88 Cleanups: move basic block linking to separated function
577438e Correct the order of basic blocks
e52d421 Link basic blocks with phi functions
0961908 Introducing BasicBlock class.
cc51bfd Pop entry state of basic block from external stack, push exit state to external stack.
33e36ce Basic stack implementation for basic block. Values on stack are not preserved between basic blocks (jumps)
3cba3a2 SHA3 instruction
f230c82 SUICIDE instruction
3f57858 CALL instruction. Still needs gas counting and callback support.
3942b2e CREATE instruction. Still needs some work with ExtVM interface.
a1a195b Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
f075b7b - fixes for RETURN and STOP - codegen for SLT, SGT, EQ and NEG
b519b73 Stack functions simplified
7bee86a Runtime class that inits and keeps stack, memory and ExtVM interface
320add0 BYTE instruction implementation (with bug on BYTE 0)
710b734 TODO: implement BYTE
48897f4 Bitwise operators: AND, OR, XOR
c002d9b PC instructions
20cd698 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
09a9f10 Block Information instructions: PREVHASH, COINBASE, TIMESTAMP, NUMBER, DIFFICULTY, GASLIMIT
9289508 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
48d4294 - implemented LT, GT - new tests for jumps and comparisons
954300f Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
fbe97fd BALANCE
8b625fa fixed implementation of NOT
fa76d7a fixes for JUMP/JUMPI (generating final basic block) implementation of NOT
ad2c4c4 fixed implementation of JUMPI (cond casted to bool)
1d17da1 Added Module* constructor argument to Memory and Ext.
b730bdc Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
0b8ba6d initial implementation of JUMP/JUMPI (untested)
edf192b Print returned memory to standard output
d073af7 Merge branch 'develop-evmcc' of https://github.com/imapp-pl/ethereum into develop-evmcc
748ee0f Implementing RETURN and STOP instructions
eea755c fixed bug in memory handling
e1abb20 Merge branch 'develop-evmcc' of github.com:imapp-pl/ethereum into develop-evmcc
00f9939 Implemented MLOAD, MSTORE, MSTORE8 and MSIZE
b9cda13 Push call data on stack - CALLDATALOAD
fcde2f3 Accessing Ext static data: CALLER, ORIGIN, CALLVALUE, CALLDATASIZE, GASPRICE
ac795c4 Send Ext static data to running contract. ADDRESS instruction
9ba6a7c Improve stack binary interface
8cd4326 Set/get values in Ext store - SSTORE & SLOAD
0013656 added ethcore to libs required by evmcc
15b9452 Merge branch 'develop-evmcc' of git@github.com:imapp-pl/ethereum.git into develop-evmcc
68f15f9 initial implementation of memory
f3a347b Starting ExtVM binary interface
78b188c Fix stack set/get bad function signature
58e03d5 Basic arithmetic, limited precision for MUL, DIV and MOD.
e53c0a4 SWAP* instructions
3e01d18 POP and DUP* instructions
4266ce5 PUSH instruction implementation
d8430db Output compilation (option -c) result to standard output by default
e8ff67c Stack interface and implementation
bbc3aa4 evmcc's CMakeLists updated: * added std=c++14 for gcc (required for std::make_unique) * added required llvm libnames
dfa141a Staring with Stack helper
f124be6 Implementation of ExecutionEngine with LLVM MCJIT
e33fdea Remove public LLVM dependency in Compiler
507ba06 ExecutionEngine stub and -i program option for interpreting EVM Code
f5eda1f Moving Compiler to separated files
REVERT: 334deeb Initial commit

git-subtree-dir: evmjit
git-subtree-split: 533531bd07
cl-refactor
Marek Kotewicz 10 years ago
parent
commit
29c9178ff4
  1. 28
      .gitignore
  2. 27
      CMakeLists.txt
  3. 22
      LICENSE
  4. 18
      evmcc/CMakeLists.txt
  5. 211
      evmcc/evmcc.cpp
  6. 1
      evmcc/test/arith/addmod.evm
  7. 12
      evmcc/test/arith/addmod.lll
  8. 1
      evmcc/test/arith/arith1.evm
  9. 37
      evmcc/test/arith/arith1.lll
  10. 1
      evmcc/test/arith/arith_bnot.evm
  11. 14
      evmcc/test/arith/arith_bnot.lll
  12. 1
      evmcc/test/arith/div.evm
  13. 10
      evmcc/test/arith/div.lll
  14. 1
      evmcc/test/arith/fib1.evm
  15. 57
      evmcc/test/arith/fib1.lll
  16. 1
      evmcc/test/arith/mul.evm
  17. 13
      evmcc/test/arith/mul.lll
  18. 1
      evmcc/test/arith/mulmod.evm
  19. 12
      evmcc/test/arith/mulmod.lll
  20. 1
      evmcc/test/except/badinst1.evm
  21. 1
      evmcc/test/ext/calldatacopy1.evm
  22. 13
      evmcc/test/ext/calldatacopy1.lll
  23. 1
      evmcc/test/ext/calldatacopy2.evm
  24. 13
      evmcc/test/ext/calldatacopy2.lll
  25. 1
      evmcc/test/ext/codecopy1.evm
  26. 13
      evmcc/test/ext/codecopy1.lll
  27. 1
      evmcc/test/ext/codecopy2.evm
  28. 13
      evmcc/test/ext/codecopy2.lll
  29. 1
      evmcc/test/ext/codecopy3.evm
  30. 13
      evmcc/test/ext/codecopy3.lll
  31. 1
      evmcc/test/ext/ext_test.evm
  32. 55
      evmcc/test/ext/ext_test.lll
  33. 1
      evmcc/test/ext/extcodecopy1.evm
  34. 11
      evmcc/test/ext/extcodecopy1.lll
  35. 1
      evmcc/test/ext/store_delete.evm
  36. 9
      evmcc/test/ext/store_delete.lll
  37. 1
      evmcc/test/ext/store_test.evm
  38. 14
      evmcc/test/ext/store_test.lll
  39. 7
      evmcc/test/jump/ackermann.ethel
  40. 1
      evmcc/test/jump/ackermann.evm
  41. 1
      evmcc/test/jump/badindirect1.evm
  42. 9
      evmcc/test/jump/badindirect1.lll
  43. 1
      evmcc/test/jump/badindirect2.evm
  44. 12
      evmcc/test/jump/badindirect2.lll
  45. 1
      evmcc/test/jump/badjump1.evm
  46. 6
      evmcc/test/jump/badjump1.lll
  47. 1
      evmcc/test/jump/badjump2.evm
  48. 9
      evmcc/test/jump/badjump2.lll
  49. 5
      evmcc/test/jump/call1.ethel
  50. 1
      evmcc/test/jump/call1.evm
  51. 5
      evmcc/test/jump/call2.ethel
  52. 1
      evmcc/test/jump/call2.evm
  53. 5
      evmcc/test/jump/fac.ethel
  54. 1
      evmcc/test/jump/fac.evm
  55. 5
      evmcc/test/jump/fac_tail.ethel
  56. 1
      evmcc/test/jump/fac_tail.evm
  57. 6
      evmcc/test/jump/fib1.ethel
  58. 1
      evmcc/test/jump/fib1.evm
  59. 1
      evmcc/test/jump/for1.evm
  60. 3
      evmcc/test/jump/for1.lll
  61. 1
      evmcc/test/jump/for2.evm
  62. 3
      evmcc/test/jump/for2.lll
  63. 1
      evmcc/test/jump/if1.ethel
  64. 1
      evmcc/test/jump/if1.evm
  65. 1
      evmcc/test/jump/if2.ethel
  66. 1
      evmcc/test/jump/if2.evm
  67. 1
      evmcc/test/jump/indirect1.evm
  68. 13
      evmcc/test/jump/indirect1.lll
  69. 1
      evmcc/test/jump/indirect2.evm
  70. 19
      evmcc/test/jump/indirect2.lll
  71. 1
      evmcc/test/jump/indirect3.evm
  72. 14
      evmcc/test/jump/indirect3.lll
  73. 1
      evmcc/test/jump/indirect4.evm
  74. 15
      evmcc/test/jump/indirect4.lll
  75. 1
      evmcc/test/jump/jump1.evm
  76. 11
      evmcc/test/jump/jump1.lll
  77. 1
      evmcc/test/jump/jump2.evm
  78. 10
      evmcc/test/jump/jump2.lll
  79. 1
      evmcc/test/jump/jump3.evm
  80. 10
      evmcc/test/jump/jump3.lll
  81. 1
      evmcc/test/jump/jump4.evm
  82. 17
      evmcc/test/jump/jump4.lll
  83. 1
      evmcc/test/jump/jump5.evm
  84. 16
      evmcc/test/jump/jump5.lll
  85. 1
      evmcc/test/jump/jump6.evm
  86. 32
      evmcc/test/jump/jump6.lll
  87. 1
      evmcc/test/jump/jumpi_at_the_end.evm
  88. 1
      evmcc/test/jump/jumpi_at_the_end.lll
  89. 1
      evmcc/test/jump/loop1.evm
  90. 27
      evmcc/test/jump/loop1.lll
  91. 1
      evmcc/test/jump/loop2.evm
  92. 28
      evmcc/test/jump/loop2.lll
  93. 4
      evmcc/test/jump/rec1.ethel
  94. 1
      evmcc/test/jump/rec1.evm
  95. 10
      evmcc/test/jump/when1.asm
  96. 1
      evmcc/test/jump/when1.evm
  97. 2
      evmcc/test/jump/when1.lll
  98. 1
      evmcc/test/kv.evm
  99. 10
      evmcc/test/kv.lll
  100. 1
      evmcc/test/mem/byte.evm

28
.gitignore

@ -1,28 +0,0 @@
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app

27
CMakeLists.txt

@ -0,0 +1,27 @@
cmake_minimum_required(VERSION 2.8.12)
project(evmjit)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# LLVM
if(LLVM_DIR) # local LLVM build
find_package(LLVM REQUIRED CONFIG)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
# TODO: bitwriter is needed only for evmcc
llvm_map_components_to_libnames(LLVM_LIBS core support mcjit x86asmparser x86codegen bitwriter)
else()
# Workaround for Ubuntu broken LLVM package
message(STATUS "Using llvm-3.5-dev package from Ubuntu. If does not work, build LLVM and set -DLLVM_DIR=llvm-build/share/llvm/cmake")
execute_process(COMMAND llvm-config-3.5 --includedir OUTPUT_VARIABLE LLVM_INCLUDE_DIRS)
message(STATUS "LLVM include dirs: ${LLVM_INCLUDE_DIRS}")
set(LLVM_LIBS "-lLLVMBitWriter -lLLVMX86CodeGen -lLLVMSelectionDAG -lLLVMAsmPrinter -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMX86AsmParser -lLLVMX86Desc -lLLVMX86Info -lLLVMX86AsmPrinter -lLLVMX86Utils -lLLVMMCJIT -lLLVMTarget -lLLVMRuntimeDyld -lLLVMObject -lLLVMMCParser -lLLVMBitReader -lLLVMExecutionEngine -lLLVMMC -lLLVMCore -lLLVMSupport -lz -lpthread -lffi -ltinfo -ldl -lm")
endif()
# Boost
find_package(Boost REQUIRED)
add_subdirectory(libevmjit)
add_subdirectory(libevmjit-cpp)
add_subdirectory(evmcc)

22
LICENSE

@ -1,22 +0,0 @@
The MIT License (MIT)
Copyright (c) 2014
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

18
evmcc/CMakeLists.txt

@ -0,0 +1,18 @@
set(TARGET_NAME evmcc)
set(SOURCES
evmcc.cpp
)
source_group("" FILES ${SOURCES})
add_executable(${TARGET_NAME} ${SOURCES})
set_property(TARGET ${TARGET_NAME} PROPERTY FOLDER "tools")
include_directories(../..)
include_directories(${LLVM_INCLUDE_DIRS})
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${TARGET_NAME} ethereum)
target_link_libraries(${TARGET_NAME} ${Boost_PROGRAM_OPTIONS_LIBRARIES})
install(TARGETS ${TARGET_NAME} DESTINATION bin )

211
evmcc/evmcc.cpp

@ -0,0 +1,211 @@
#include <chrono>
#include <iostream>
#include <fstream>
#include <ostream>
#include <string>
#include <vector>
#include <boost/algorithm/string.hpp>
#include <boost/program_options.hpp>
#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/Support/raw_os_ostream.h>
#include <llvm/Support/Signals.h>
#include <llvm/Support/PrettyStackTrace.h>
#include <libdevcore/Common.h>
#include <libdevcore/CommonIO.h>
#include <libevmcore/Instruction.h>
#include <libevm/ExtVMFace.h>
#include <evmjit/libevmjit/Compiler.h>
#include <evmjit/libevmjit/ExecutionEngine.h>
void parseProgramOptions(int _argc, char** _argv, boost::program_options::variables_map& _varMap)
{
namespace opt = boost::program_options;
opt::options_description explicitOpts("Allowed options");
explicitOpts.add_options()
("help,h", "show usage information")
("compile,c", "compile the code to LLVM IR")
("interpret,i", "compile the code to LLVM IR and execute")
("gas,g", opt::value<size_t>(), "set initial gas for execution")
("disassemble,d", "dissassemble the code")
("dump-cfg", "dump control flow graph to graphviz file")
("dont-optimize", "turn off optimizations")
("optimize-stack", "optimize stack use between basic blocks (default: on)")
("rewrite-switch", "rewrite LLVM switch to branches (default: on)")
("output-ll", opt::value<std::string>(), "dump generated LLVM IR to file")
("output-bc", opt::value<std::string>(), "dump generated LLVM bitcode to file")
("show-logs", "output LOG statements to stderr")
("verbose,V", "enable verbose output");
opt::options_description implicitOpts("Input files");
implicitOpts.add_options()
("input-file", opt::value<std::string>(), "input file");
opt::options_description allOpts("");
allOpts.add(explicitOpts).add(implicitOpts);
opt::positional_options_description inputOpts;
inputOpts.add("input-file", 1);
const char* errorMsg = nullptr;
try
{
auto parser = opt::command_line_parser(_argc, _argv).options(allOpts).positional(inputOpts);
opt::store(parser.run(), _varMap);
opt::notify(_varMap);
}
catch (boost::program_options::error& err)
{
errorMsg = err.what();
}
if (!errorMsg && _varMap.count("input-file") == 0)
errorMsg = "missing input file name";
if (_varMap.count("disassemble") == 0
&& _varMap.count("compile") == 0
&& _varMap.count("interpret") == 0)
{
errorMsg = "at least one of -c, -i, -d is required";
}
if (errorMsg || _varMap.count("help"))
{
if (errorMsg)
std::cerr << "Error: " << errorMsg << std::endl;
std::cout << "Usage: " << _argv[0] << " <options> input-file " << std::endl
<< explicitOpts << std::endl;
std::exit(errorMsg ? 1 : 0);
}
}
int main(int argc, char** argv)
{
llvm::sys::PrintStackTraceOnErrorSignal();
llvm::PrettyStackTraceProgram X(argc, argv);
boost::program_options::variables_map options;
parseProgramOptions(argc, argv, options);
auto inputFile = options["input-file"].as<std::string>();
std::ifstream ifs(inputFile);
if (!ifs.is_open())
{
std::cerr << "cannot open input file " << inputFile << std::endl;
exit(1);
}
std::string src((std::istreambuf_iterator<char>(ifs)),
(std::istreambuf_iterator<char>()));
boost::algorithm::trim(src);
using namespace dev;
bytes bytecode = fromHex(src);
if (options.count("disassemble"))
{
std::string assembly = eth::disassemble(bytecode);
std::cout << assembly << std::endl;
}
if (options.count("compile") || options.count("interpret"))
{
size_t initialGas = 10000;
if (options.count("gas"))
initialGas = options["gas"].as<size_t>();
auto compilationStartTime = std::chrono::high_resolution_clock::now();
eth::jit::Compiler::Options compilerOptions;
compilerOptions.dumpCFG = options.count("dump-cfg") > 0;
bool optimize = options.count("dont-optimize") == 0;
compilerOptions.optimizeStack = optimize || options.count("optimize-stack") > 0;
compilerOptions.rewriteSwitchToBranches = optimize || options.count("rewrite-switch") > 0;
auto compiler = eth::jit::Compiler(compilerOptions);
auto module = compiler.compile(bytecode, "main");
auto compilationEndTime = std::chrono::high_resolution_clock::now();
module->dump();
if (options.count("output-ll"))
{
auto outputFile = options["output-ll"].as<std::string>();
std::ofstream ofs(outputFile);
if (!ofs.is_open())
{
std::cerr << "cannot open output file " << outputFile << std::endl;
exit(1);
}
llvm::raw_os_ostream ros(ofs);
module->print(ros, nullptr);
ofs.close();
}
if (options.count("output-bc"))
{
auto outputFile = options["output-bc"].as<std::string>();
std::ofstream ofs(outputFile);
if (!ofs.is_open())
{
std::cerr << "cannot open output file " << outputFile << std::endl;
exit(1);
}
llvm::raw_os_ostream ros(ofs);
llvm::WriteBitcodeToFile(module.get(), ros);
ros.flush();
ofs.close();
}
if (options.count("verbose"))
{
std::cerr << "*** Compilation time: "
<< std::chrono::duration_cast<std::chrono::microseconds>(compilationEndTime - compilationStartTime).count()
<< std::endl;
}
if (options.count("interpret"))
{
using namespace eth::jit;
ExecutionEngine engine;
eth::jit::u256 gas = initialGas;
// Create random runtime data
RuntimeData data;
data.set(RuntimeData::Gas, gas);
data.set(RuntimeData::Address, (u160)Address(1122334455667788));
data.set(RuntimeData::Caller, (u160)Address(0xfacefacefaceface));
data.set(RuntimeData::Origin, (u160)Address(101010101010101010));
data.set(RuntimeData::CallValue, 0xabcd);
data.set(RuntimeData::CallDataSize, 3);
data.set(RuntimeData::GasPrice, 1003);
data.set(RuntimeData::PrevHash, 1003);
data.set(RuntimeData::CoinBase, (u160)Address(101010101010101015));
data.set(RuntimeData::TimeStamp, 1005);
data.set(RuntimeData::Number, 1006);
data.set(RuntimeData::Difficulty, 16);
data.set(RuntimeData::GasLimit, 1008);
data.set(RuntimeData::CodeSize, bytecode.size());
data.callData = (uint8_t*)"abc";
data.code = bytecode.data();
// BROKEN: env_* functions must be implemented & RuntimeData struct created
// TODO: Do not compile module again
auto result = engine.run(bytecode, &data, nullptr);
return static_cast<int>(result);
}
}
return 0;
}

1
evmcc/test/arith/addmod.evm

@ -0,0 +1 @@
60646107b760271460005560006001f2

12
evmcc/test/arith/addmod.lll

@ -0,0 +1,12 @@
;; Should return (1975 + 39) `mod` 100 = 14 = 0x0e
(asm
100
1975
39
ADDMOD
0
MSTORE8
0
1
RETURN
)

1
evmcc/test/arith/arith1.evm

@ -0,0 +1 @@
60016001900160070260050160029004600490066021900560150160030260059007600303600960110860005460086000f2

37
evmcc/test/arith/arith1.lll

@ -0,0 +1,37 @@
(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
)

1
evmcc/test/arith/arith_bnot.evm

@ -0,0 +1 @@
6201e2406000546000530960005460206000f2

14
evmcc/test/arith/arith_bnot.lll

@ -0,0 +1,14 @@
(asm
123456
0
MSTORE
0
MLOAD
BNOT
0
MSTORE
32
0
RETURN
)

1
evmcc/test/arith/div.evm

@ -0,0 +1 @@
60027ffedcba9876543210fedcba9876543210fedcba9876543210fedcba98765432100460005460206000f2

10
evmcc/test/arith/div.lll

@ -0,0 +1,10 @@
(asm
0x2
0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210
DIV
0
MSTORE
32
0
RETURN
)

1
evmcc/test/arith/fib1.evm

@ -0,0 +1 @@
60016001818101818101818101818101818101818101818101818101818101818101818101818101818101818101818101818101818101

57
evmcc/test/arith/fib1.lll

@ -0,0 +1,57 @@
;; 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
)

1
evmcc/test/arith/mul.evm

@ -0,0 +1 @@
7001234567890abcdef0fedcba09876543217001234567890abcdef0fedcba09876543217001234567890abcdef0fedcba0987654321020260005460206000f2

13
evmcc/test/arith/mul.lll

@ -0,0 +1,13 @@
(asm
0x1234567890abcdef0fedcba0987654321
0x1234567890abcdef0fedcba0987654321
0x1234567890abcdef0fedcba0987654321
MUL
MUL
0
MSTORE
32
0
RETURN
;; 47d0817e4167b1eb4f9fc722b133ef9d7d9a6fb4c2c1c442d000107a5e419561
)

1
evmcc/test/arith/mulmod.evm

@ -0,0 +1 @@
6064601b60251560005560006001f2

12
evmcc/test/arith/mulmod.lll

@ -0,0 +1,12 @@
;; Should return (27 * 37) `mod` 100 = 99 = 0x63
(asm
100
27
37
MULMOD
0
MSTORE8
0
1
RETURN
)

1
evmcc/test/except/badinst1.evm

@ -0,0 +1 @@
4a

1
evmcc/test/ext/calldatacopy1.evm

@ -0,0 +1 @@
60326000600a37600053600a6014f2

13
evmcc/test/ext/calldatacopy1.lll

@ -0,0 +1,13 @@
(asm
50 ;; byte count
0 ;; source index in calldata array
10 ;; dest index in memory
CALLDATACOPY
0
MLOAD ;; to dump memory
10
20
RETURN
)

1
evmcc/test/ext/calldatacopy2.evm

@ -0,0 +1 @@
606464e8d4a510006000376000536000600af2

13
evmcc/test/ext/calldatacopy2.lll

@ -0,0 +1,13 @@
(asm
100 ;; byte count
1000000000000 ;; source index in calldata array
0 ;; dest index in memory
CALLDATACOPY
0
MLOAD ;; to dump memory
0
10
RETURN
)

1
evmcc/test/ext/codecopy1.evm

@ -0,0 +1 @@
60146000600a39600053600a6014f2

13
evmcc/test/ext/codecopy1.lll

@ -0,0 +1,13 @@
(asm
20 ;; byte count
0 ;; source index in code array
10 ;; dest index in memory
CODECOPY
0
MLOAD ;; to dump memory
10
20
RETURN
)

1
evmcc/test/ext/codecopy2.evm

@ -0,0 +1 @@
606464e8d4a510006000396000536000600af2

13
evmcc/test/ext/codecopy2.lll

@ -0,0 +1,13 @@
(asm
100 ;; byte count
1000000000000 ;; source index in code array
0 ;; dest index in memory
CODECOPY
0
MLOAD ;; to dump memory
0
10
RETURN
)

1
evmcc/test/ext/codecopy3.evm

@ -0,0 +1 @@
3860006000396000536000600af2

13
evmcc/test/ext/codecopy3.lll

@ -0,0 +1,13 @@
(asm
CODESIZE ;; byte count
0 ;; source index in code array
0 ;; dest index in memory
CODECOPY
0
MLOAD ;; to dump memory
0
10
RETURN
)

1
evmcc/test/ext/ext_test.evm

@ -0,0 +1 @@
5a3031333234363a4041424344455a36600035602635601335387f1111222233334444555566667777888899990000aaaabbbbccccddddeeeeffff600054602060006000f06020600060206000600030610bb8f1600053611000545b60200260002030ff60016002f2

55
evmcc/test/ext/ext_test.lll

@ -0,0 +1,55 @@
(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
)

1
evmcc/test/ext/extcodecopy1.evm

@ -0,0 +1 @@
60c86000600a303c60005360006020f2

11
evmcc/test/ext/extcodecopy1.lll

@ -0,0 +1,11 @@
(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
)

1
evmcc/test/ext/store_delete.evm

@ -0,0 +1 @@
6104d26063576000606357

9
evmcc/test/ext/store_delete.lll

@ -0,0 +1,9 @@
(asm
1234
99
SSTORE
0
99
SSTORE
)

1
evmcc/test/ext/store_test.evm

@ -0,0 +1 @@
607b607c60015760005760015660005603

14
evmcc/test/ext/store_test.lll

@ -0,0 +1,14 @@
(asm
123
124
1
SSTORE
0
SSTORE
1
SLOAD
0
SLOAD
SUB
)

7
evmcc/test/jump/ackermann.ethel

@ -0,0 +1,7 @@
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

1
evmcc/test/jump/ackermann.evm

@ -0,0 +1 @@
6009600360086012585d60005460206000f26000820e6047596000810e603859603460018303603084600185036012585d6012585d60445860436001830360016012585d604b5860018101905090509058

1
evmcc/test/jump/badindirect1.evm

@ -0,0 +1 @@
601b602502585d

9
evmcc/test/jump/badindirect1.lll

@ -0,0 +1,9 @@
;; Indirect jump out of code
(asm
27
37
MUL
JUMP
JUMPDEST
)

1
evmcc/test/jump/badindirect2.evm

@ -0,0 +1 @@
60016003600302596000600058

12
evmcc/test/jump/badindirect2.lll

@ -0,0 +1,12 @@
;; Indirect jump into data
(asm
1 ;; 0
3
3
MUL ;; 6
JUMPI ;; 7
0 ;; 8
0
JUMP
)

1
evmcc/test/jump/badjump1.evm

@ -0,0 +1 @@
6103e758

6
evmcc/test/jump/badjump1.lll

@ -0,0 +1,6 @@
;; Direct jump out of code.
(asm
999
JUMP
)

1
evmcc/test/jump/badjump2.evm

@ -0,0 +1 @@
6004586000600058

9
evmcc/test/jump/badjump2.lll

@ -0,0 +1,9 @@
;; Direct jump into data
(asm
4 ;; 0 0-3
JUMP ;; 2
0 ;; 3 3-4
0 ;; 5 4-7
JUMP ;; 6
)

5
evmcc/test/jump/call1.ethel

@ -0,0 +1,5 @@
let f n = n + 1
return f 2

1
evmcc/test/jump/call1.evm

@ -0,0 +1 @@
600760026010585d60005460206000f28060010190509058

5
evmcc/test/jump/call2.ethel

@ -0,0 +1,5 @@
let f a b = a + b
return f 2 3

1
evmcc/test/jump/call2.evm

@ -0,0 +1 @@
6009600260036012585d60005460206000f2818101905090509058

5
evmcc/test/jump/fac.ethel

@ -0,0 +1,5 @@
let fac n =
if n == 0 then 1
else n * fac (n-1)
return fac 60

1
evmcc/test/jump/fac.evm

@ -0,0 +1 @@
6007603c6010585d60005460206000f26000810e6026596020600182036010585d8102602858600190509058

5
evmcc/test/jump/fac_tail.ethel

@ -0,0 +1,5 @@
let fac a n =
if n == 0 then a
else fac (a*n) (n-1)
return fac 1 60

1
evmcc/test/jump/fac_tail.evm

@ -0,0 +1 @@
60096001603c6012585d60005460206000f26000810e6029596025818302600183036012585d602a5881905090509058

6
evmcc/test/jump/fib1.ethel

@ -0,0 +1,6 @@
let fib n =
if n < 3 then 1
else fib (n-1) + fib (n-2)
return fib 10

1
evmcc/test/jump/fib1.evm

@ -0,0 +1 @@
6007600a6010585d60005460206000f26003810a602f596020600282036010585d602a600183036010585d01603158600190509058

1
evmcc/test/jump/for1.evm

@ -0,0 +1 @@
600a60805460006080530b0f60255960a0536080530160a054600160805303608054600558

3
evmcc/test/jump/for1.lll

@ -0,0 +1,3 @@
(for [i]:10 (> @i 0) [i](- @i 1)
[j](+ @i @j)
)

1
evmcc/test/jump/for2.evm

@ -0,0 +1 @@
6000608054600a6080530a0f60255960a0536080530160a054600160805301608054600558

3
evmcc/test/jump/for2.lll

@ -0,0 +1,3 @@
(for [i]:0 (< @i 10) [i](+ @i 1)
[j](+ @i @j)
)

1
evmcc/test/jump/if1.ethel

@ -0,0 +1 @@
return if 0 then 1 else 2

1
evmcc/test/jump/if1.evm

@ -0,0 +1 @@
60006300000010596002630000001258600160005460206000f2

1
evmcc/test/jump/if2.ethel

@ -0,0 +1 @@
return if 1 then 1 else 2

1
evmcc/test/jump/if2.evm

@ -0,0 +1 @@
60016300000010596002630000001258600160005460206000f2

1
evmcc/test/jump/indirect1.evm

@ -0,0 +1 @@
600460030158005d6001600054

13
evmcc/test/jump/indirect1.lll

@ -0,0 +1,13 @@
;; Indirect JUMP
(asm
4 ;; 0
3 ;; 2
ADD ;; 4
JUMP ;; 5
STOP ;; 6
JUMPDEST ;; 7
1
0
MSTORE
)

1
evmcc/test/jump/indirect2.evm

@ -0,0 +1 @@
600860060158005d6001600054005d600260005400

19
evmcc/test/jump/indirect2.lll

@ -0,0 +1,19 @@
;; 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
)

1
evmcc/test/jump/indirect3.evm

@ -0,0 +1 @@
6001600460050159005d6001600054

14
evmcc/test/jump/indirect3.lll

@ -0,0 +1,14 @@
;; Indirect JUMP
(asm
1 ;; 0
4 ;; 2
5 ;; 4
ADD ;; 6
JUMPI ;; 7
STOP ;; 8
JUMPDEST ;; 9
1
0
MSTORE
)

1
evmcc/test/jump/indirect4.evm

@ -0,0 +1 @@
60006007600501596001600054005d00

15
evmcc/test/jump/indirect4.lll

@ -0,0 +1,15 @@
;; Indirect JUMP
(asm
0 ;; 0
7 ;; 2
5 ;; 4
ADD ;; 6
JUMPI ;; 7
1 ;; 8
0 ;; 9
MSTORE ;; 10
STOP ;; 11
JUMPDEST ;; 12
STOP
)

1
evmcc/test/jump/jump1.evm

@ -0,0 +1 @@
600458006001600154

11
evmcc/test/jump/jump1.lll

@ -0,0 +1,11 @@
;; Direct JUMP.
;; output: memory[1] == 1
(asm
4 ;; 0
JUMP ;; 2
STOP ;; 3
1 ;; 4
1 ;; 6
MSTORE ;; 8
)

1
evmcc/test/jump/jump2.evm

@ -0,0 +1 @@
6008586001600154

10
evmcc/test/jump/jump2.lll

@ -0,0 +1,10 @@
;; Direct JUMP to the end of code.
;; output: memory should have size 0.
(asm
8 ;; 0
JUMP ;; 2
1 ;; 3
1 ;; 5
MSTORE ;; 7
)

1
evmcc/test/jump/jump3.evm

@ -0,0 +1 @@
602a586001600154

10
evmcc/test/jump/jump3.lll

@ -0,0 +1,10 @@
;; Direct JUMP past the end of code.
;; output: memory should have size 0.
(asm
42
JUMP
1
1
MSTORE
)

1
evmcc/test/jump/jump4.evm

@ -0,0 +1 @@
600b6009580000600558005d6001600154

17
evmcc/test/jump/jump4.lll

@ -0,0 +1,17 @@
;; 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
)

1
evmcc/test/jump/jump5.evm

@ -0,0 +1 @@
6005600e585d600160015400600f5800

16
evmcc/test/jump/jump5.lll

@ -0,0 +1,16 @@
;; 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
)

1
evmcc/test/jump/jump6.evm

@ -0,0 +1 @@
600358600f600d58006014600758005d6001600154005d600260025400

32
evmcc/test/jump/jump6.lll

@ -0,0 +1,32 @@
;; 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
)

1
evmcc/test/jump/jumpi_at_the_end.evm

@ -0,0 +1 @@
600a6000545d6000536001900380600054600659

1
evmcc/test/jump/jumpi_at_the_end.lll

@ -0,0 +1 @@
(asm 10 0 MSTORE JUMPDEST 0 MLOAD 1 SWAP1 SUB DUP1 0 MSTORE 6 JUMPI)

1
evmcc/test/jump/loop1.evm

@ -0,0 +1 @@
600a600181038060025960005460015460025400

27
evmcc/test/jump/loop1.lll

@ -0,0 +1,27 @@
;; 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
)

1
evmcc/test/jump/loop2.evm

@ -0,0 +1 @@
600a80600190038060025960005460015460025400

28
evmcc/test/jump/loop2.lll

@ -0,0 +1,28 @@
;; 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
)

4
evmcc/test/jump/rec1.ethel

@ -0,0 +1,4 @@
let f n =
if n == 0 then 2 else f (n-1)
return f 10

1
evmcc/test/jump/rec1.evm

@ -0,0 +1 @@
6007600a6010585d60005460206000f26000810e6024596020600182036010585d602658600290509058

10
evmcc/test/jump/when1.asm

@ -0,0 +1,10 @@
.code:
PUSH 1
NOT
PUSH [tag0]
JUMPI
PUSH 13
PUSH 128
MSTORE
tag0:

1
evmcc/test/jump/when1.evm

@ -0,0 +1 @@
60010f600b59600d608054

2
evmcc/test/jump/when1.lll

@ -0,0 +1,2 @@
(when (> 1 0) [i] 13)

1
evmcc/test/kv.evm

@ -0,0 +1 @@
33604557602a8060106000396000f200604556330e0f602a59366080530a0f602a59602060805301356080533557604060805301608054600958

10
evmcc/test/kv.lll

@ -0,0 +1,10 @@
{
[[69]] (caller)
(return 0 (lll
(when (= (caller) @@69)
(for {} (< @i (calldatasize)) [i](+ @i 64)
[[ (calldataload @i) ]] (calldataload (+ @i 32))
)
)
0))
}

1
evmcc/test/mem/byte.evm

@ -0,0 +1 @@
7f112233445566778899001122334455667788990011223344556677889900aabb6000137f112233445566778899001122334455667788990011223344556677889900aabb6001137f112233445566778899001122334455667788990011223344556677889900aabb6002137f112233445566778899001122334455667788990011223344556677889900aabb6003137f112233445566778899001122334455667788990011223344556677889900aabb6004137f112233445566778899001122334455667788990011223344556677889900aabb6005137f112233445566778899001122334455667788990011223344556677889900aabb6006137f112233445566778899001122334455667788990011223344556677889900aabb6007137f112233445566778899001122334455667788990011223344556677889900aabb6008137f112233445566778899001122334455667788990011223344556677889900aabb6009137f112233445566778899001122334455667788990011223344556677889900aabb600a137f112233445566778899001122334455667788990011223344556677889900aabb600b137f112233445566778899001122334455667788990011223344556677889900aabb600c137f112233445566778899001122334455667788990011223344556677889900aabb600d137f112233445566778899001122334455667788990011223344556677889900aabb600e137f112233445566778899001122334455667788990011223344556677889900aabb600f137f112233445566778899001122334455667788990011223344556677889900aabb6010137f112233445566778899001122334455667788990011223344556677889900aabb6011137f112233445566778899001122334455667788990011223344556677889900aabb6012137f112233445566778899001122334455667788990011223344556677889900aabb6013137f112233445566778899001122334455667788990011223344556677889900aabb6014137f112233445566778899001122334455667788990011223344556677889900aabb6015137f112233445566778899001122334455667788990011223344556677889900aabb6016137f112233445566778899001122334455667788990011223344556677889900aabb6017137f112233445566778899001122334455667788990011223344556677889900aabb6018137f112233445566778899001122334455667788990011223344556677889900aabb6019137f112233445566778899001122334455667788990011223344556677889900aabb601a137f112233445566778899001122334455667788990011223344556677889900aabb601b137f112233445566778899001122334455667788990011223344556677889900aabb601c137f112233445566778899001122334455667788990011223344556677889900aabb601d137f112233445566778899001122334455667788990011223344556677889900aabb601e137f112233445566778899001122334455667788990011223344556677889900aabb601f137f112233445566778899001122334455667788990011223344556677889900aabb6020137f112233445566778899001122334455667788990011223344556677889900aabb6107de13

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save