summaryrefslogtreecommitdiff
path: root/src/ir/table-utils.h
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2020-03-31 15:20:50 -0700
committerGitHub <noreply@github.com>2020-03-31 15:20:50 -0700
commita32102c7dd7b321330c6cce4d0e3b16e7187a007 (patch)
treea704cc3a77fca9fbde7a2e05de4f2b0d2980a39f /src/ir/table-utils.h
parentd8179402b3bb991f336b19bcca8ccbc60c842166 (diff)
downloadbinaryen-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.h15
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;