diff options
author | pipcet <pipcet@users.noreply.github.com> | 2017-04-03 19:30:36 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2017-04-03 12:30:36 -0700 |
commit | ad0d589c6bf89afaac6ab24fb0c20c9b1a6f0297 (patch) | |
tree | f93dd864bcb5ae71d5d3d73c4d2c2b2b584dce66 /src | |
parent | f57ff31c1425e5f066dd0959992fb2aabc39b510 (diff) | |
download | wabt-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.cc | 30 | ||||
-rw-r--r-- | src/wasm-link.h | 1 |
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; }; |