diff options
author | Ben Smith <binjimin@gmail.com> | 2016-07-20 15:53:01 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-20 15:53:01 -0700 |
commit | 1347a367c34876bfe92562f244a8c8b770372479 (patch) | |
tree | cbd68bdaf12408e57864dece701d3aa9b86a7712 /src/wasm-binary-reader.c | |
parent | 5910843c4c03f803f7b76a69e19049cc36d3fbfb (diff) | |
download | wabt-1347a367c34876bfe92562f244a8c8b770372479.tar.gz wabt-1347a367c34876bfe92562f244a8c8b770372479.tar.bz2 wabt-1347a367c34876bfe92562f244a8c8b770372479.zip |
use the wasm-wast verbose flag (#94)
The `--verbose` flag has been there for a while, but wasn't hooked up to
anything. Now it displays info while reading from the binary file, which
could be useful for debugging.
Diffstat (limited to 'src/wasm-binary-reader.c')
-rw-r--r-- | src/wasm-binary-reader.c | 755 |
1 files changed, 754 insertions, 1 deletions
diff --git a/src/wasm-binary-reader.c b/src/wasm-binary-reader.c index e39e1c80..3d1cd6c0 100644 --- a/src/wasm-binary-reader.c +++ b/src/wasm-binary-reader.c @@ -17,6 +17,7 @@ #include "wasm-binary-reader.h" #include <assert.h> +#include <inttypes.h> #include <setjmp.h> #include <stdarg.h> #include <stdint.h> @@ -26,12 +27,15 @@ #include "wasm-allocator.h" #include "wasm-binary.h" #include "wasm-config.h" +#include "wasm-stream.h" #include "wasm-vector.h" #if HAVE_ALLOCA #include <alloca.h> #endif +#define INDENT_SIZE 2 + #define INITIAL_PARAM_TYPES_CAPACITY 128 #define INITIAL_BR_TABLE_TARGET_CAPACITY 1000 @@ -54,6 +58,15 @@ WASM_DEFINE_VECTOR(uint32, Uint32); : WASM_OK), \ #member " callback failed") +#define FORWARD0(member) \ + return ctx->reader->member ? ctx->reader->member(ctx->reader->user_data) \ + : WASM_OK + +#define FORWARD(member, ...) \ + return ctx->reader->member \ + ? ctx->reader->member(__VA_ARGS__, ctx->reader->user_data) \ + : WASM_OK + #define RAISE_ERROR(...) \ (ctx->reader->on_error ? raise_error(ctx, __VA_ARGS__) : (void)0) @@ -61,6 +74,13 @@ WASM_DEFINE_VECTOR(uint32, Uint32); if (!(cond)) \ RAISE_ERROR(__VA_ARGS__); +static const char* s_type_names[] = {"void", "i32", "i64", "f32", "f64"}; +WASM_STATIC_ASSERT(WASM_ARRAY_SIZE(s_type_names) == WASM_NUM_TYPES); + +#define V(rtype, type1, type2, mem_size, code, NAME, text) [code] = text, +static const char* s_opcode_name[] = {WASM_FOREACH_OPCODE(V)}; +#undef V + /* clang-format off */ enum { #define V(name) WASM_SECTION_INDEX_##name, @@ -80,6 +100,12 @@ typedef struct Context { Uint32Vector target_depths; } Context; +typedef struct LoggingContext { + WasmStream* stream; + WasmBinaryReader* reader; + int indent; +} LoggingContext; + static void WASM_PRINTF_FORMAT(2, 3) raise_error(Context* ctx, const char* format, ...) { WASM_SNPRINTF_ALLOCA(buffer, length, format); @@ -352,19 +378,746 @@ static void destroy_context(WasmAllocator* allocator, Context* ctx) { wasm_destroy_uint32_vector(allocator, &ctx->target_depths); } + +/* Logging */ + +static void indent(LoggingContext* ctx) { + ctx->indent += INDENT_SIZE; +} + +static void dedent(LoggingContext* ctx) { + ctx->indent -= INDENT_SIZE; + assert(ctx->indent >= 0); +} +static void write_indent(LoggingContext* ctx) { + static char s_indent[] = + " " + " "; + static size_t s_indent_len = sizeof(s_indent) - 1; + size_t indent = ctx->indent; + while (indent > s_indent_len) { + wasm_write_data(ctx->stream, s_indent, s_indent_len, NULL); + indent -= s_indent_len; + } + if (indent > 0) { + wasm_write_data(ctx->stream, s_indent, indent, NULL); + } +} + +#define LOGF_NOINDENT(...) wasm_writef(ctx->stream, __VA_ARGS__) + +#define LOGF(...) \ + do { \ + write_indent(ctx); \ + LOGF_NOINDENT(__VA_ARGS__); \ + } while (0) + +static void logging_on_error(uint32_t offset, + const char* message, + void* user_data) { + LoggingContext* ctx = user_data; + FORWARD(on_error, offset, message); +} + +static WasmResult logging_begin_module(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_module\n"); + indent(ctx); + FORWARD0(begin_module); +} + +static WasmResult logging_end_module(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_module\n"); + FORWARD0(end_module); +} + +static WasmResult logging_begin_memory_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_memory_section\n"); + indent(ctx); + FORWARD0(begin_memory_section); +} + +static WasmResult logging_on_memory_initial_size_pages(uint32_t pages, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_memory_initial_size_pages(%u)\n", pages); + FORWARD(on_memory_initial_size_pages, pages); +} + +static WasmResult logging_on_memory_max_size_pages(uint32_t pages, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_memory_max_size_pages(%u)\n", pages); + FORWARD(on_memory_max_size_pages, pages); +} + +static WasmResult logging_on_memory_exported(WasmBool exported, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_memory_exported(%u)\n", exported); + FORWARD(on_memory_exported, exported); +} + +static WasmResult logging_end_memory_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_memory_section\n"); + FORWARD0(end_memory_section); +} + +static WasmResult logging_begin_data_segment_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_data_segment_section\n"); + indent(ctx); + FORWARD0(begin_data_segment_section); +} + +static WasmResult logging_on_data_segment_count(uint32_t count, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_data_segment_count(%u)\n", count); + FORWARD(on_data_segment_count, count); +} + +static WasmResult logging_on_data_segment(uint32_t index, + uint32_t address, + const void* data, + uint32_t size, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_data_segment(index:%u, address:%u, size:%u)\n", index, address, + size); + FORWARD(on_data_segment, index, address, data, size); +} + +static WasmResult logging_end_data_segment_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_data_segment_section\n"); + FORWARD0(end_data_segment_section); +} + +static WasmResult logging_begin_signature_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_signature_section\n"); + indent(ctx); + FORWARD0(begin_signature_section); +} + +static WasmResult logging_on_signature_count(uint32_t count, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_signature_count(%u)\n", count); + FORWARD(on_signature_count, count); +} + +static WasmResult logging_on_signature(uint32_t index, + WasmType result_type, + uint32_t param_count, + WasmType* param_types, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_signature(index: %u, %s (", index, s_type_names[result_type]); + uint32_t i; + for (i = 0; i < param_count; ++i) { + LOGF_NOINDENT("%s", s_type_names[result_type]); + if (i != param_count - 1) + LOGF_NOINDENT(", "); + } + LOGF_NOINDENT("))\n"); + FORWARD(on_signature, index, result_type, param_count, param_types); +} + +static WasmResult logging_end_signature_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_signature_section\n"); + FORWARD0(end_signature_section); +} + +static WasmResult logging_begin_import_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_import_section\n"); + indent(ctx); + FORWARD0(begin_import_section); +} + +static WasmResult logging_on_import_count(uint32_t count, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_import_count(%u)\n", count); + FORWARD(on_import_count, count); +} + +static WasmResult logging_on_import(uint32_t index, + uint32_t sig_index, + WasmStringSlice module_name, + WasmStringSlice function_name, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_import(index: %u, sig_index: %u, module: \"" PRIstringslice + "\", function: \"" PRIstringslice "\")\n", + index, sig_index, WASM_PRINTF_STRING_SLICE_ARG(module_name), + WASM_PRINTF_STRING_SLICE_ARG(function_name)); + FORWARD(on_import, index, sig_index, module_name, function_name); +} + +static WasmResult logging_end_import_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_import_section\n"); + FORWARD0(end_import_section); +} + +static WasmResult logging_begin_function_signatures_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_function_signatures_section\n"); + indent(ctx); + FORWARD0(begin_function_signatures_section); +} + +static WasmResult logging_on_function_signatures_count(uint32_t count, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_signatures_count(%u)\n", count); + FORWARD(on_function_signatures_count, count); +} + +static WasmResult logging_on_function_signature(uint32_t index, + uint32_t sig_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_signature(index: %u, sig_index: %u)\n", index, sig_index); + FORWARD(on_function_signature, index, sig_index); +} + +static WasmResult logging_end_function_signatures_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_function_signatures_section\n"); + FORWARD0(end_function_signatures_section); +} + +static WasmResult logging_begin_function_bodies_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_function_bodies_section\n"); + indent(ctx); + FORWARD0(begin_function_bodies_section); +} + +static WasmResult logging_on_function_bodies_count(uint32_t count, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_bodies_count(%u)\n", count); + FORWARD(on_function_bodies_count, count); +} + +static WasmResult logging_begin_function_body_pass(uint32_t index, + uint32_t pass, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_function_body_pass(index: %u, pass: %u)\n", index, pass); + indent(ctx); + FORWARD(begin_function_body_pass, index, pass); +} + +static WasmResult logging_begin_function_body(uint32_t index, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_function_body(%u)\n", index); + indent(ctx); + FORWARD(begin_function_body, index); +} + +static WasmResult logging_on_local_decl_count(uint32_t count, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_local_decl_count(%u)\n", count); + FORWARD(on_local_decl_count, count); +} + +static WasmResult logging_on_local_decl(uint32_t decl_index, + uint32_t count, + WasmType type, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_local_decl(index: %u, count: %u, type: %s)\n", decl_index, count, + s_type_names[type]); + FORWARD(on_local_decl, decl_index, count, type); +} + +static WasmResult logging_on_binary_expr(WasmOpcode opcode, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_binary_expr(\"%s\" (%u))\n", s_opcode_name[opcode], opcode); + FORWARD(on_binary_expr, opcode); +} + +static WasmResult logging_on_block_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_block_expr\n"); + FORWARD0(on_block_expr); +} + +static WasmResult logging_on_br_expr(uint8_t arity, + uint32_t depth, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_br_expr(arity: %u, depth: %u)\n", arity, depth); + FORWARD(on_br_expr, arity, depth); +} + +static WasmResult logging_on_br_if_expr(uint8_t arity, + uint32_t depth, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_br_if_expr(arity: %u, depth: %u)\n", arity, depth); + FORWARD(on_br_if_expr, arity, depth); +} + +static WasmResult logging_on_br_table_expr(uint8_t arity, + uint32_t num_targets, + uint32_t* target_depths, + uint32_t default_target_depth, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_br_table_expr(arity: %u, num_targets: %u, depths: [", arity, + num_targets); + uint32_t i; + for (i = 0; i < num_targets; ++i) { + LOGF_NOINDENT("%u", target_depths[i]); + if (i != num_targets - 1) + LOGF_NOINDENT(", "); + } + LOGF_NOINDENT("], default: %u)\n", default_target_depth); + FORWARD(on_br_table_expr, arity, num_targets, target_depths, + default_target_depth); +} + +static WasmResult logging_on_call_expr(uint32_t arity, + uint32_t func_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_call_expr(arity: %u, func_index: %u)\n", arity, func_index); + FORWARD(on_call_expr, arity, func_index); +} + +static WasmResult logging_on_call_import_expr(uint32_t arity, + uint32_t import_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_call_import_expr(arity: %u, import_index: %u)\n", arity, + import_index); + FORWARD(on_call_import_expr, arity, import_index); +} + +static WasmResult logging_on_call_indirect_expr(uint32_t arity, + uint32_t sig_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_call_indirect_expr(arity: %u, sig_index: %u)\n", arity, + sig_index); + FORWARD(on_call_indirect_expr, arity, sig_index); +} + +static WasmResult logging_on_compare_expr(WasmOpcode opcode, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_compare_expr(\"%s\" (%u))\n", s_opcode_name[opcode], opcode); + FORWARD(on_compare_expr, opcode); +} + +static WasmResult logging_on_convert_expr(WasmOpcode opcode, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_convert_expr(\"%s\" (%u))\n", s_opcode_name[opcode], opcode); + FORWARD(on_convert_expr, opcode); +} + +static WasmResult logging_on_else_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_else_expr\n"); + FORWARD0(on_else_expr); +} + +static WasmResult logging_on_end_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_end_expr\n"); + FORWARD0(on_end_expr); +} + +static WasmResult logging_on_f32_const_expr(uint32_t value_bits, + void* user_data) { + LoggingContext* ctx = user_data; + float value; + memcpy(&value, &value_bits, sizeof(value)); + LOGF("on_f32_const_expr(%g (0x04%x))\n", value, value_bits); + FORWARD(on_f32_const_expr, value_bits); +} + +static WasmResult logging_on_f64_const_expr(uint64_t value_bits, + void* user_data) { + LoggingContext* ctx = user_data; + float value; + memcpy(&value, &value_bits, sizeof(value)); + LOGF("on_f64_const_expr(%g (0x08%" PRIx64 "))\n", value, value_bits); + FORWARD(on_f64_const_expr, value_bits); +} + +static WasmResult logging_on_get_local_expr(uint32_t local_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_get_local_expr(index: %u)\n", local_index); + FORWARD(on_get_local_expr, local_index); +} + +static WasmResult logging_on_grow_memory_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_grow_memory_expr\n"); + FORWARD0(on_grow_memory_expr); +} + +static WasmResult logging_on_i32_const_expr(uint32_t value, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_i32_const_expr(%u (0x%x))\n", value, value); + FORWARD(on_i32_const_expr, value); +} + +static WasmResult logging_on_i64_const_expr(uint64_t value, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_i64_const_expr(%" PRIu64 " (0x%" PRIx64 "))\n", value, value); + FORWARD(on_i64_const_expr, value); +} + +static WasmResult logging_on_if_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_if_expr\n"); + FORWARD0(on_if_expr); +} + +static WasmResult logging_on_load_expr(WasmOpcode opcode, + uint32_t alignment_log2, + uint32_t offset, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_load_expr(opcode: \"%s\" (%u), align log2: %u, offset: %u)\n", + s_opcode_name[opcode], opcode, alignment_log2, offset); + FORWARD(on_load_expr, opcode, alignment_log2, offset); +} + +static WasmResult logging_on_loop_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_loop_expr\n"); + FORWARD0(on_loop_expr); +} + +static WasmResult logging_on_current_memory_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_current_memory_expr\n"); + FORWARD0(on_current_memory_expr); +} + +static WasmResult logging_on_nop_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_nop_expr\n"); + FORWARD0(on_nop_expr); +} + +static WasmResult logging_on_return_expr(uint8_t arity, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_return_expr(%u)\n", arity); + FORWARD(on_return_expr, arity); +} + +static WasmResult logging_on_select_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_select_expr\n"); + FORWARD0(on_select_expr); +} + +static WasmResult logging_on_set_local_expr(uint32_t local_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_set_local_expr(index: %u)\n", local_index); + FORWARD(on_set_local_expr, local_index); +} + +static WasmResult logging_on_store_expr(WasmOpcode opcode, + uint32_t alignment_log2, + uint32_t offset, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_store_expr(opcode: \"%s\" (%u), align log2: %u, offset: %u)\n", + s_opcode_name[opcode], opcode, alignment_log2, offset); + FORWARD(on_store_expr, opcode, alignment_log2, offset); +} + +static WasmResult logging_on_unary_expr(WasmOpcode opcode, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_unary_expr(\"%s\" (%u))\n", s_opcode_name[opcode], opcode); + FORWARD(on_unary_expr, opcode); +} + +static WasmResult logging_on_unreachable_expr(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_unreachable_expr\n"); + FORWARD0(on_unreachable_expr); +} + +static WasmResult logging_end_function_body(uint32_t index, void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_function_body(%u)\n", index); + FORWARD(end_function_body, index); +} + +static WasmResult logging_end_function_body_pass(uint32_t index, + uint32_t pass, + void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_function_body_pass(index: %u, pass: %u)\n", index, pass); + FORWARD(end_function_body_pass, index, pass); +} + +static WasmResult logging_end_function_bodies_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_function_bodies_section\n"); + FORWARD0(end_function_bodies_section); +} + +static WasmResult logging_begin_function_table_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_function_table_section\n"); + indent(ctx); + FORWARD0(begin_function_table_section); +} + +static WasmResult logging_on_function_table_count(uint32_t count, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_table_count(%u)\n", count); + FORWARD(on_function_table_count, count); +} + +static WasmResult logging_on_function_table_entry(uint32_t index, + uint32_t func_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_table_entry(index: %u, func_index: %u)\n", index, + func_index); + FORWARD(on_function_table_entry, index, func_index); +} + +static WasmResult logging_end_function_table_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_function_table_section\n"); + FORWARD0(end_function_table_section); +} + +static WasmResult logging_begin_start_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_start_section\n"); + indent(ctx); + FORWARD0(begin_start_section); +} + +static WasmResult logging_on_start_function(uint32_t func_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_start_function(func_index: %u)\n", func_index); + FORWARD(on_start_function, func_index); +} + +static WasmResult logging_end_start_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_start_section\n"); + FORWARD0(end_start_section); +} + +static WasmResult logging_begin_export_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_export_section\n"); + indent(ctx); + FORWARD0(begin_export_section); +} + +static WasmResult logging_on_export_count(uint32_t count, void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_export_count(%u)\n", count); + FORWARD(on_export_count, count); +} + +static WasmResult logging_on_export(uint32_t index, + uint32_t func_index, + WasmStringSlice name, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_export(index: %u, func_index: %u, name: \"" PRIstringslice "\")\n", + index, func_index, WASM_PRINTF_STRING_SLICE_ARG(name)); + FORWARD(on_export, index, func_index, name); +} + +static WasmResult logging_end_export_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_export_section\n"); + FORWARD0(end_export_section); +} + +static WasmResult logging_begin_names_section(void* user_data) { + LoggingContext* ctx = user_data; + LOGF("begin_names_section\n"); + indent(ctx); + FORWARD0(begin_names_section); +} + +static WasmResult logging_on_function_names_count(uint32_t count, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_names_count(%u)\n", count); + FORWARD(on_function_names_count, count); +} + +static WasmResult logging_on_function_name(uint32_t index, + WasmStringSlice name, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_function_name(index: %u, name: \"" PRIstringslice "\")\n", index, + WASM_PRINTF_STRING_SLICE_ARG(name)); + FORWARD(on_function_name, index, name); +} + +static WasmResult logging_on_local_names_count(uint32_t index, + uint32_t count, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_local_names_count(index: %u, count: %u)\n", index, count); + FORWARD(on_local_names_count, index, count); +} + +static WasmResult logging_on_local_name(uint32_t func_index, + uint32_t local_index, + WasmStringSlice name, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_local_name(func_index: %u, local_index: %u, name: \"" PRIstringslice + "\")\n", + func_index, local_index, WASM_PRINTF_STRING_SLICE_ARG(name)); + FORWARD(on_local_name, func_index, local_index, name); +} + +static WasmResult logging_end_names_section(void* user_data) { + LoggingContext* ctx = user_data; + dedent(ctx); + LOGF("end_names_section\n"); + FORWARD0(end_names_section); +} + +static WasmBinaryReader s_logging_binary_reader = { + .user_data = NULL, + .on_error = &logging_on_error, + .begin_module = &logging_begin_module, + .end_module = &logging_end_module, + .begin_memory_section = &logging_begin_memory_section, + .on_memory_initial_size_pages = &logging_on_memory_initial_size_pages, + .on_memory_max_size_pages = &logging_on_memory_max_size_pages, + .on_memory_exported = &logging_on_memory_exported, + .end_memory_section = &logging_end_memory_section, + .begin_data_segment_section = &logging_begin_data_segment_section, + .on_data_segment_count = &logging_on_data_segment_count, + .on_data_segment = &logging_on_data_segment, + .end_data_segment_section = &logging_end_data_segment_section, + .begin_signature_section = &logging_begin_signature_section, + .on_signature_count = &logging_on_signature_count, + .on_signature = &logging_on_signature, + .end_signature_section = &logging_end_signature_section, + .begin_import_section = &logging_begin_import_section, + .on_import_count = &logging_on_import_count, + .on_import = &logging_on_import, + .end_import_section = &logging_end_import_section, + .begin_function_signatures_section = + &logging_begin_function_signatures_section, + .on_function_signatures_count = &logging_on_function_signatures_count, + .on_function_signature = &logging_on_function_signature, + .end_function_signatures_section = &logging_end_function_signatures_section, + .begin_function_bodies_section = &logging_begin_function_bodies_section, + .on_function_bodies_count = &logging_on_function_bodies_count, + .begin_function_body_pass = &logging_begin_function_body_pass, + .begin_function_body = &logging_begin_function_body, + .on_local_decl_count = &logging_on_local_decl_count, + .on_local_decl = &logging_on_local_decl, + .on_binary_expr = &logging_on_binary_expr, + .on_block_expr = &logging_on_block_expr, + .on_br_expr = &logging_on_br_expr, + .on_br_if_expr = &logging_on_br_if_expr, + .on_br_table_expr = &logging_on_br_table_expr, + .on_call_expr = &logging_on_call_expr, + .on_call_import_expr = &logging_on_call_import_expr, + .on_call_indirect_expr = &logging_on_call_indirect_expr, + .on_compare_expr = &logging_on_compare_expr, + .on_convert_expr = &logging_on_convert_expr, + .on_else_expr = &logging_on_else_expr, + .on_end_expr = &logging_on_end_expr, + .on_f32_const_expr = &logging_on_f32_const_expr, + .on_f64_const_expr = &logging_on_f64_const_expr, + .on_get_local_expr = &logging_on_get_local_expr, + .on_grow_memory_expr = &logging_on_grow_memory_expr, + .on_i32_const_expr = &logging_on_i32_const_expr, + .on_i64_const_expr = &logging_on_i64_const_expr, + .on_if_expr = &logging_on_if_expr, + .on_load_expr = &logging_on_load_expr, + .on_loop_expr = &logging_on_loop_expr, + .on_current_memory_expr = &logging_on_current_memory_expr, + .on_nop_expr = &logging_on_nop_expr, + .on_return_expr = &logging_on_return_expr, + .on_select_expr = &logging_on_select_expr, + .on_set_local_expr = &logging_on_set_local_expr, + .on_store_expr = &logging_on_store_expr, + .on_unary_expr = &logging_on_unary_expr, + .on_unreachable_expr = &logging_on_unreachable_expr, + .end_function_body = &logging_end_function_body, + .end_function_body_pass = &logging_end_function_body_pass, + .end_function_bodies_section = &logging_end_function_bodies_section, + .begin_function_table_section = &logging_begin_function_table_section, + .on_function_table_count = &logging_on_function_table_count, + .on_function_table_entry = &logging_on_function_table_entry, + .end_function_table_section = &logging_end_function_table_section, + .begin_start_section = &logging_begin_start_section, + .on_start_function = &logging_on_start_function, + .end_start_section = &logging_end_start_section, + .begin_export_section = &logging_begin_export_section, + .on_export_count = &logging_on_export_count, + .on_export = &logging_on_export, + .end_export_section = &logging_end_export_section, + .begin_names_section = &logging_begin_names_section, + .on_function_names_count = &logging_on_function_names_count, + .on_function_name = &logging_on_function_name, + .on_local_names_count = &logging_on_local_names_count, + .on_local_name = &logging_on_local_name, + .end_names_section = &logging_end_names_section, +}; + WasmResult wasm_read_binary(WasmAllocator* allocator, const void* data, size_t size, WasmBinaryReader* reader, uint32_t num_function_passes, const WasmReadBinaryOptions* options) { + LoggingContext logging_context; + WASM_ZERO_MEMORY(logging_context); + logging_context.reader = reader; + logging_context.stream = options->log_stream; + + WasmBinaryReader logging_reader = s_logging_binary_reader; + logging_reader.user_data = &logging_context; + Context context; WASM_ZERO_MEMORY(context); /* all the macros assume a Context* named ctx */ Context* ctx = &context; ctx->data = data; ctx->size = size; - ctx->reader = reader; + ctx->reader = options->log_stream ? &logging_reader : reader; if (setjmp(ctx->error_jmp_buf) == 1) { destroy_context(allocator, ctx); |