diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-04-15 12:36:31 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-04-15 13:23:33 +0000 |
| commit | b6f969371dc1e824c76636c0d3754a91b55d69b9 (patch) | |
| tree | 92dd3d2c06c03a9247b0da72c1f962841f5dd81d /executor/executor.cc | |
| parent | f887b0490140a0c80dd49d2c549ac57ac2adc2b9 (diff) | |
prog: more compact exec encoding for addresses
1. Don't write size/flags for addresses.
2. Write address w/o data offset (fewer bytes in leb128 encoding).
Median exec size shrinks by 25%:
- exec sizes: 10%:584 50%:1423 90%:7076
+ exec sizes: 10%:448 50%:1065 90%:6319
Diffstat (limited to 'executor/executor.cc')
| -rw-r--r-- | executor/executor.cc | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/executor/executor.cc b/executor/executor.cc index ba2fb4bff..4c24520e7 100644 --- a/executor/executor.cc +++ b/executor/executor.cc @@ -200,9 +200,11 @@ const uint64 instr_copyout = -3; const uint64 instr_setprops = -4; const uint64 arg_const = 0; -const uint64 arg_result = 1; -const uint64 arg_data = 2; -const uint64 arg_csum = 3; +const uint64 arg_addr32 = 1; +const uint64 arg_addr64 = 2; +const uint64 arg_result = 3; +const uint64 arg_data = 4; +const uint64 arg_csum = 5; const uint64 binary_format_native = 0; const uint64 binary_format_bigendian = 1; @@ -762,7 +764,7 @@ void execute_one() if (call_num == instr_eof) break; if (call_num == instr_copyin) { - char* addr = (char*)read_input(&input_pos); + char* addr = (char*)(read_input(&input_pos) + SYZ_DATA_OFFSET); uint64 typ = read_input(&input_pos); switch (typ) { case arg_const: { @@ -771,6 +773,15 @@ void execute_one() copyin(addr, arg, size, bf, bf_off, bf_len); break; } + case arg_addr32: + case arg_addr64: { + uint64 val = read_input(&input_pos) + SYZ_DATA_OFFSET; + if (typ == arg_addr32) + NONFAILING(*(uint32*)addr = val); + else + NONFAILING(*(uint64*)addr = val); + break; + } case arg_result: { uint64 meta = read_input(&input_pos); uint64 size = meta & 0xff; @@ -808,6 +819,7 @@ void execute_one() uint64 chunk_size = read_input(&input_pos); switch (chunk_kind) { case arg_csum_chunk_data: + chunk_value += SYZ_DATA_OFFSET; debug_verbose("#%lld: data chunk, addr: %llx, size: %llu\n", chunk, chunk_value, chunk_size); NONFAILING(csum_inet_update(&csum, (const uint8*)chunk_value, chunk_size)); @@ -1082,7 +1094,7 @@ void copyout_call_results(thread_t* th) uint64 index = read_input(&th->copyout_pos); if (index >= kMaxCommands) failmsg("result overflows kMaxCommands", "index=%lld", index); - char* addr = (char*)read_input(&th->copyout_pos); + char* addr = (char*)(read_input(&th->copyout_pos) + SYZ_DATA_OFFSET); uint64 size = read_input(&th->copyout_pos); uint64 val = 0; if (copyout(addr, size, &val)) { @@ -1434,6 +1446,10 @@ uint64 read_arg(uint8** input_posp) failmsg("bad argument bitfield", "off=%llu, len=%llu", bf_off, bf_len); return swap(val, size, bf); } + case arg_addr32: + case arg_addr64: { + return read_input(input_posp) + SYZ_DATA_OFFSET; + } case arg_result: { uint64 meta = read_input(input_posp); uint64 bf = meta >> 8; |
