mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			668 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			668 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
    This file is part of solidity.
 | 
						|
 | 
						|
    solidity is free software: you can redistribute it and/or modify
 | 
						|
    it under the terms of the GNU General Public License as published by
 | 
						|
    the Free Software Foundation, either version 3 of the License, or
 | 
						|
    (at your option) any later version.
 | 
						|
 | 
						|
    solidity is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
    GNU General Public License for more details.
 | 
						|
 | 
						|
    You should have received a copy of the GNU General Public License
 | 
						|
    along with solidity.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
*/
 | 
						|
/**
 | 
						|
 * @author Alex Beregszaszi
 | 
						|
 * @date 2017
 | 
						|
 * Unit tests for the LLL compiler.
 | 
						|
 */
 | 
						|
 | 
						|
#include <test/Options.h>
 | 
						|
 | 
						|
#include <libdevcore/FixedHash.h>
 | 
						|
 | 
						|
#include <liblll/Compiler.h>
 | 
						|
 | 
						|
#include <boost/test/unit_test.hpp>
 | 
						|
 | 
						|
#include <string>
 | 
						|
#include <memory>
 | 
						|
 | 
						|
using namespace std;
 | 
						|
 | 
						|
namespace dev
 | 
						|
{
 | 
						|
namespace lll
 | 
						|
{
 | 
						|
namespace test
 | 
						|
{
 | 
						|
 | 
						|
namespace
 | 
						|
{
 | 
						|
 | 
						|
bool successCompile(string const& _sourceCode)
 | 
						|
{
 | 
						|
	vector<string> errors;
 | 
						|
	bytes bytecode = lll::compileLLL(_sourceCode, dev::test::Options::get().evmVersion(), false, &errors);
 | 
						|
	if (!errors.empty())
 | 
						|
		return false;
 | 
						|
	if (bytecode.empty())
 | 
						|
		return false;
 | 
						|
	return true;
 | 
						|
}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_SUITE(LLLCompiler)
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(smoke_test)
 | 
						|
{
 | 
						|
	char const* sourceCode = "1";
 | 
						|
	BOOST_CHECK(successCompile(sourceCode));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(switch_valid)
 | 
						|
{
 | 
						|
	char const* sourceCode = R"(
 | 
						|
		(switch (origin))
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(successCompile(sourceCode));
 | 
						|
	sourceCode = R"(
 | 
						|
		(switch
 | 
						|
			1 (panic)
 | 
						|
			2 (panic))
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(successCompile(sourceCode));
 | 
						|
	sourceCode = R"(
 | 
						|
		(switch
 | 
						|
			1 (panic)
 | 
						|
			2 (panic)
 | 
						|
			(panic))
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(successCompile(sourceCode));
 | 
						|
	sourceCode = R"(
 | 
						|
		(switch
 | 
						|
			1 (origin)
 | 
						|
			2 (origin)
 | 
						|
			(origin))
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(successCompile(sourceCode));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(switch_invalid_arg_count)
 | 
						|
{
 | 
						|
	char const* sourceCode = R"(
 | 
						|
		(switch)
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(!successCompile(sourceCode));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(switch_inconsistent_return_count)
 | 
						|
{
 | 
						|
	// cannot return stack items if the default case is not present
 | 
						|
	char const* sourceCode = R"(
 | 
						|
		(switch
 | 
						|
			1 (origin)
 | 
						|
			2 (origin)
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(!successCompile(sourceCode));
 | 
						|
	// return count mismatch
 | 
						|
	sourceCode = R"(
 | 
						|
		(switch
 | 
						|
			1 (origin)
 | 
						|
			2 (origin)
 | 
						|
			(panic))
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(!successCompile(sourceCode));
 | 
						|
	// return count mismatch
 | 
						|
	sourceCode = R"(
 | 
						|
		(switch
 | 
						|
			1 (panic)
 | 
						|
			2 (panic)
 | 
						|
			(origin))
 | 
						|
	)";
 | 
						|
	BOOST_CHECK(!successCompile(sourceCode));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(disallowed_asm_instructions)
 | 
						|
{
 | 
						|
	for (unsigned i = 1; i <= 32; i++)
 | 
						|
		BOOST_CHECK(!successCompile("(asm PUSH" + to_string(i) + ")"));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(disallowed_functional_asm_instructions)
 | 
						|
{
 | 
						|
	for (unsigned i = 1; i <= 32; i++)
 | 
						|
		BOOST_CHECK(!successCompile("(PUSH" + to_string(i) + ")"));
 | 
						|
	for (unsigned i = 1; i <= 16; i++)
 | 
						|
		BOOST_CHECK(!successCompile("(DUP" + to_string(i) + ")"));
 | 
						|
	for (unsigned i = 1; i <= 16; i++)
 | 
						|
		BOOST_CHECK(!successCompile("(SWAP" + to_string(i) + ")"));
 | 
						|
	BOOST_CHECK(!successCompile("(JUMPDEST)"));
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(valid_opcodes_functional)
 | 
						|
{
 | 
						|
	vector<string> opcodes_bytecode {
 | 
						|
		"0000",
 | 
						|
		"600060000100",
 | 
						|
		"600060000200",
 | 
						|
		"600060000300",
 | 
						|
		"600060000400",
 | 
						|
		"600060000500",
 | 
						|
		"600060000600",
 | 
						|
		"600060000700",
 | 
						|
		"6000600060000800",
 | 
						|
		"6000600060000900",
 | 
						|
		"600060000a00",
 | 
						|
		"600060000b00",
 | 
						|
		"600060001000",
 | 
						|
		"600060001100",
 | 
						|
		"600060001200",
 | 
						|
		"600060001300",
 | 
						|
		"600060001400",
 | 
						|
		"60001500",
 | 
						|
		"600060001600",
 | 
						|
		"600060001700",
 | 
						|
		"600060001800",
 | 
						|
		"60001900",
 | 
						|
		"600060001a00",
 | 
						|
		"600060002000",
 | 
						|
		"3000",
 | 
						|
		"60003100",
 | 
						|
		"3200",
 | 
						|
		"3300",
 | 
						|
		"3400",
 | 
						|
		"60003500",
 | 
						|
		"3600",
 | 
						|
		"6000600060003700",
 | 
						|
		"3800",
 | 
						|
		"6000600060003900",
 | 
						|
		"3a00",
 | 
						|
		"60003b00",
 | 
						|
		"60006000600060003c00",
 | 
						|
		"3d00",
 | 
						|
		"6000600060003e00",
 | 
						|
		"60003f00",
 | 
						|
		"60004000",
 | 
						|
		"4100",
 | 
						|
		"4200",
 | 
						|
		"4300",
 | 
						|
		"4400",
 | 
						|
		"4500",
 | 
						|
		"60005000",
 | 
						|
		"60005100",
 | 
						|
		"600060005200",
 | 
						|
		"600060005300",
 | 
						|
		"60005400",
 | 
						|
		"600060005500",
 | 
						|
		"60005600",
 | 
						|
		"600060005700",
 | 
						|
		"5800",
 | 
						|
		"5900",
 | 
						|
		"5a00",
 | 
						|
		"60ff00",
 | 
						|
		"61ffff00",
 | 
						|
		"62ffffff00",
 | 
						|
		"63ffffffff00",
 | 
						|
		"64ffffffffff00",
 | 
						|
		"65ffffffffffff00",
 | 
						|
		"66ffffffffffffff00",
 | 
						|
		"67ffffffffffffffff00",
 | 
						|
		"68ffffffffffffffffff00",
 | 
						|
		"69ffffffffffffffffffff00",
 | 
						|
		"6affffffffffffffffffffff00",
 | 
						|
		"6bffffffffffffffffffffffff00",
 | 
						|
		"6cffffffffffffffffffffffffff00",
 | 
						|
		"6dffffffffffffffffffffffffffff00",
 | 
						|
		"6effffffffffffffffffffffffffffff00",
 | 
						|
		"6fffffffffffffffffffffffffffffffff00",
 | 
						|
		"70ffffffffffffffffffffffffffffffffff00",
 | 
						|
		"71ffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"72ffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"73ffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"74ffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"75ffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"76ffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"77ffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"78ffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"79ffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7affffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"60006000a000",
 | 
						|
		"600060006000a100",
 | 
						|
		"6000600060006000a200",
 | 
						|
		"60006000600060006000a300",
 | 
						|
		"600060006000600060006000a400",
 | 
						|
		"600060006000f000",
 | 
						|
		"6000600060006000600060006000f100",
 | 
						|
		"6000600060006000600060006000f200",
 | 
						|
		"60006000f300",
 | 
						|
		"600060006000600060006000f400",
 | 
						|
		"600060006000600060006000fa00",
 | 
						|
		"60006000fd00",
 | 
						|
		"fe00",
 | 
						|
		"6000ff00"
 | 
						|
	};
 | 
						|
 | 
						|
	vector<string> opcodes_lll {
 | 
						|
		"(STOP)",
 | 
						|
		"(ADD 0 0)",
 | 
						|
		"(MUL 0 0)",
 | 
						|
		"(SUB 0 0)",
 | 
						|
		"(DIV 0 0)",
 | 
						|
		"(SDIV 0 0)",
 | 
						|
		"(MOD 0 0)",
 | 
						|
		"(SMOD 0 0)",
 | 
						|
		"(ADDMOD 0 0 0)",
 | 
						|
		"(MULMOD 0 0 0)",
 | 
						|
		"(EXP 0 0)",
 | 
						|
		"(SIGNEXTEND 0 0)",
 | 
						|
		"(LT 0 0)",
 | 
						|
		"(GT 0 0)",
 | 
						|
		"(SLT 0 0)",
 | 
						|
		"(SGT 0 0)",
 | 
						|
		"(EQ 0 0)",
 | 
						|
		"(ISZERO 0)",
 | 
						|
		"(AND 0 0)",
 | 
						|
		"(OR 0 0)",
 | 
						|
		"(XOR 0 0)",
 | 
						|
		"(NOT 0)",
 | 
						|
		"(BYTE 0 0)",
 | 
						|
		"(KECCAK256 0 0)",
 | 
						|
		"(ADDRESS)",
 | 
						|
		"(BALANCE 0)",
 | 
						|
		"(ORIGIN)",
 | 
						|
		"(CALLER)",
 | 
						|
		"(CALLVALUE)",
 | 
						|
		"(CALLDATALOAD 0)",
 | 
						|
		"(CALLDATASIZE)",
 | 
						|
		"(CALLDATACOPY 0 0 0)",
 | 
						|
		"(CODESIZE)",
 | 
						|
		"(CODECOPY 0 0 0)",
 | 
						|
		"(GASPRICE)",
 | 
						|
		"(EXTCODESIZE 0)",
 | 
						|
		"(EXTCODECOPY 0 0 0 0)",
 | 
						|
		"(RETURNDATASIZE)",
 | 
						|
		"(RETURNDATACOPY 0 0 0)",
 | 
						|
		"(EXTCODEHASH 0)",
 | 
						|
		"(BLOCKHASH 0)",
 | 
						|
		"(COINBASE)",
 | 
						|
		"(TIMESTAMP)",
 | 
						|
		"(NUMBER)",
 | 
						|
		"(DIFFICULTY)",
 | 
						|
		"(GASLIMIT)",
 | 
						|
		"(POP 0)",
 | 
						|
		"(MLOAD 0)",
 | 
						|
		"(MSTORE 0 0)",
 | 
						|
		"(MSTORE8 0 0)",
 | 
						|
		"(SLOAD 0)",
 | 
						|
		"(SSTORE 0 0)",
 | 
						|
		"(JUMP 0)",
 | 
						|
		"(JUMPI 0 0)",
 | 
						|
		"(PC)",
 | 
						|
		"(MSIZE)",
 | 
						|
		"(GAS)",
 | 
						|
		"0xff",
 | 
						|
		"0xffff",
 | 
						|
		"0xffffff",
 | 
						|
		"0xffffffff",
 | 
						|
		"0xffffffffff",
 | 
						|
		"0xffffffffffff",
 | 
						|
		"0xffffffffffffff",
 | 
						|
		"0xffffffffffffffff",
 | 
						|
		"0xffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
 | 
						|
		"(LOG0 0 0)",
 | 
						|
		"(LOG1 0 0 0)",
 | 
						|
		"(LOG2 0 0 0 0)",
 | 
						|
		"(LOG3 0 0 0 0 0)",
 | 
						|
		"(LOG4 0 0 0 0 0 0)",
 | 
						|
		"(CREATE 0 0 0)",
 | 
						|
		"(CALL 0 0 0 0 0 0 0)",
 | 
						|
		"(CALLCODE 0 0 0 0 0 0 0)",
 | 
						|
		"(RETURN 0 0)",
 | 
						|
		"(DELEGATECALL 0 0 0 0 0 0)",
 | 
						|
		"(STATICCALL 0 0 0 0 0 0)",
 | 
						|
		"(REVERT 0 0)",
 | 
						|
		"(INVALID)",
 | 
						|
		"(SELFDESTRUCT 0)"
 | 
						|
	};
 | 
						|
 | 
						|
	for (size_t i = 0; i < opcodes_bytecode.size(); i++)
 | 
						|
	{
 | 
						|
		vector<string> errors;
 | 
						|
		bytes code = lll::compileLLL(opcodes_lll[i], dev::test::Options::get().evmVersion(), false, &errors);
 | 
						|
 | 
						|
		BOOST_REQUIRE_MESSAGE(errors.empty(), opcodes_lll[i]);
 | 
						|
 | 
						|
		BOOST_CHECK_EQUAL(toHex(code), opcodes_bytecode[i]);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_CASE(valid_opcodes_asm)
 | 
						|
{
 | 
						|
	vector<string> opcodes_bytecode {
 | 
						|
		"0000",
 | 
						|
		"600060000100",
 | 
						|
		"600060000200",
 | 
						|
		"600060000300",
 | 
						|
		"600060000400",
 | 
						|
		"600060000500",
 | 
						|
		"600060000600",
 | 
						|
		"600060000700",
 | 
						|
		"6000600060000800",
 | 
						|
		"6000600060000900",
 | 
						|
		"600060000a00",
 | 
						|
		"600060000b00",
 | 
						|
		"600060001000",
 | 
						|
		"600060001100",
 | 
						|
		"600060001200",
 | 
						|
		"600060001300",
 | 
						|
		"600060001400",
 | 
						|
		"60001500",
 | 
						|
		"600060001600",
 | 
						|
		"600060001700",
 | 
						|
		"600060001800",
 | 
						|
		"60001900",
 | 
						|
		"600060001a00",
 | 
						|
		"600060002000",
 | 
						|
		"3000",
 | 
						|
		"60003100",
 | 
						|
		"3200",
 | 
						|
		"3300",
 | 
						|
		"3400",
 | 
						|
		"60003500",
 | 
						|
		"3600",
 | 
						|
		"6000600060003700",
 | 
						|
		"3800",
 | 
						|
		"6000600060003900",
 | 
						|
		"3a00",
 | 
						|
		"60003b00",
 | 
						|
		"60006000600060003c00",
 | 
						|
		"3d00",
 | 
						|
		"6000600060003e00",
 | 
						|
		"60003f00",
 | 
						|
		"4000",
 | 
						|
		"4100",
 | 
						|
		"4200",
 | 
						|
		"4300",
 | 
						|
		"4400",
 | 
						|
		"4500",
 | 
						|
		"60005000",
 | 
						|
		"60005100",
 | 
						|
		"600060005200",
 | 
						|
		"600060005300",
 | 
						|
		"60005400",
 | 
						|
		"600060005500",
 | 
						|
		"60005600",
 | 
						|
		"600060005700",
 | 
						|
		"5800",
 | 
						|
		"5900",
 | 
						|
		"5a00",
 | 
						|
		"5b00",
 | 
						|
		"60ff00",
 | 
						|
		"61ffff00",
 | 
						|
		"62ffffff00",
 | 
						|
		"63ffffffff00",
 | 
						|
		"64ffffffffff00",
 | 
						|
		"65ffffffffffff00",
 | 
						|
		"66ffffffffffffff00",
 | 
						|
		"67ffffffffffffffff00",
 | 
						|
		"68ffffffffffffffffff00",
 | 
						|
		"69ffffffffffffffffffff00",
 | 
						|
		"6affffffffffffffffffffff00",
 | 
						|
		"6bffffffffffffffffffffffff00",
 | 
						|
		"6cffffffffffffffffffffffffff00",
 | 
						|
		"6dffffffffffffffffffffffffffff00",
 | 
						|
		"6effffffffffffffffffffffffffffff00",
 | 
						|
		"6fffffffffffffffffffffffffffffffff00",
 | 
						|
		"70ffffffffffffffffffffffffffffffffff00",
 | 
						|
		"71ffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"72ffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"73ffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"74ffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"75ffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"76ffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"77ffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"78ffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"79ffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7affffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008000",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008100",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008200",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008300",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008400",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008500",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008600",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008700",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008800",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008900",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008a00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008b00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008c00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008d00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008e00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060008f00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009000",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009100",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009200",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009300",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009400",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009500",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009600",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009700",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009800",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009900",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009a00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009b00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009c00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009d00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009e00",
 | 
						|
		"60006000600060006000600060006000600060006000600060006000600060009f00",
 | 
						|
		"60006000a000",
 | 
						|
		"600060006000a100",
 | 
						|
		"6000600060006000a200",
 | 
						|
		"60006000600060006000a300",
 | 
						|
		"600060006000600060006000a400",
 | 
						|
		"600060006000f000",
 | 
						|
		"600060006000600060006000f100",
 | 
						|
		"600060006000600060006000f200",
 | 
						|
		"60006000f300",
 | 
						|
		"60006000600060006000f400",
 | 
						|
		"60006000600060006000fa00",
 | 
						|
		"60006000fd00",
 | 
						|
		"fe00",
 | 
						|
		"6000ff00"
 | 
						|
	};
 | 
						|
 | 
						|
	vector<string> opcodes_lll {
 | 
						|
		"(asm STOP)",
 | 
						|
		"(asm 0 0 ADD)",
 | 
						|
		"(asm 0 0 MUL)",
 | 
						|
		"(asm 0 0 SUB)",
 | 
						|
		"(asm 0 0 DIV)",
 | 
						|
		"(asm 0 0 SDIV)",
 | 
						|
		"(asm 0 0 MOD)",
 | 
						|
		"(asm 0 0 SMOD)",
 | 
						|
		"(asm 0 0 0 ADDMOD)",
 | 
						|
		"(asm 0 0 0 MULMOD)",
 | 
						|
		"(asm 0 0 EXP)",
 | 
						|
		"(asm 0 0 SIGNEXTEND)",
 | 
						|
		"(asm 0 0 LT)",
 | 
						|
		"(asm 0 0 GT)",
 | 
						|
		"(asm 0 0 SLT)",
 | 
						|
		"(asm 0 0 SGT)",
 | 
						|
		"(asm 0 0 EQ)",
 | 
						|
		"(asm 0 ISZERO)",
 | 
						|
		"(asm 0 0 AND)",
 | 
						|
		"(asm 0 0 OR)",
 | 
						|
		"(asm 0 0 XOR)",
 | 
						|
		"(asm 0 NOT)",
 | 
						|
		"(asm 0 0 BYTE)",
 | 
						|
		"(asm 0 0 KECCAK256)",
 | 
						|
		"(asm ADDRESS)",
 | 
						|
		"(asm 0 BALANCE)",
 | 
						|
		"(asm ORIGIN)",
 | 
						|
		"(asm CALLER)",
 | 
						|
		"(asm CALLVALUE)",
 | 
						|
		"(asm 0 CALLDATALOAD)",
 | 
						|
		"(asm CALLDATASIZE)",
 | 
						|
		"(asm 0 0 0 CALLDATACOPY)",
 | 
						|
		"(asm CODESIZE)",
 | 
						|
		"(asm 0 0 0 CODECOPY)",
 | 
						|
		"(asm GASPRICE)",
 | 
						|
		"(asm 0 EXTCODESIZE)",
 | 
						|
		"(asm 0 0 0 0 EXTCODECOPY)",
 | 
						|
		"(asm RETURNDATASIZE)",
 | 
						|
		"(asm 0 0 0 RETURNDATACOPY)",
 | 
						|
		"(asm 0 EXTCODEHASH)",
 | 
						|
		"(asm BLOCKHASH)",
 | 
						|
		"(asm COINBASE)",
 | 
						|
		"(asm TIMESTAMP)",
 | 
						|
		"(asm NUMBER)",
 | 
						|
		"(asm DIFFICULTY)",
 | 
						|
		"(asm GASLIMIT)",
 | 
						|
		"(asm 0 POP)",
 | 
						|
		"(asm 0 MLOAD)",
 | 
						|
		"(asm 0 0 MSTORE)",
 | 
						|
		"(asm 0 0 MSTORE8)",
 | 
						|
		"(asm 0 SLOAD)",
 | 
						|
		"(asm 0 0 SSTORE)",
 | 
						|
		"(asm 0 JUMP)",
 | 
						|
		"(asm 0 0 JUMPI)",
 | 
						|
		"(asm PC)",
 | 
						|
		"(asm MSIZE)",
 | 
						|
		"(asm GAS)",
 | 
						|
		"(asm JUMPDEST)",
 | 
						|
		"(asm 0xff)",
 | 
						|
		"(asm 0xffff)",
 | 
						|
		"(asm 0xffffff)",
 | 
						|
		"(asm 0xffffffff)",
 | 
						|
		"(asm 0xffffffffff)",
 | 
						|
		"(asm 0xffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP1)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP2)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP3)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP4)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP5)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP6)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP7)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP8)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP9)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP10)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP11)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP12)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP13)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP14)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP15)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 DUP16)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP1)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP2)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP3)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP4)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP5)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP6)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP7)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP8)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP9)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP10)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP11)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP12)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP13)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP14)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP15)",
 | 
						|
		"(asm 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SWAP16)",
 | 
						|
		"(asm 0 0 LOG0)",
 | 
						|
		"(asm 0 0 0 LOG1)",
 | 
						|
		"(asm 0 0 0 0 LOG2)",
 | 
						|
		"(asm 0 0 0 0 0 LOG3)",
 | 
						|
		"(asm 0 0 0 0 0 0 LOG4)",
 | 
						|
		"(asm 0 0 0 CREATE)",
 | 
						|
		"(asm 0 0 0 0 0 0 CALL)",
 | 
						|
		"(asm 0 0 0 0 0 0 CALLCODE)",
 | 
						|
		"(asm 0 0 RETURN)",
 | 
						|
		"(asm 0 0 0 0 0 DELEGATECALL)",
 | 
						|
		"(asm 0 0 0 0 0 STATICCALL)",
 | 
						|
		"(asm 0 0 REVERT)",
 | 
						|
		"(asm INVALID)",
 | 
						|
		"(asm 0 SELFDESTRUCT)"
 | 
						|
	};
 | 
						|
 | 
						|
	for (size_t i = 0; i < opcodes_bytecode.size(); i++)
 | 
						|
	{
 | 
						|
		vector<string> errors;
 | 
						|
		bytes code = lll::compileLLL(opcodes_lll[i], dev::test::Options::get().evmVersion(), false, &errors);
 | 
						|
 | 
						|
		BOOST_REQUIRE_MESSAGE(errors.empty(), opcodes_lll[i]);
 | 
						|
 | 
						|
		BOOST_CHECK_EQUAL(toHex(code), opcodes_bytecode[i]);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
BOOST_AUTO_TEST_SUITE_END()
 | 
						|
 | 
						|
}
 | 
						|
}
 | 
						|
} // end namespaces
 |