diff options
author | Alon Zakai <azakai@google.com> | 2020-03-31 15:20:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-31 15:20:50 -0700 |
commit | a32102c7dd7b321330c6cce4d0e3b16e7187a007 (patch) | |
tree | a704cc3a77fca9fbde7a2e05de4f2b0d2980a39f /src/ir/table-utils.h | |
parent | d8179402b3bb991f336b19bcca8ccbc60c842166 (diff) | |
download | binaryen-a32102c7dd7b321330c6cce4d0e3b16e7187a007.tar.gz binaryen-a32102c7dd7b321330c6cce4d0e3b16e7187a007.tar.bz2 binaryen-a32102c7dd7b321330c6cce4d0e3b16e7187a007.zip |
Avoid unnecessary fp$ in side modules (#2717)
Now that we update the dylink section properly, we can
do the same optimization in side modules as in main ones:
if the module provides a function, don't call an $fp method
during startup, instead add it to the table ourselves and use
the relative offset to the table base.
Fix an issue when the table has no segments initially: the
code just added an offset of 0, but that's not right. Instead,
an a __table_base import and use that as the offset. As
this is ABI-specific I did it on wasm-emscripten-finalize,
leaving TableUtils to just assert on having a singleton
segment.
Add a test of a wasm file with a dylink section to the lld tests.
Diffstat (limited to 'src/ir/table-utils.h')
-rw-r--r-- | src/ir/table-utils.h | 15 |
1 files changed, 4 insertions, 11 deletions
diff --git a/src/ir/table-utils.h b/src/ir/table-utils.h index e0453dece..da0bb7241 100644 --- a/src/ir/table-utils.h +++ b/src/ir/table-utils.h @@ -50,16 +50,9 @@ struct FlatTable { } }; -// Ensure one table segment exists. This adds the table if necessary, then -// adds a segment if we need one. -inline Table::Segment& ensureTableWithOneSegment(Table& table, Module& wasm) { - table.exists = true; - if (table.segments.size() == 0) { - table.segments.resize(1); - table.segments[0].offset = LiteralUtils::makeZero(Type::i32, wasm); - } +inline Table::Segment& getSingletonSegment(Table& table, Module& wasm) { if (table.segments.size() != 1) { - Fatal() << "can't ensure 1 segment"; + Fatal() << "Table doesn't have a singleton segment."; } return table.segments[0]; } @@ -72,7 +65,7 @@ inline Table::Segment& ensureTableWithOneSegment(Table& table, Module& wasm) { // module has a single table segment, and that the dylink section indicates // we can validly append to that segment, see the check below. inline Index append(Table& table, Name name, Module& wasm) { - auto& segment = ensureTableWithOneSegment(table, wasm); + auto& segment = getSingletonSegment(table, wasm); auto tableIndex = segment.data.size(); if (wasm.dylinkSection) { if (segment.data.size() != wasm.dylinkSection->tableSize) { @@ -92,7 +85,7 @@ inline Index append(Table& table, Name name, Module& wasm) { // Checks if a function is already in the table. Returns that index if so, // otherwise appends it. inline Index getOrAppend(Table& table, Name name, Module& wasm) { - auto& segment = ensureTableWithOneSegment(table, wasm); + auto& segment = getSingletonSegment(table, wasm); for (Index i = 0; i < segment.data.size(); i++) { if (segment.data[i] == name) { return i; |