diff options
author | Abbas Mashayekh <martianboy2005@gmail.com> | 2021-03-06 03:08:51 +0330 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-05 15:38:51 -0800 |
commit | 89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4 (patch) | |
tree | 602bd8e24753b5e45c859a2c3672062ce07133fe /src/tools/fuzzing.h | |
parent | 57619b508d38677844cb482a4034dc985d2cecc6 (diff) | |
download | binaryen-89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4.tar.gz binaryen-89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4.tar.bz2 binaryen-89b8af006bc56cb4bf68f12a80b1cfe8e7a353d4.zip |
[reference-types] Support passive elem segments (#3572)
Passive element segments do not belong to any table, so the link between
Table and elem needs to be weaker; i.e. an elem may have a table in case
of active segments, or simply be a collection of function references in
case of passive/declarative segments.
This PR takes Table::Segment out and turns it into a first class module
element just like tables and functions. It also implements early support
for parsing, printing, encoding and decoding passive/declarative elem
segments.
Diffstat (limited to 'src/tools/fuzzing.h')
-rw-r--r-- | src/tools/fuzzing.h | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/src/tools/fuzzing.h b/src/tools/fuzzing.h index 1cc3635dc..288fdc23c 100644 --- a/src/tools/fuzzing.h +++ b/src/tools/fuzzing.h @@ -195,7 +195,7 @@ public: if (allowMemory) { setupMemory(); } - setupTable(); + setupTables(); setupGlobals(); if (wasm.features.hasExceptionHandling()) { setupEvents(); @@ -424,16 +424,23 @@ private: } // TODO(reference-types): allow the fuzzer to create multiple tables - void setupTable() { + void setupTables() { if (wasm.tables.size() > 0) { auto& table = wasm.tables[0]; table->initial = table->max = 0; - table->segments.emplace_back(builder.makeConst(int32_t(0))); + + auto segment = std::make_unique<ElementSegment>( + table->name, builder.makeConst(int32_t(0))); + segment->setName(Name::fromInt(0), false); + wasm.addElementSegment(std::move(segment)); } else { auto table = builder.makeTable( Names::getValidTableName(wasm, "fuzzing_table"), 0, 0); table->hasExplicitName = true; - table->segments.emplace_back(builder.makeConst(int32_t(0))); + auto segment = std::make_unique<ElementSegment>( + table->name, builder.makeConst(int32_t(0))); + segment->setName(Name::fromInt(0), false); + wasm.addElementSegment(std::move(segment)); wasm.addTable(std::move(table)); } } @@ -532,22 +539,23 @@ private: void finalizeTable() { for (auto& table : wasm.tables) { - for (auto& segment : table->segments) { - // If the offset is a global that was imported (which is ok) but no - // longer is (not ok) we need to change that. - if (auto* offset = segment.offset->dynCast<GlobalGet>()) { - if (!wasm.getGlobal(offset->name)->imported()) { - // TODO: the segments must not overlap... - segment.offset = - builder.makeConst(Literal::makeFromInt32(0, Type::i32)); + ModuleUtils::iterTableSegments( + wasm, table->name, [&](ElementSegment* segment) { + // If the offset is a global that was imported (which is ok) but no + // longer is (not ok) we need to change that. + if (auto* offset = segment->offset->dynCast<GlobalGet>()) { + if (!wasm.getGlobal(offset->name)->imported()) { + // TODO: the segments must not overlap... + segment->offset = + builder.makeConst(Literal::makeFromInt32(0, Type::i32)); + } } - } - Address maxOffset = segment.data.size(); - if (auto* offset = segment.offset->dynCast<Const>()) { - maxOffset = maxOffset + offset->value.getInteger(); - } - table->initial = std::max(table->initial, maxOffset); - } + Address maxOffset = segment->data.size(); + if (auto* offset = segment->offset->dynCast<Const>()) { + maxOffset = maxOffset + offset->value.getInteger(); + } + table->initial = std::max(table->initial, maxOffset); + }); table->max = oneIn(2) ? Address(Table::kUnlimitedSize) : table->initial; // Avoid an imported table (which the fuzz harness would need to handle). table->module = table->base = Name(); @@ -713,9 +721,11 @@ private: export_->kind = ExternalKind::Function; wasm.addExport(export_); } - // add some to the table + // add some to an elem segment while (oneIn(3) && !finishedInput) { - wasm.tables[0]->segments[0].data.push_back(func->name); + auto& randomElem = + wasm.elementSegments[upTo(wasm.elementSegments.size())]; + randomElem->data.push_back(func->name); } numAddedFunctions++; return func; @@ -1435,7 +1445,8 @@ private: } Expression* makeCallIndirect(Type type) { - auto& data = wasm.tables[0]->segments[0].data; + auto& randomElem = wasm.elementSegments[upTo(wasm.elementSegments.size())]; + auto& data = randomElem->data; if (data.empty()) { return make(type); } |