2018-08-08 19:25:04 +00:00
|
|
|
/*
|
|
|
|
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 2018
|
|
|
|
* Tests for the assembler.
|
|
|
|
*/
|
|
|
|
|
2020-01-06 10:52:23 +00:00
|
|
|
#include <libsolutil/JSON.h>
|
2018-08-08 19:25:04 +00:00
|
|
|
#include <libevmasm/Assembly.h>
|
|
|
|
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <tuple>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
using namespace std;
|
2019-12-23 15:50:30 +00:00
|
|
|
using namespace solidity::langutil;
|
|
|
|
using namespace solidity::evmasm;
|
2018-08-08 19:25:04 +00:00
|
|
|
|
2019-12-23 15:50:30 +00:00
|
|
|
namespace solidity::frontend::test
|
2018-08-08 19:25:04 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
2019-12-23 15:50:30 +00:00
|
|
|
void checkCompilation(evmasm::Assembly const& _assembly)
|
2018-08-08 19:25:04 +00:00
|
|
|
{
|
2018-08-09 08:14:47 +00:00
|
|
|
LinkerObject output = _assembly.assemble();
|
2018-08-08 19:25:04 +00:00
|
|
|
BOOST_CHECK(output.bytecode.size() > 0);
|
|
|
|
BOOST_CHECK(output.toHex().length() > 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE(Assembler)
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE(all_assembly_items)
|
|
|
|
{
|
2020-02-18 09:22:34 +00:00
|
|
|
map<string, unsigned> indices = {
|
|
|
|
{ "root.asm", 0 },
|
|
|
|
{ "sub.asm", 1 }
|
|
|
|
};
|
2018-08-09 08:14:47 +00:00
|
|
|
Assembly _assembly;
|
2020-02-04 19:37:51 +00:00
|
|
|
auto root_asm = make_shared<CharStream>("lorem ipsum", "root.asm");
|
2018-12-12 13:43:34 +00:00
|
|
|
_assembly.setSourceLocation({1, 3, root_asm});
|
2018-08-08 19:25:04 +00:00
|
|
|
|
|
|
|
Assembly _subAsm;
|
2020-02-04 19:37:51 +00:00
|
|
|
auto sub_asm = make_shared<CharStream>("lorem ipsum", "sub.asm");
|
2018-12-12 13:43:34 +00:00
|
|
|
_subAsm.setSourceLocation({6, 8, sub_asm});
|
2018-08-08 19:25:04 +00:00
|
|
|
_subAsm.append(Instruction::INVALID);
|
|
|
|
shared_ptr<Assembly> _subAsmPtr = make_shared<Assembly>(_subAsm);
|
|
|
|
|
|
|
|
// Tag
|
2018-08-09 08:14:47 +00:00
|
|
|
auto tag = _assembly.newTag();
|
|
|
|
_assembly.append(tag);
|
2018-08-08 19:25:04 +00:00
|
|
|
// Operation
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.append(u256(1));
|
|
|
|
_assembly.append(u256(2));
|
2018-08-08 19:25:04 +00:00
|
|
|
// Push
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.append(Instruction::KECCAK256);
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushProgramSize
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.appendProgramSize();
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushLibraryAddress
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.appendLibraryAddress("someLibrary");
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushTag + Operation
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.appendJump(tag);
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushData
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.append(bytes{0x1, 0x2, 0x3, 0x4});
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushSubSize
|
2018-08-09 08:14:47 +00:00
|
|
|
auto sub = _assembly.appendSubroutine(_subAsmPtr);
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushSub
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.pushSubroutineOffset(size_t(sub.data()));
|
2018-08-08 19:25:04 +00:00
|
|
|
// PushDeployTimeAddress
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.append(PushDeployTimeAddress);
|
2018-08-08 19:25:04 +00:00
|
|
|
// Operation
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.append(Instruction::STOP);
|
|
|
|
_assembly.appendAuxiliaryDataToEnd(bytes{0x42, 0x66});
|
|
|
|
_assembly.appendAuxiliaryDataToEnd(bytes{0xee, 0xaa});
|
|
|
|
|
|
|
|
checkCompilation(_assembly);
|
2018-08-08 19:25:04 +00:00
|
|
|
|
|
|
|
BOOST_CHECK_EQUAL(
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.assemble().toHex(),
|
2020-01-15 12:55:30 +00:00
|
|
|
"5b6001600220604673__$bf005014d9d0f534b8fcb268bd84c491a2$__"
|
|
|
|
"600056603e6001603d73000000000000000000000000000000000000000000fe"
|
2018-08-08 19:25:04 +00:00
|
|
|
"fe010203044266eeaa"
|
|
|
|
);
|
|
|
|
BOOST_CHECK_EQUAL(
|
2018-08-09 08:14:47 +00:00
|
|
|
_assembly.assemblyString(),
|
2018-08-08 19:25:04 +00:00
|
|
|
" /* \"root.asm\":1:3 */\n"
|
|
|
|
"tag_1:\n"
|
2018-12-05 21:11:31 +00:00
|
|
|
" keccak256(0x02, 0x01)\n"
|
2018-08-08 19:25:04 +00:00
|
|
|
" bytecodeSize\n"
|
|
|
|
" linkerSymbol(\"bf005014d9d0f534b8fcb268bd84c491a2380f4acd260d1ccfe9cd8201f7e994\")\n"
|
|
|
|
" jump(tag_1)\n"
|
|
|
|
" data_a6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b\n"
|
|
|
|
" dataSize(sub_0)\n"
|
|
|
|
" dataOffset(sub_0)\n"
|
|
|
|
" deployTimeAddress()\n"
|
|
|
|
" stop\n"
|
|
|
|
"stop\n"
|
|
|
|
"data_a6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b 01020304\n"
|
|
|
|
"\n"
|
|
|
|
"sub_0: assembly {\n"
|
|
|
|
" /* \"sub.asm\":6:8 */\n"
|
|
|
|
" invalid\n"
|
|
|
|
"}\n"
|
|
|
|
"\n"
|
|
|
|
"auxdata: 0x4266eeaa\n"
|
|
|
|
);
|
|
|
|
BOOST_CHECK_EQUAL(
|
2020-02-18 09:22:34 +00:00
|
|
|
util::jsonCompactPrint(_assembly.assemblyJSON(indices)),
|
|
|
|
"{\".auxdata\":\"4266eeaa\",\".code\":["
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"tag\",\"source\":0,\"value\":\"1\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"JUMPDEST\",\"source\":0},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSH\",\"source\":0,\"value\":\"1\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSH\",\"source\":0,\"value\":\"2\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"KECCAK256\",\"source\":0},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSHSIZE\",\"source\":0},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSHLIB\",\"source\":0,\"value\":\"someLibrary\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSH [tag]\",\"source\":0,\"value\":\"1\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"JUMP\",\"source\":0},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSH data\",\"source\":0,\"value\":\"A6885B3731702DA62E8E4A8F584AC46A7F6822F4E2BA50FBA902F67B1588D23B\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSH #[$]\",\"source\":0,\"value\":\"0000000000000000000000000000000000000000000000000000000000000000\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSH [$]\",\"source\":0,\"value\":\"0000000000000000000000000000000000000000000000000000000000000000\"},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"PUSHDEPLOYADDRESS\",\"source\":0},"
|
|
|
|
"{\"begin\":1,\"end\":3,\"name\":\"STOP\",\"source\":0}"
|
|
|
|
"],\".data\":{\"0\":{\".code\":[{\"begin\":6,\"end\":8,\"name\":\"INVALID\",\"source\":1}]},"
|
2018-08-08 19:25:04 +00:00
|
|
|
"\"A6885B3731702DA62E8E4A8F584AC46A7F6822F4E2BA50FBA902F67B1588D23B\":\"01020304\"}}"
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|
|
|
|
|
|
|
|
} // end namespaces
|