Skip to content

Commit 138632b

Browse files
committed
cleanups
1 parent f594350 commit 138632b

8 files changed

+60
-34
lines changed

test/experimental/jumpdest_analysis.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
#include <cstring>
1010
#include <limits>
1111

12-
namespace evmone::experimental
12+
namespace evmone::exp::jda
1313
{
1414
JumpdestBitset jda_reference(bytes_view code)
1515
{
@@ -74,6 +74,24 @@ JumpdestBitset jda_speculate_push_data_size(bytes_view code)
7474
return m;
7575
}
7676

77+
JumpdestBitset jda_speculate_push_data_size2(bytes_view code)
78+
{
79+
JumpdestBitset m(code.size());
80+
for (size_t i = 0; i < code.size(); ++i)
81+
{
82+
const auto op = code[i];
83+
if (op < OP_JUMPDEST)
84+
continue;
85+
86+
const auto potential_push_data_len = get_push_data_size(op);
87+
if (potential_push_data_len <= 32)
88+
i += potential_push_data_len;
89+
else if (op == OP_JUMPDEST) [[unlikely]]
90+
m[i] = true;
91+
}
92+
return m;
93+
}
94+
7795
JumpdestBitset build_jumpdest_map_sttni(bytes_view code)
7896
{
7997
const auto code_size = code.size();

test/experimental/jumpdest_analysis.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
// evmone: Fast Ethereum Virtual Machine implementation
22
// Copyright 2020 The evmone Authors.
33
// SPDX-License-Identifier: Apache-2.0
4+
#pragma once
45

56
#include <evmone/baseline.hpp>
67
#include <cstdint>
78
#include <memory>
89
#include <vector>
910

10-
namespace evmone::experimental
11+
namespace evmone::exp::jda
1112
{
1213
class JumpdestBitset : std::vector<bool>
1314
{
@@ -65,6 +66,7 @@ class bitset32
6566

6667
JumpdestBitset jda_reference(bytes_view code);
6768
JumpdestBitset jda_speculate_push_data_size(bytes_view code);
69+
JumpdestBitset jda_speculate_push_data_size2(bytes_view code);
6870
JumpdestBitset build_jumpdest_map_sttni(bytes_view code);
6971
std::vector<bool> build_jumpdest_map_str_avx2(const uint8_t* code, size_t code_size);
7072
std::vector<bool> build_jumpdest_map_str_avx2_mask(const uint8_t* code, size_t code_size);
@@ -80,4 +82,4 @@ std::unique_ptr<uint8_t[]> build_internal_code_v2(const uint8_t* code, size_t co
8082
std::unique_ptr<uint8_t[]> build_internal_code_v3(const uint8_t* code, size_t code_size);
8183
std::unique_ptr<uint8_t[]> build_internal_code_v4(const uint8_t* code, size_t code_size);
8284
std::unique_ptr<uint8_t[]> build_internal_code_v8(const uint8_t* code, size_t code_size);
83-
} // namespace evmone::experimental
85+
} // namespace evmone::exp::jda

test/experimental/opcode_manip.hpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// evmone: Fast Ethereum Virtual Machine implementation
22
// Copyright 2020 The evmone Authors.
33
// SPDX-License-Identifier: Apache-2.0
4+
#pragma once
45

56
#include <evmone/instructions_opcodes.hpp>
67
#include <cstdint>
78

8-
namespace evmone::experimental
9+
namespace evmone::exp
910
{
1011
inline constexpr bool is_push(uint8_t op) noexcept
1112
{
@@ -72,4 +73,4 @@ inline int find_first_push_opt3(const uint8_t* code) noexcept
7273
auto z2 = z / 8;
7374
return z2;
7475
}
75-
} // namespace evmone::experimental
76+
} // namespace evmone::exp

test/fuzzer/jumpdest_analysis_fuzz.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
using namespace evmone;
10-
using namespace evmone::experimental;
10+
using namespace evmone::exp::jda;
1111

1212
namespace
1313
{

test/internal_benchmarks/analysis_bench.cpp

+19-19
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ enum : uint8_t
2929

3030
[[gnu::noinline]] auto build_bitset2(const uint8_t* code, size_t code_size)
3131
{
32-
evmone::experimental::JumpdestMap m(code_size);
32+
evmone::exp::jda::JumpdestMap m(code_size);
3333
for (size_t i = 0; i < code_size; ++i)
3434
{
3535
const auto op = code[i];
@@ -302,7 +302,7 @@ void build_jumpdest(benchmark::State& state)
302302
}
303303

304304
using namespace evmone;
305-
using namespace evmone::experimental;
305+
using namespace evmone::exp::jda;
306306
using namespace benchmark;
307307

308308
template <typename ResultT, ResultT AnalyzeFn(bytes_view)>
@@ -328,35 +328,35 @@ void jumpdest_analysis(State& state)
328328
BENCHMARK(jumpdest_analysis<JumpdestBitset, jda_reference>) ARGS;
329329
BENCHMARK(jumpdest_analysis<JumpdestBitset, build_jumpdest_map_sttni>) ARGS;
330330
BENCHMARK(jumpdest_analysis<JumpdestBitset, jda_speculate_push_data_size>) ARGS;
331+
BENCHMARK(jumpdest_analysis<JumpdestBitset, jda_speculate_push_data_size2>) ARGS;
331332

332-
BENCHMARK_TEMPLATE(build_jumpdest, evmone::experimental::JumpdestMap,
333-
evmone::experimental::build_jumpdest_map_bitset1)
333+
BENCHMARK_TEMPLATE(
334+
build_jumpdest, evmone::exp::jda::JumpdestMap, evmone::exp::jda::build_jumpdest_map_bitset1)
334335
ARGS;
335-
BENCHMARK_TEMPLATE(build_jumpdest, evmone::experimental::JumpdestMap, build_bitset2) ARGS;
336+
BENCHMARK_TEMPLATE(build_jumpdest, evmone::exp::jda::JumpdestMap, build_bitset2) ARGS;
336337
BENCHMARK_TEMPLATE(build_jumpdest, std::vector<bool>, build_vec) ARGS;
337-
BENCHMARK_TEMPLATE(
338-
build_jumpdest, std::vector<bool>, evmone::experimental::build_jumpdest_map_str_avx2)
338+
BENCHMARK_TEMPLATE(build_jumpdest, std::vector<bool>, evmone::exp::jda::build_jumpdest_map_str_avx2)
339339
ARGS;
340340
BENCHMARK_TEMPLATE(
341-
build_jumpdest, std::vector<bool>, evmone::experimental::build_jumpdest_map_str_avx2_mask)
341+
build_jumpdest, std::vector<bool>, evmone::exp::jda::build_jumpdest_map_str_avx2_mask)
342342
ARGS;
343343
BENCHMARK_TEMPLATE(
344-
build_jumpdest, std::vector<bool>, evmone::experimental::build_jumpdest_map_str_avx2_mask_v2)
344+
build_jumpdest, std::vector<bool>, evmone::exp::jda::build_jumpdest_map_str_avx2_mask_v2)
345345
ARGS;
346346
BENCHMARK_TEMPLATE(
347-
build_jumpdest, std::vector<bool>, evmone::experimental::build_jumpdest_map_str_avx2_mask2)
347+
build_jumpdest, std::vector<bool>, evmone::exp::jda::build_jumpdest_map_str_avx2_mask2)
348348
ARGS;
349349
BENCHMARK_TEMPLATE(
350-
build_jumpdest, evmone::experimental::bitset32, evmone::experimental::build_jumpdest_map_simd1)
350+
build_jumpdest, evmone::exp::jda::bitset32, evmone::exp::jda::build_jumpdest_map_simd1)
351351
ARGS;
352352
BENCHMARK_TEMPLATE(
353-
build_jumpdest, evmone::experimental::bitset32, evmone::experimental::build_jumpdest_map_simd2)
353+
build_jumpdest, evmone::exp::jda::bitset32, evmone::exp::jda::build_jumpdest_map_simd2)
354354
ARGS;
355355
BENCHMARK_TEMPLATE(
356-
build_jumpdest, evmone::experimental::bitset32, evmone::experimental::build_jumpdest_map_simd3)
356+
build_jumpdest, evmone::exp::jda::bitset32, evmone::exp::jda::build_jumpdest_map_simd3)
357357
ARGS;
358358
BENCHMARK_TEMPLATE(
359-
build_jumpdest, evmone::experimental::bitset32, evmone::experimental::build_jumpdest_map_simd4)
359+
build_jumpdest, evmone::exp::jda::bitset32, evmone::exp::jda::build_jumpdest_map_simd4)
360360
ARGS;
361361
BENCHMARK_TEMPLATE(build_jumpdest, std::vector<bool>, build_vec3) ARGS;
362362
BENCHMARK_TEMPLATE(build_jumpdest, std::vector<bool>, build_vec4) ARGS;
@@ -365,19 +365,19 @@ BENCHMARK_TEMPLATE(build_jumpdest, std::vector<bool>, build_vec6) ARGS;
365365
BENCHMARK_TEMPLATE(build_jumpdest, std::vector<bool>, build_vec7) ARGS;
366366
BENCHMARK_TEMPLATE(build_jumpdest, std::vector<uint8_t>, build_bytes) ARGS;
367367
BENCHMARK_TEMPLATE(
368-
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::experimental::build_internal_code_v1)
368+
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::exp::jda::build_internal_code_v1)
369369
ARGS;
370370
BENCHMARK_TEMPLATE(
371-
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::experimental::build_internal_code_v2)
371+
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::exp::jda::build_internal_code_v2)
372372
ARGS;
373373
BENCHMARK_TEMPLATE(
374-
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::experimental::build_internal_code_v3)
374+
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::exp::jda::build_internal_code_v3)
375375
ARGS;
376376
BENCHMARK_TEMPLATE(
377-
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::experimental::build_internal_code_v4)
377+
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::exp::jda::build_internal_code_v4)
378378
ARGS;
379379
BENCHMARK_TEMPLATE(
380-
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::experimental::build_internal_code_v8)
380+
build_jumpdest, std::unique_ptr<uint8_t[]>, evmone::exp::jda::build_internal_code_v8)
381381
ARGS;
382382
BENCHMARK_TEMPLATE(build_jumpdest, std::unique_ptr<uint8_t[]>, build_shadow_code2p) ARGS;
383383
BENCHMARK_TEMPLATE(build_jumpdest, std::unique_ptr<uint8_t[]>, build_shadow_code3p) ARGS;

test/internal_benchmarks/test_bytecodes.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace evmone::test
88
{
99
// https://dune.com/queries/3700178
10-
const std::array test_bytecodes{
10+
const std::array<bytes, 10> test_bytecodes{
1111

1212
// WETH:
1313
"0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"_hex,

test/unittests/jumpdest_analysis_test.cpp

+12-7
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <gtest/gtest.h>
99

1010
using namespace evmone;
11-
using namespace evmone::experimental;
11+
using namespace evmone::exp::jda;
1212
using namespace evmone::test;
1313

1414
namespace
@@ -26,12 +26,16 @@ bool is_jumpdest(const bitset32& a, size_t index) noexcept
2626
}
2727

2828
const bytecode bytecode_test_cases[]{
29-
{},
29+
bytecode{},
3030
push(0x5b),
3131
OP_JUMPDEST,
3232
push(0),
3333
push(0x5b) + OP_JUMPDEST,
3434
push(0x60) + OP_JUMPDEST,
35+
bytecode{"00"} + OP_JUMPDEST,
36+
bytecode{"80"} + OP_JUMPDEST,
37+
bytecode{"5f"} + OP_JUMPDEST,
38+
bytecode{"ff"} + OP_JUMPDEST,
3539
"5b000000000000000000000000000000",
3640
"005b0000000000000000000000000000",
3741
"605b00605b000000000000000000000000000000000000000000000000000000",
@@ -58,20 +62,22 @@ template <typename>
5862
class jumpdest_analysis_test : public testing::Test
5963
{};
6064
using test_types = testing::Types<I<baseline::CodeAnalysis, baseline_analyze>,
61-
I<JumpdestBitset, jda_speculate_push_data_size>, I<JumpdestBitset, build_jumpdest_map_sttni>>;
65+
I<JumpdestBitset, jda_speculate_push_data_size>,
66+
I<JumpdestBitset, jda_speculate_push_data_size2>, I<JumpdestBitset, build_jumpdest_map_sttni>>;
6267
TYPED_TEST_SUITE(jumpdest_analysis_test, test_types);
6368

6469
TYPED_TEST(jumpdest_analysis_test, validate)
6570
{
66-
for (const auto& code : bytecode_test_cases)
71+
for (size_t t = 0; t < std::size(bytecode_test_cases); ++t)
6772
{
73+
const auto& code = bytecode_test_cases[t];
6874
const auto expected = jda_reference(code);
6975
const auto analysis = TypeParam::analyze(code);
7076

7177
for (size_t i = 0; i < code.size() + CODE_PADDING_CHECK_SIZE; ++i)
7278
{
73-
SCOPED_TRACE(i);
74-
EXPECT_EQ(analysis.check_jumpdest(i), expected.check_jumpdest(i));
79+
EXPECT_EQ(analysis.check_jumpdest(i), expected.check_jumpdest(i))
80+
<< t << "[" << i << "]";
7581
}
7682
}
7783
}
@@ -85,7 +91,6 @@ TEST(jumpdest_analysis, compare_implementations)
8591
const auto data_size = t.size();
8692

8793
const auto a0 = jda_reference(t);
88-
const auto v2 = jda_speculate_push_data_size(data);
8994
const auto v4 = build_jumpdest_map_str_avx2(data, data_size);
9095
const auto v5 = build_jumpdest_map_str_avx2_mask(data, data_size);
9196
const auto v5a = build_jumpdest_map_str_avx2_mask_v2(data, data_size);

test/unittests/opcode_manip_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#include "test/utils/bytecode.hpp"
77
#include <gtest/gtest.h>
88

9-
using namespace evmone::experimental;
9+
using namespace evmone::exp;
1010
using namespace evmone::test;
1111

1212
TEST(opcode_manip, find_first_push)

0 commit comments

Comments
 (0)