summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorpipcet <pipcet@users.noreply.github.com>2017-04-03 19:30:36 +0000
committerSam Clegg <sbc@chromium.org>2017-04-03 12:30:36 -0700
commitad0d589c6bf89afaac6ab24fb0c20c9b1a6f0297 (patch)
treef93dd864bcb5ae71d5d3d73c4d2c2b2b584dce66 /src
parentf57ff31c1425e5f066dd0959992fb2aabc39b510 (diff)
downloadwabt-ad0d589c6bf89afaac6ab24fb0c20c9b1a6f0297.tar.gz
wabt-ad0d589c6bf89afaac6ab24fb0c20c9b1a6f0297.tar.bz2
wabt-ad0d589c6bf89afaac6ab24fb0c20c9b1a6f0297.zip
Fix function name indices for imported functions (#384)
When linking, a source binary's imported function indices and its implemented function indices can be non-contiguous; the previous code didn't catch that. Cache relocated indices in calculate_reloc_offsets to avoid O(n^2) behavior.
Diffstat (limited to 'src')
-rw-r--r--src/tools/wasm-link.cc30
-rw-r--r--src/wasm-link.h1
2 files changed, 26 insertions, 5 deletions
diff --git a/src/tools/wasm-link.cc b/src/tools/wasm-link.cc
index 602fdcec..5d6fc659 100644
--- a/src/tools/wasm-link.cc
+++ b/src/tools/wasm-link.cc
@@ -169,7 +169,6 @@ static uint32_t relocate_func_index(LinkerInputBinary* binary,
} else {
/* imported function call */
FunctionImport* import = &binary->function_imports[function_index];
- offset = binary->imported_function_index_offset;
if (!import->active) {
function_index = import->foreign_index;
offset = import->foreign_binary->function_index_offset;
@@ -177,6 +176,13 @@ static uint32_t relocate_func_index(LinkerInputBinary* binary,
writef(&s_log_stream,
"reloc for disabled import. new index = %d + %d\n",
function_index, offset);
+ } else {
+ uint32_t new_index = import->relocated_function_index;
+ if (s_debug)
+ writef(&s_log_stream,
+ "reloc for active import. old index = %d, new index = %d\n",
+ function_index, new_index);
+ return new_index;
}
}
return function_index + offset;
@@ -505,13 +511,16 @@ static void write_names_section(Context* ctx) {
write_u32_leb128(stream, total_count, "element count");
for (const std::unique_ptr<LinkerInputBinary>& binary: ctx->inputs) {
for (size_t i = 0; i < binary->debug_names.size(); i++) {
- if (binary->debug_names[i].empty())
- continue;
if (i < binary->function_imports.size()) {
- if (!binary->function_imports[i].active)
+ if (!binary->function_imports[i].active) {
continue;
+ }
}
- write_u32_leb128(stream, i + binary->function_index_offset, "function index");
+
+ if (binary->debug_names[i].empty())
+ continue;
+ write_u32_leb128(stream, relocate_func_index(&*binary, i),
+ "function index");
write_string(stream, binary->debug_names[i], "function name");
}
}
@@ -695,6 +704,17 @@ static void calculate_reloc_offsets(Context* ctx) {
binary->imported_function_index_offset = total_function_imports;
binary->imported_global_index_offset = total_global_imports;
binary->memory_page_offset = memory_page_offset;
+
+ size_t delta = 0;
+ for (size_t i = 0; i < binary->function_imports.size(); i++) {
+ if (!binary->function_imports[i].active) {
+ delta++;
+ } else {
+ binary->function_imports[i].relocated_function_index =
+ total_function_imports + i - delta;
+ }
+ }
+
memory_page_offset += binary->memory_page_count;
total_function_imports += binary->active_function_imports;
total_global_imports += binary->global_imports.size();
diff --git a/src/wasm-link.h b/src/wasm-link.h
index cb978de0..89bce24e 100644
--- a/src/wasm-link.h
+++ b/src/wasm-link.h
@@ -34,6 +34,7 @@ struct FunctionImport {
StringSlice name;
uint32_t sig_index;
bool active; /* Is this import present in the linked binary */
+ uint32_t relocated_function_index;
struct LinkerInputBinary* foreign_binary;
uint32_t foreign_index;
};