summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binary-reader-ast.c28
-rw-r--r--src/binary-reader-interpreter.c73
-rw-r--r--src/binary-reader-objdump.c16
-rw-r--r--src/binary-reader.c51
-rw-r--r--src/binary-reader.h12
-rw-r--r--src/tools/wasm-link.c6
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) {