summaryrefslogtreecommitdiff
path: root/src/wasm-binary-reader-objdump.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm-binary-reader-objdump.c')
-rw-r--r--src/wasm-binary-reader-objdump.c195
1 files changed, 175 insertions, 20 deletions
diff --git a/src/wasm-binary-reader-objdump.c b/src/wasm-binary-reader-objdump.c
index eb26106b..ad2f621a 100644
--- a/src/wasm-binary-reader-objdump.c
+++ b/src/wasm-binary-reader-objdump.c
@@ -17,6 +17,7 @@
#include "wasm-binary-reader-objdump.h"
#include <assert.h>
+#include <inttypes.h>
#include <string.h>
#include <stdio.h>
@@ -31,11 +32,21 @@ typedef struct Context {
size_t current_opcode_offset;
size_t last_opcode_end;
int indent_level;
+ WasmBool print_details;
+ WasmBool header_printed;
+ int section_found;
} Context;
+
+static WasmBool should_print_details(Context* ctx) {
+ if (ctx->options->mode != WASM_DUMP_DETAILS)
+ return WASM_FALSE;
+ return ctx->print_details;
+}
+
static void WASM_PRINTF_FORMAT(2, 3)
print_details(Context* ctx, const char* fmt, ...) {
- if (!ctx->options->verbose)
+ if (!should_print_details(ctx))
return;
va_list args;
va_start(args, fmt);
@@ -53,15 +64,28 @@ static WasmResult begin_section(Context* ctx,
const char* name,
size_t offset,
size_t size) {
- if (ctx->options->headers) {
- printf("%-12s start=%#010" PRIzx " end=%#010" PRIzx " (size=%#010" PRIzx
- ")\n",
- name, offset, offset + size, size);
- }
- if (ctx->options->raw) {
- printf("\n");
- wasm_write_memory_dump(ctx->out_stream, ctx->data + offset, size, offset,
- WASM_PRINT_CHARS, NULL);
+ switch (ctx->options->mode) {
+ case WASM_DUMP_HEADERS:
+ printf("%9s start=%#010" PRIzx " end=%#010" PRIzx " (size=%#010" PRIzx
+ ") ",
+ name, offset, offset + size, size);
+ break;
+ case WASM_DUMP_DETAILS:
+ if (!ctx->options->section_name || !strcasecmp(ctx->options->section_name, name)) {
+ printf("%s:\n", name);
+ ctx->print_details = WASM_TRUE;
+ ctx->section_found = WASM_TRUE;
+ } else {
+ ctx->print_details = WASM_FALSE;
+ }
+ break;
+ case WASM_DUMP_RAW_DATA:
+ printf("\nContents of section %s:\n", name);
+ wasm_write_memory_dump(ctx->out_stream, ctx->data + offset, size, offset,
+ WASM_PRINT_CHARS, NULL);
+ break;
+ case WASM_DUMP_DISASSEMBLE:
+ break;
}
return WASM_OK;
}
@@ -81,7 +105,53 @@ SEGSTART(names, "NAMES")
static WasmResult on_count(uint32_t count, void* user_data) {
Context* ctx = user_data;
- print_details(ctx, " - count: %d\n", count);
+ if (ctx->options->mode == WASM_DUMP_HEADERS) {
+ printf("count: %d\n", count);
+ }
+ return WASM_OK;
+}
+
+static WasmResult begin_module(uint32_t version, void* user_data) {
+ Context* ctx = user_data;
+ if (ctx->options->print_header) {
+ const char *basename = strrchr(ctx->options->infile, '/');
+ if (basename)
+ basename++;
+ else
+ basename = ctx->options->infile;
+ printf("%s:\tfile format wasm %#08x\n", basename, version);
+ ctx->header_printed = WASM_TRUE;
+ }
+
+ switch (ctx->options->mode) {
+ case WASM_DUMP_HEADERS:
+ printf("\n");
+ printf("Sections:\n");
+ break;
+ case WASM_DUMP_DETAILS:
+ printf("\n");
+ printf("Section Details:\n");
+ break;
+ case WASM_DUMP_DISASSEMBLE:
+ printf("\n");
+ printf("Code Disassembly:\n");
+ break;
+ case WASM_DUMP_RAW_DATA:
+ break;
+ }
+
+ return WASM_OK;
+}
+
+static WasmResult end_module(void *user_data) {
+ Context* ctx = user_data;
+ if (ctx->options->mode == WASM_DUMP_DETAILS && ctx->options->section_name) {
+ if (!ctx->section_found) {
+ printf("Section not found: %s\n", ctx->options->section_name);
+ return WASM_ERROR;
+ }
+ }
+
return WASM_OK;
}
@@ -244,7 +314,7 @@ static WasmResult on_signature(uint32_t index,
void* user_data) {
Context* ctx = user_data;
- if (!ctx->options->verbose)
+ if (!should_print_details(ctx))
return WASM_OK;
printf(" - [%d] (", index);
uint32_t i;
@@ -272,16 +342,30 @@ static WasmResult on_function_signature(uint32_t index,
static WasmResult begin_function_body(uint32_t index, void* user_data) {
Context* ctx = user_data;
- if (ctx->options->verbose || ctx->options->disassemble)
+
+ if (should_print_details(ctx))
+ printf(" - func %d\n", index);
+ if (ctx->options->mode == WASM_DUMP_DISASSEMBLE)
printf("func %d\n", index);
+
ctx->last_opcode_end = 0;
return WASM_OK;
}
+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));
+ 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);
+ print_details(user_data, " - func sig=%d\n", sig_index);
return WASM_OK;
}
@@ -289,16 +373,18 @@ static WasmResult on_import_table(uint32_t index,
WasmType elem_type,
const WasmLimits* elem_limits,
void* user_data) {
- /* TODO(sbc): print more useful information about the table here */
- print_details(user_data, "- table elem_type=%s\n",
- wasm_get_type_name(elem_type));
+ 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);
return WASM_OK;
}
static WasmResult on_import_memory(uint32_t index,
const WasmLimits* page_limits,
void* user_data) {
- print_details(user_data, "- memory\n");
+ print_details(user_data, " - memory\n");
return WASM_OK;
}
@@ -321,7 +407,12 @@ static WasmResult on_table(uint32_t index,
WasmType elem_type,
const WasmLimits* elem_limits,
void* user_data) {
- print_details(user_data, "- table %d\n", index);
+ print_details(user_data,
+ " - [%d] type=%#x init=%" PRId64 " max=%" PRId64 " \n",
+ index,
+ elem_type,
+ elem_limits->initial,
+ elem_limits->has_max ? elem_limits->max : 0);
return WASM_OK;
}
@@ -336,12 +427,64 @@ static WasmResult on_export(uint32_t index,
return WASM_OK;
}
+static WasmResult on_elem_segment_function_index(uint32_t index,
+ uint32_t func_index,
+ void* user_data) {
+ print_details(user_data, " - [%d] -> %d\n", index, func_index);
+ return WASM_OK;
+}
+
+static WasmResult begin_elem_segment(uint32_t index,
+ uint32_t table_index,
+ void* user_data) {
+ print_details(user_data, " - segment [%d] table=%d\n", index, table_index);
+ return WASM_OK;
+}
+
+static WasmResult on_init_expr_f32_const_expr(uint32_t index,
+ uint32_t value,
+ void* user_data) {
+ print_details(user_data, " - init f32=%d\n", value);
+ return WASM_OK;
+}
+
+static WasmResult on_init_expr_f64_const_expr(uint32_t index,
+ uint64_t value,
+ void* user_data) {
+ print_details(user_data, " - init f64=%" PRId64 "\n", value);
+ return WASM_OK;
+}
+
+static WasmResult on_init_expr_get_global_expr(uint32_t index,
+ uint32_t global_index,
+ void* user_data) {
+ print_details(user_data, " - init global=%d\n", global_index);
+ return WASM_OK;
+}
+
+static WasmResult on_init_expr_i32_const_expr(uint32_t index,
+ uint32_t value,
+ void* user_data) {
+ print_details(user_data, " - init i32=%d\n", value);
+ return WASM_OK;
+}
+
+static WasmResult on_init_expr_i64_const_expr(uint32_t index,
+ uint64_t value,
+ void* user_data) {
+ print_details(user_data, " - init i64=%" PRId64 "\n", value);
+ return WASM_OK;
+}
+
static void on_error(WasmBinaryReaderContext* ctx, const char* message) {
wasm_default_binary_error_callback(ctx->offset, message, ctx->user_data);
}
static WasmBinaryReader s_binary_reader = {
.user_data = NULL,
+
+ .begin_module = begin_module,
+ .end_module = end_module,
.on_error = on_error,
// Signature sections
@@ -352,6 +495,7 @@ static WasmBinaryReader s_binary_reader = {
// Import section
.begin_import_section = begin_import_section,
.on_import_count = on_count,
+ .on_import = on_import,
.on_import_func = on_import_func,
.on_import_table = on_import_table,
.on_import_memory = on_import_memory,
@@ -391,7 +535,9 @@ static WasmBinaryReader s_binary_reader = {
// Elems section
.begin_elem_section = begin_elem_section,
+ .begin_elem_segment = begin_elem_segment,
.on_elem_segment_count = on_count,
+ .on_elem_segment_function_index = on_elem_segment_function_index,
// Data section
.begin_data_section = begin_data_section,
@@ -400,6 +546,12 @@ static WasmBinaryReader s_binary_reader = {
// Names section
.begin_names_section = begin_names_section,
.on_function_names_count = on_count,
+
+ .on_init_expr_i32_const_expr = on_init_expr_i32_const_expr,
+ .on_init_expr_i64_const_expr = on_init_expr_i64_const_expr,
+ .on_init_expr_f32_const_expr = on_init_expr_f32_const_expr,
+ .on_init_expr_f64_const_expr = on_init_expr_f64_const_expr,
+ .on_init_expr_get_global_expr = on_init_expr_get_global_expr,
};
WasmResult wasm_read_binary_objdump(struct WasmAllocator* allocator,
@@ -411,12 +563,15 @@ WasmResult wasm_read_binary_objdump(struct WasmAllocator* allocator,
reader = s_binary_reader;
Context context;
WASM_ZERO_MEMORY(context);
+ context.header_printed = WASM_FALSE;
+ context.print_details = WASM_FALSE;
+ context.section_found = WASM_FALSE;
context.data = data;
context.size = size;
context.options = options;
context.out_stream = wasm_init_stdout_stream();
- if (options->disassemble) {
+ if (options->mode == WASM_DUMP_DISASSEMBLE) {
reader.on_opcode = on_opcode;
reader.on_opcode_bare = on_opcode_bare;
reader.on_opcode_uint32 = on_opcode_uint32;