diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binary-reader-objdump.c | 80 | ||||
-rw-r--r-- | src/binary-reader.c | 4 | ||||
-rw-r--r-- | src/binary-reader.h | 2 | ||||
-rw-r--r-- | src/literal.c | 4 | ||||
-rw-r--r-- | src/literal.h | 4 |
5 files changed, 75 insertions, 19 deletions
diff --git a/src/binary-reader-objdump.c b/src/binary-reader-objdump.c index 3a3825ba..084e4e2c 100644 --- a/src/binary-reader-objdump.c +++ b/src/binary-reader-objdump.c @@ -22,6 +22,7 @@ #include <stdio.h> #include "binary-reader.h" +#include "literal.h" typedef struct Context { const WasmObjdumpOptions* options; @@ -35,6 +36,11 @@ typedef struct Context { WasmBool print_details; WasmBool header_printed; int section_found; + + WasmStringSlice import_module_name; + WasmStringSlice import_field_name; + + int function_index; } Context; @@ -265,6 +271,26 @@ static WasmResult on_opcode_uint64(WasmBinaryReaderContext* ctx, return WASM_OK; } +static WasmResult on_opcode_f32(WasmBinaryReaderContext* ctx, + uint32_t value) { + Context* context = ctx->user_data; + size_t immediate_len = ctx->offset - context->current_opcode_offset; + char buffer[WASM_MAX_FLOAT_HEX]; + wasm_write_float_hex(buffer, sizeof(buffer), value); + log_opcode(context, ctx->data, immediate_len, buffer); + return WASM_OK; +} + +static WasmResult on_opcode_f64(WasmBinaryReaderContext* ctx, + uint64_t value) { + Context* context = ctx->user_data; + size_t immediate_len = ctx->offset - context->current_opcode_offset; + char buffer[WASM_MAX_DOUBLE_HEX]; + wasm_write_double_hex(buffer, sizeof(buffer), value); + log_opcode(context, ctx->data, immediate_len, buffer); + return WASM_OK; +} + WasmResult on_br_table_expr(WasmBinaryReaderContext* ctx, uint32_t num_targets, uint32_t* target_depths, @@ -346,7 +372,10 @@ static WasmResult on_signature(uint32_t index, static WasmResult on_function_signature(uint32_t index, uint32_t sig_index, void* user_data) { - print_details(user_data, " - [%d] sig=%d\n", index, sig_index); + Context* ctx = user_data; + + print_details(user_data, " - func[%d] sig=%d\n", ctx->function_index, sig_index); + ctx->function_index++; return WASM_OK; } @@ -366,16 +395,22 @@ static WasmResult on_import(uint32_t index, WasmStringSlice module_name, WasmStringSlice field_name, void* user_data) { - print_details(user_data, " - " PRIstringslice " " PRIstringslice "\n", - WASM_PRINTF_STRING_SLICE_ARG(module_name), - WASM_PRINTF_STRING_SLICE_ARG(field_name)); + Context* ctx = user_data; + ctx->import_module_name = module_name; + ctx->import_field_name = field_name; return WASM_OK; } static WasmResult on_import_func(uint32_t index, uint32_t sig_index, void* user_data) { - print_details(user_data, " - func sig=%d\n", sig_index); + Context* ctx = user_data; + print_details(user_data, + " - " PRIstringslice "." PRIstringslice " -> func[%d] sig=%d\n", + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_module_name), + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_field_name), + ctx->function_index, sig_index); + ctx->function_index++; return WASM_OK; } @@ -383,18 +418,24 @@ static WasmResult on_import_table(uint32_t index, WasmType elem_type, const WasmLimits* elem_limits, void* user_data) { - print_details(user_data, - " - table elem_type=%s init=%" PRId64 " max=%" PRId64 "\n", - wasm_get_type_name(elem_type), - elem_limits->initial, - elem_limits->max); + Context* ctx = user_data; + print_details( + user_data, " - " PRIstringslice "." PRIstringslice + " -> table elem_type=%s init=%" PRId64 " max=%" PRId64 "\n", + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_module_name), + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_field_name), + wasm_get_type_name(elem_type), elem_limits->initial, elem_limits->max); return WASM_OK; } static WasmResult on_import_memory(uint32_t index, const WasmLimits* page_limits, void* user_data) { - print_details(user_data, " - memory\n"); + Context* ctx = user_data; + print_details(user_data, + " - " PRIstringslice "." PRIstringslice " -> memory\n", + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_module_name), + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_field_name)); return WASM_OK; } @@ -402,7 +443,12 @@ static WasmResult on_import_global(uint32_t index, WasmType type, WasmBool mutable_, void* user_data) { - print_details(user_data, " - global\n"); + Context* ctx = user_data; + print_details(user_data, " - " PRIstringslice "." PRIstringslice + " -> global %s mutable=%d\n", + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_module_name), + WASM_PRINTF_STRING_SLICE_ARG(ctx->import_field_name), + wasm_get_type_name(type), mutable_); return WASM_OK; } @@ -489,7 +535,7 @@ static WasmResult on_init_expr_i64_const_expr(uint32_t index, static WasmResult on_function_name(uint32_t index, WasmStringSlice name, void* user_data) { - print_details(user_data, " - func:%d " PRIstringslice "\n", index, + print_details(user_data, " - func[%d] " PRIstringslice "\n", index, WASM_PRINTF_STRING_SLICE_ARG(name)); return WASM_OK; } @@ -498,8 +544,10 @@ static WasmResult on_local_name(uint32_t func_index, uint32_t local_index, WasmStringSlice name, void* user_data) { - print_details(user_data, " - local:%d " PRIstringslice "\n", local_index, - WASM_PRINTF_STRING_SLICE_ARG(name)); + if (name.length) { + print_details(user_data, " - local[%d] " PRIstringslice "\n", local_index, + WASM_PRINTF_STRING_SLICE_ARG(name)); + } return WASM_OK; } @@ -609,6 +657,8 @@ WasmResult wasm_read_binary_objdump(struct WasmAllocator* allocator, reader.on_opcode_uint32 = on_opcode_uint32; reader.on_opcode_uint32_uint32 = on_opcode_uint32_uint32; reader.on_opcode_uint64 = on_opcode_uint64; + reader.on_opcode_f32 = on_opcode_f32; + reader.on_opcode_f64 = on_opcode_f64; reader.on_opcode_block_sig = on_opcode_block_sig; reader.on_end_expr = on_end_expr; reader.on_br_table_expr = on_br_table_expr; diff --git a/src/binary-reader.c b/src/binary-reader.c index 8edec68e..d102ec08 100644 --- a/src/binary-reader.c +++ b/src/binary-reader.c @@ -1403,7 +1403,7 @@ static void read_function_body(Context* ctx, uint32_t value_bits = 0; in_f32(ctx, &value_bits, "f32.const value"); CALLBACK(on_f32_const_expr, value_bits); - CALLBACK_CTX(on_opcode_uint32, value_bits); + CALLBACK_CTX(on_opcode_f32, value_bits); break; } @@ -1411,7 +1411,7 @@ static void read_function_body(Context* ctx, uint64_t value_bits = 0; in_f64(ctx, &value_bits, "f64.const value"); CALLBACK(on_f64_const_expr, value_bits); - CALLBACK_CTX(on_opcode_uint64, value_bits); + CALLBACK_CTX(on_opcode_f64, value_bits); break; } diff --git a/src/binary-reader.h b/src/binary-reader.h index 617dec4c..bf928d61 100644 --- a/src/binary-reader.h +++ b/src/binary-reader.h @@ -175,6 +175,8 @@ typedef struct WasmBinaryReader { uint32_t value, uint32_t value2); WasmResult (*on_opcode_uint64)(WasmBinaryReaderContext* ctx, uint64_t value); + WasmResult (*on_opcode_f32)(WasmBinaryReaderContext* ctx, uint32_t value); + WasmResult (*on_opcode_f64)(WasmBinaryReaderContext* ctx, uint64_t value); WasmResult (*on_opcode_block_sig)(WasmBinaryReaderContext* ctx, uint32_t num_types, WasmType* sig_types); diff --git a/src/literal.c b/src/literal.c index 7a15aa32..04ae6ac3 100644 --- a/src/literal.c +++ b/src/literal.c @@ -418,7 +418,7 @@ void wasm_write_float_hex(char* out, size_t size, uint32_t bits) { /* -0x#.######p-### */ /* -nan:0x###### */ /* -infinity */ - char buffer[20]; + char buffer[WASM_MAX_FLOAT_HEX]; char* p = buffer; WasmBool is_neg = (bits >> F32_SIGN_SHIFT); int exp = ((bits >> F32_SIG_BITS) & F32_EXP_MASK) - F32_EXP_BIAS; @@ -748,7 +748,7 @@ void wasm_write_double_hex(char* out, size_t size, uint64_t bits) { /* -0x#.#############p-#### */ /* -nan:0x############# */ /* -infinity */ - char buffer[40]; + char buffer[WASM_MAX_DOUBLE_HEX]; char* p = buffer; WasmBool is_neg = (bits >> F64_SIGN_SHIFT); int exp = ((bits >> F64_SIG_BITS) & F64_EXP_MASK) - F64_EXP_BIAS; diff --git a/src/literal.h b/src/literal.h index 696eca24..e8b71d9c 100644 --- a/src/literal.h +++ b/src/literal.h @@ -33,6 +33,10 @@ typedef enum WasmParseIntType { WASM_PARSE_SIGNED_AND_UNSIGNED = 1, } WasmParseIntType; +/* Size of char buffer required to hold hex representation of a float/double */ +#define WASM_MAX_FLOAT_HEX 20 +#define WASM_MAX_DOUBLE_HEX 40 + WASM_EXTERN_C_BEGIN WasmResult wasm_parse_hexdigit(char c, uint32_t* out); WasmResult wasm_parse_int32(const char* s, |