diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/binary-reader-ast.c | 28 | ||||
-rw-r--r-- | src/binary-reader-interpreter.c | 73 | ||||
-rw-r--r-- | src/binary-reader-objdump.c | 16 | ||||
-rw-r--r-- | src/binary-reader.c | 51 | ||||
-rw-r--r-- | src/binary-reader.h | 12 | ||||
-rw-r--r-- | src/tools/wasm-link.c | 6 |
6 files changed, 114 insertions, 72 deletions
diff --git a/src/binary-reader-ast.c b/src/binary-reader-ast.c index 9a1a0a7d..ddf1a7aa 100644 --- a/src/binary-reader-ast.c +++ b/src/binary-reader-ast.c @@ -208,13 +208,14 @@ static WasmResult on_import(uint32_t index, return WASM_OK; } -static WasmResult on_import_func(uint32_t index, +static WasmResult on_import_func(uint32_t import_index, + uint32_t func_index, uint32_t sig_index, void* user_data) { Context* ctx = user_data; - assert(index == ctx->module->imports.size - 1); + assert(import_index == ctx->module->imports.size - 1); assert(sig_index < ctx->module->func_types.size); - WasmImport* import = ctx->module->imports.data[index]; + WasmImport* import = ctx->module->imports.data[import_index]; import->kind = WASM_EXTERNAL_KIND_FUNC; import->func.decl.flags = WASM_FUNC_DECLARATION_FLAG_HAS_FUNC_TYPE | @@ -229,13 +230,14 @@ static WasmResult on_import_func(uint32_t index, return WASM_OK; } -static WasmResult on_import_table(uint32_t index, +static WasmResult on_import_table(uint32_t import_index, + uint32_t table_index, WasmType elem_type, const WasmLimits* elem_limits, void* user_data) { Context* ctx = user_data; - assert(index == ctx->module->imports.size - 1); - WasmImport* import = ctx->module->imports.data[index]; + assert(import_index == ctx->module->imports.size - 1); + WasmImport* import = ctx->module->imports.data[import_index]; import->kind = WASM_EXTERNAL_KIND_TABLE; import->table.elem_limits = *elem_limits; @@ -245,12 +247,13 @@ static WasmResult on_import_table(uint32_t index, return WASM_OK; } -static WasmResult on_import_memory(uint32_t index, +static WasmResult on_import_memory(uint32_t import_index, + uint32_t memory_index, const WasmLimits* page_limits, void* user_data) { Context* ctx = user_data; - assert(index == ctx->module->imports.size - 1); - WasmImport* import = ctx->module->imports.data[index]; + assert(import_index == ctx->module->imports.size - 1); + WasmImport* import = ctx->module->imports.data[import_index]; import->kind = WASM_EXTERNAL_KIND_MEMORY; import->memory.page_limits = *page_limits; @@ -261,13 +264,14 @@ static WasmResult on_import_memory(uint32_t index, return WASM_OK; } -static WasmResult on_import_global(uint32_t index, +static WasmResult on_import_global(uint32_t import_index, + uint32_t global_index, WasmType type, WasmBool mutable_, void* user_data) { Context* ctx = user_data; - assert(index == ctx->module->imports.size - 1); - WasmImport* import = ctx->module->imports.data[index]; + assert(import_index == ctx->module->imports.size - 1); + WasmImport* import = ctx->module->imports.data[import_index]; import->kind = WASM_EXTERNAL_KIND_GLOBAL; import->global.type = type; import->global.mutable_ = mutable_; diff --git a/src/binary-reader-interpreter.c b/src/binary-reader-interpreter.c index 2901787d..87d260de 100644 --- a/src/binary-reader-interpreter.c +++ b/src/binary-reader-interpreter.c @@ -127,7 +127,7 @@ typedef struct Context { uint32_t table_offset; WasmBool is_host_import; WasmInterpreterModule* host_import_module; - uint32_t import_index; + uint32_t import_env_index; } Context; static Label* get_label(Context* ctx, uint32_t depth) { @@ -439,7 +439,7 @@ static WasmResult on_import(uint32_t index, import->kind = export->kind; ctx->is_host_import = WASM_FALSE; - ctx->import_index = export->index; + ctx->import_env_index = export->index; } return WASM_OK; } @@ -514,16 +514,18 @@ static WasmPrintErrorCallback make_print_error_callback(Context* ctx) { return result; } -static WasmResult on_import_func(uint32_t index, +static WasmResult on_import_func(uint32_t import_index, + uint32_t func_index, uint32_t sig_index, void* user_data) { Context* ctx = user_data; - assert(index < ctx->module->defined.imports.size); - WasmInterpreterImport* import = &ctx->module->defined.imports.data[index]; + assert(import_index < ctx->module->defined.imports.size); + WasmInterpreterImport* import = + &ctx->module->defined.imports.data[import_index]; assert(sig_index < ctx->env->sigs.size); import->func.sig_index = translate_sig_index_to_env(ctx, sig_index); - uint32_t func_index; + uint32_t func_env_index; if (ctx->is_host_import) { WasmInterpreterFunc* func = wasm_append_interpreter_func(ctx->allocator, &ctx->env->funcs); @@ -540,23 +542,23 @@ static WasmResult on_import_func(uint32_t index, host_delegate->user_data)); assert(func->host.callback); - func_index = ctx->env->funcs.size - 1; + func_env_index = ctx->env->funcs.size - 1; append_export(ctx, ctx->host_import_module, WASM_EXTERNAL_KIND_FUNC, - func_index, import->field_name); + func_env_index, import->field_name); } else { CHECK_RESULT(check_import_kind(ctx, import, WASM_EXTERNAL_KIND_FUNC)); - assert(ctx->import_index < ctx->env->funcs.size); - WasmInterpreterFunc* func = &ctx->env->funcs.data[ctx->import_index]; + assert(ctx->import_env_index < ctx->env->funcs.size); + WasmInterpreterFunc* func = &ctx->env->funcs.data[ctx->import_env_index]; if (!wasm_func_signatures_are_equal(ctx->env, import->func.sig_index, func->sig_index)) { print_error(ctx, "import signature mismatch"); return WASM_ERROR; } - func_index = ctx->import_index; + func_env_index = ctx->import_env_index; } wasm_append_uint32_value(ctx->allocator, &ctx->func_index_mapping, - &func_index); + &func_env_index); ctx->num_func_imports++; return WASM_OK; } @@ -569,7 +571,8 @@ static void init_table_func_indexes(Context* ctx, WasmInterpreterTable* table) { table->func_indexes.data[i] = WASM_INVALID_INDEX; } -static WasmResult on_import_table(uint32_t index, +static WasmResult on_import_table(uint32_t import_index, + uint32_t table_index, WasmType elem_type, const WasmLimits* elem_limits, void* user_data) { @@ -579,8 +582,9 @@ static WasmResult on_import_table(uint32_t index, return WASM_ERROR; } - assert(index < ctx->module->defined.imports.size); - WasmInterpreterImport* import = &ctx->module->defined.imports.data[index]; + assert(import_index < ctx->module->defined.imports.size); + WasmInterpreterImport* import = + &ctx->module->defined.imports.data[import_index]; if (ctx->is_host_import) { WasmInterpreterTable* table = @@ -601,17 +605,18 @@ static WasmResult on_import_table(uint32_t index, ctx->module->table_index, import->field_name); } else { CHECK_RESULT(check_import_kind(ctx, import, WASM_EXTERNAL_KIND_TABLE)); - assert(ctx->import_index < ctx->env->tables.size); - WasmInterpreterTable* table = &ctx->env->tables.data[ctx->import_index]; + assert(ctx->import_env_index < ctx->env->tables.size); + WasmInterpreterTable* table = &ctx->env->tables.data[ctx->import_env_index]; CHECK_RESULT(check_import_limits(ctx, elem_limits, &table->limits)); import->table.limits = *elem_limits; - ctx->module->table_index = ctx->import_index; + ctx->module->table_index = ctx->import_env_index; } return WASM_OK; } -static WasmResult on_import_memory(uint32_t index, +static WasmResult on_import_memory(uint32_t import_index, + uint32_t memory_index, const WasmLimits* page_limits, void* user_data) { Context* ctx = user_data; @@ -620,8 +625,9 @@ static WasmResult on_import_memory(uint32_t index, return WASM_ERROR; } - assert(index < ctx->module->defined.imports.size); - WasmInterpreterImport* import = &ctx->module->defined.imports.data[index]; + assert(import_index < ctx->module->defined.imports.size); + WasmInterpreterImport* import = + &ctx->module->defined.imports.data[import_index]; if (ctx->is_host_import) { WasmInterpreterMemory* memory = @@ -642,25 +648,28 @@ static WasmResult on_import_memory(uint32_t index, ctx->module->memory_index, import->field_name); } else { CHECK_RESULT(check_import_kind(ctx, import, WASM_EXTERNAL_KIND_MEMORY)); - assert(ctx->import_index < ctx->env->memories.size); - WasmInterpreterMemory* memory = &ctx->env->memories.data[ctx->import_index]; + assert(ctx->import_env_index < ctx->env->memories.size); + WasmInterpreterMemory* memory = + &ctx->env->memories.data[ctx->import_env_index]; CHECK_RESULT(check_import_limits(ctx, page_limits, &memory->page_limits)); import->memory.limits = *page_limits; - ctx->module->memory_index = ctx->import_index; + ctx->module->memory_index = ctx->import_env_index; } return WASM_OK; } -static WasmResult on_import_global(uint32_t index, +static WasmResult on_import_global(uint32_t import_index, + uint32_t global_index, WasmType type, WasmBool mutable, void* user_data) { Context* ctx = user_data; - assert(index < ctx->module->defined.imports.size); - WasmInterpreterImport* import = &ctx->module->defined.imports.data[index]; + assert(import_index < ctx->module->defined.imports.size); + WasmInterpreterImport* import = + &ctx->module->defined.imports.data[import_index]; - uint32_t global_index = ctx->env->globals.size - 1; + uint32_t global_env_index = ctx->env->globals.size - 1; if (ctx->is_host_import) { WasmInterpreterGlobal* global = wasm_append_interpreter_global(ctx->allocator, &ctx->env->globals); @@ -673,18 +682,18 @@ static WasmResult on_import_global(uint32_t index, make_print_error_callback(ctx), host_delegate->user_data)); - global_index = ctx->env->globals.size - 1; + global_env_index = ctx->env->globals.size - 1; append_export(ctx, ctx->host_import_module, WASM_EXTERNAL_KIND_GLOBAL, - global_index, import->field_name); + global_env_index, import->field_name); } else { CHECK_RESULT(check_import_kind(ctx, import, WASM_EXTERNAL_KIND_GLOBAL)); // TODO: check type and mutability import->global.type = type; import->global.mutable_ = mutable; - global_index = ctx->import_index; + global_env_index = ctx->import_env_index; } wasm_append_uint32_value(ctx->allocator, &ctx->global_index_mapping, - &global_index); + &global_env_index); return WASM_OK; } diff --git a/src/binary-reader-objdump.c b/src/binary-reader-objdump.c index af516058..0c67e39b 100644 --- a/src/binary-reader-objdump.c +++ b/src/binary-reader-objdump.c @@ -393,19 +393,21 @@ static WasmResult on_import(uint32_t index, return WASM_OK; } -static WasmResult on_import_func(uint32_t index, +static WasmResult on_import_func(uint32_t import_index, + uint32_t func_index, uint32_t sig_index, void* user_data) { Context* ctx = user_data; print_details(user_data, " - func[%d] sig=%d <- " PRIstringslice "." PRIstringslice "\n", - index, sig_index, + func_index, sig_index, WASM_PRINTF_STRING_SLICE_ARG(ctx->import_module_name), WASM_PRINTF_STRING_SLICE_ARG(ctx->import_field_name)); return WASM_OK; } -static WasmResult on_import_table(uint32_t index, +static WasmResult on_import_table(uint32_t import_index, + uint32_t table_index, WasmType elem_type, const WasmLimits* elem_limits, void* user_data) { @@ -419,7 +421,8 @@ static WasmResult on_import_table(uint32_t index, return WASM_OK; } -static WasmResult on_import_memory(uint32_t index, +static WasmResult on_import_memory(uint32_t import_index, + uint32_t memory_index, const WasmLimits* page_limits, void* user_data) { Context* ctx = user_data; @@ -430,14 +433,15 @@ static WasmResult on_import_memory(uint32_t index, return WASM_OK; } -static WasmResult on_import_global(uint32_t index, +static WasmResult on_import_global(uint32_t import_index, + uint32_t global_index, WasmType type, WasmBool mutable_, void* user_data) { Context* ctx = user_data; print_details(user_data, " - global[%d] %s mutable=%d <- " PRIstringslice "." PRIstringslice "\n", - index, wasm_get_type_name(type), mutable_, + global_index, wasm_get_type_name(type), mutable_, WASM_PRINTF_STRING_SLICE_ARG(ctx->import_module_name), WASM_PRINTF_STRING_SLICE_ARG(ctx->import_field_name)); return WASM_OK; diff --git a/src/binary-reader.c b/src/binary-reader.c index 7095403e..7af6dd63 100644 --- a/src/binary-reader.c +++ b/src/binary-reader.c @@ -552,7 +552,6 @@ LOGGING_UINT32(on_signature_count) LOGGING_END(signature_section) LOGGING_BEGIN(import_section) LOGGING_UINT32(on_import_count) -LOGGING_UINT32_UINT32(on_import_func, "index", "sig_index") LOGGING_END(import_section) LOGGING_BEGIN(function_signatures_section) LOGGING_UINT32(on_function_signatures_count) @@ -683,36 +682,55 @@ static WasmResult logging_on_import(uint32_t index, FORWARD(on_import, index, module_name, field_name); } -static WasmResult logging_on_import_table(uint32_t index, +static WasmResult logging_on_import_func(uint32_t import_index, + uint32_t func_index, + uint32_t sig_index, + void* user_data) { + LoggingContext* ctx = user_data; + LOGF("on_import_func(import_index: %u, func_index: %u, sig_index: %u)\n", + import_index, func_index, sig_index); + FORWARD(on_import_func, import_index, func_index, sig_index); +} + + +static WasmResult logging_on_import_table(uint32_t import_index, + uint32_t table_index, WasmType elem_type, const WasmLimits* elem_limits, void* user_data) { LoggingContext* ctx = user_data; char buf[100]; sprint_limits(buf, sizeof(buf), elem_limits); - LOGF("on_import_table(index: %u, elem_type: %s, %s)\n", index, - wasm_get_type_name(elem_type), buf); - FORWARD(on_import_table, index, elem_type, elem_limits); + LOGF( + "on_import_table(import_index: %u, table_index: %u, elem_type: %s, %s)\n", + import_index, table_index, wasm_get_type_name(elem_type), buf); + FORWARD(on_import_table, import_index, table_index, elem_type, elem_limits); } -static WasmResult logging_on_import_memory(uint32_t index, +static WasmResult logging_on_import_memory(uint32_t import_index, + uint32_t memory_index, const WasmLimits* page_limits, void* user_data) { LoggingContext* ctx = user_data; char buf[100]; sprint_limits(buf, sizeof(buf), page_limits); - LOGF("on_import_memory(index: %u, %s)\n", index, buf); - FORWARD(on_import_memory, index, page_limits); + LOGF("on_import_memory(import_index: %u, memory_index: %u, %s)\n", + import_index, memory_index, buf); + FORWARD(on_import_memory, import_index, memory_index, page_limits); } -static WasmResult logging_on_import_global(uint32_t index, +static WasmResult logging_on_import_global(uint32_t import_index, + uint32_t global_index, WasmType type, WasmBool mutable_, void* user_data) { LoggingContext* ctx = user_data; - LOGF("on_import_global(index: %u, type: %s, mutable: %s)\n", index, - wasm_get_type_name(type), mutable_ ? "true" : "false"); - FORWARD(on_import_global, index, type, mutable_); + LOGF( + "on_import_global(import_index: %u, global_index: %u, type: %s, mutable: " + "%s)\n", + import_index, global_index, wasm_get_type_name(type), + mutable_ ? "true" : "false"); + FORWARD(on_import_global, import_index, global_index, type, mutable_); } static WasmResult logging_on_table(uint32_t index, @@ -1754,7 +1772,7 @@ static void read_import_section(Context* ctx, uint32_t section_size) { in_u32_leb128(ctx, &sig_index, "import signature index"); RAISE_ERROR_UNLESS(sig_index < ctx->num_signatures, "invalid import signature index"); - CALLBACK(on_import_func, i, sig_index); + CALLBACK(on_import_func, i, ctx->num_func_imports, sig_index); ctx->num_func_imports++; break; } @@ -1763,7 +1781,8 @@ static void read_import_section(Context* ctx, uint32_t section_size) { WasmType elem_type; WasmLimits elem_limits; read_table(ctx, &elem_type, &elem_limits); - CALLBACK(on_import_table, i, elem_type, &elem_limits); + CALLBACK(on_import_table, i, ctx->num_table_imports, elem_type, + &elem_limits); ctx->num_table_imports++; break; } @@ -1771,7 +1790,7 @@ static void read_import_section(Context* ctx, uint32_t section_size) { case WASM_EXTERNAL_KIND_MEMORY: { WasmLimits page_limits; read_memory(ctx, &page_limits); - CALLBACK(on_import_memory, i, &page_limits); + CALLBACK(on_import_memory, i, ctx->num_memory_imports, &page_limits); ctx->num_memory_imports++; break; } @@ -1780,7 +1799,7 @@ static void read_import_section(Context* ctx, uint32_t section_size) { WasmType type; WasmBool mutable_; read_global_header(ctx, &type, &mutable_); - CALLBACK(on_import_global, i, type, mutable_); + CALLBACK(on_import_global, i, ctx->num_global_imports, type, mutable_); ctx->num_global_imports++; break; } diff --git a/src/binary-reader.h b/src/binary-reader.h index 297b0e55..1b93013d 100644 --- a/src/binary-reader.h +++ b/src/binary-reader.h @@ -80,17 +80,21 @@ typedef struct WasmBinaryReader { WasmStringSlice module_name, WasmStringSlice field_name, void* user_data); - WasmResult (*on_import_func)(uint32_t index, + WasmResult (*on_import_func)(uint32_t import_index, + uint32_t func_index, uint32_t sig_index, void* user_data); - WasmResult (*on_import_table)(uint32_t index, + WasmResult (*on_import_table)(uint32_t import_index, + uint32_t table_index, WasmType elem_type, const WasmLimits* elem_limits, void* user_data); - WasmResult (*on_import_memory)(uint32_t index, + WasmResult (*on_import_memory)(uint32_t import_index, + uint32_t memory_index, const WasmLimits* page_limits, void* user_data); - WasmResult (*on_import_global)(uint32_t index, + WasmResult (*on_import_global)(uint32_t import_index, + uint32_t global_index, WasmType type, WasmBool mutable_, void* user_data); diff --git a/src/tools/wasm-link.c b/src/tools/wasm-link.c index 244be1eb..c152d24d 100644 --- a/src/tools/wasm-link.c +++ b/src/tools/wasm-link.c @@ -219,7 +219,8 @@ static WasmResult on_reloc(WasmRelocType type, return WASM_OK; } -static WasmResult on_import_func(uint32_t index, +static WasmResult on_import_func(uint32_t import_index, + uint32_t func_index, uint32_t sig_index, void* user_data) { InputBinary* binary = user_data; @@ -227,7 +228,8 @@ static WasmResult on_import_func(uint32_t index, return WASM_OK; } -static WasmResult on_import_global(uint32_t index, +static WasmResult on_import_global(uint32_t import_index, + uint32_t global_index, WasmType type, WasmBool mutable, void* user_data) { |