diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/fuzzing/fuzzing.cpp | 40 | ||||
-rw-r--r-- | src/tools/wasm-ctor-eval.cpp | 15 | ||||
-rw-r--r-- | src/tools/wasm-metadce.cpp | 7 | ||||
-rw-r--r-- | src/tools/wasm-reduce.cpp | 14 |
4 files changed, 36 insertions, 40 deletions
diff --git a/src/tools/fuzzing/fuzzing.cpp b/src/tools/fuzzing/fuzzing.cpp index e5afbf559..c828c84d0 100644 --- a/src/tools/fuzzing/fuzzing.cpp +++ b/src/tools/fuzzing/fuzzing.cpp @@ -191,26 +191,30 @@ void TranslateToFuzzReader::setupMemory() { // need at least one segment for memory.inits size_t numSegments = upTo(8) + 1; for (size_t i = 0; i < numSegments; i++) { - Memory::Segment segment; - segment.isPassive = bool(upTo(2)); + auto segment = builder.makeDataSegment(); + segment->setName(Name::fromInt(i), false); + segment->isPassive = bool(upTo(2)); size_t segSize = upTo(USABLE_MEMORY * 2); - segment.data.resize(segSize); + segment->data.resize(segSize); for (size_t j = 0; j < segSize; j++) { - segment.data[j] = upTo(512); + segment->data[j] = upTo(512); } - if (!segment.isPassive) { - segment.offset = builder.makeConst(int32_t(memCovered)); + if (!segment->isPassive) { + segment->offset = builder.makeConst(int32_t(memCovered)); memCovered += segSize; } - wasm.memory.segments.push_back(segment); + wasm.dataSegments.push_back(std::move(segment)); } } else { // init some data - wasm.memory.segments.emplace_back(builder.makeConst(int32_t(0))); + auto segment = builder.makeDataSegment(); + segment->offset = builder.makeConst(int32_t(0)); + segment->setName(Name::fromInt(0), false); + wasm.dataSegments.push_back(std::move(segment)); auto num = upTo(USABLE_MEMORY * 2); for (size_t i = 0; i < num; i++) { auto value = upTo(512); - wasm.memory.segments[0].data.push_back(value >= 256 ? 0 : (value & 0xff)); + wasm.dataSegments[0]->data.push_back(value >= 256 ? 0 : (value & 0xff)); } } // Add memory hasher helper (for the hash, see hash.h). The function looks @@ -326,10 +330,10 @@ void TranslateToFuzzReader::setupTags() { } void TranslateToFuzzReader::finalizeMemory() { - for (auto& segment : wasm.memory.segments) { - Address maxOffset = segment.data.size(); - if (!segment.isPassive) { - if (auto* offset = segment.offset->dynCast<GlobalGet>()) { + for (auto& segment : wasm.dataSegments) { + Address maxOffset = segment->data.size(); + if (!segment->isPassive) { + if (auto* offset = segment->offset->dynCast<GlobalGet>()) { // Using a non-imported global in a segment offset is not valid in // wasm. This can occur due to us making what used to be an imported // global, in initial contents, be not imported any more. To fix that, @@ -342,11 +346,11 @@ void TranslateToFuzzReader::finalizeMemory() { if (!wasm.getGlobal(offset->name)->imported()) { // TODO: It would be better to avoid segment overlap so that // MemoryPacking can run. - segment.offset = + segment->offset = builder.makeConst(Literal::makeFromInt32(0, Type::i32)); } } - if (auto* offset = segment.offset->dynCast<Const>()) { + if (auto* offset = segment->offset->dynCast<Const>()) { maxOffset = maxOffset + offset->value.getInteger(); } } @@ -2905,8 +2909,8 @@ Expression* TranslateToFuzzReader::makeMemoryInit() { if (!allowMemory) { return makeTrivial(Type::none); } - uint32_t segment = upTo(wasm.memory.segments.size()); - size_t totalSize = wasm.memory.segments[segment].data.size(); + uint32_t segment = upTo(wasm.dataSegments.size()); + size_t totalSize = wasm.dataSegments[segment]->data.size(); size_t offsetVal = upTo(totalSize); size_t sizeVal = upTo(totalSize - offsetVal); Expression* dest = makePointer(); @@ -2919,7 +2923,7 @@ Expression* TranslateToFuzzReader::makeDataDrop() { if (!allowMemory) { return makeTrivial(Type::none); } - return builder.makeDataDrop(upTo(wasm.memory.segments.size())); + return builder.makeDataDrop(upTo(wasm.dataSegments.size())); } Expression* TranslateToFuzzReader::makeMemoryCopy() { diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp index 59e54d4f7..22fa87633 100644 --- a/src/tools/wasm-ctor-eval.cpp +++ b/src/tools/wasm-ctor-eval.cpp @@ -426,18 +426,19 @@ private: void applyMemoryToModule() { // Memory must have already been flattened into the standard form: one // segment at offset 0, or none. - if (wasm->memory.segments.empty()) { + if (wasm->dataSegments.empty()) { Builder builder(*wasm); - std::vector<char> empty; - wasm->memory.segments.push_back( - Memory::Segment(builder.makeConst(int32_t(0)), empty)); + auto curr = builder.makeDataSegment(); + curr->offset = builder.makeConst(int32_t(0)); + curr->setName(Name::fromInt(0), false); + wasm->dataSegments.push_back(std::move(curr)); } - auto& segment = wasm->memory.segments[0]; - assert(segment.offset->cast<Const>()->value.getInteger() == 0); + auto& segment = wasm->dataSegments[0]; + assert(segment->offset->cast<Const>()->value.getInteger() == 0); // Copy the current memory contents after execution into the Module's // memory. - segment.data = memory; + segment->data = memory; } // Serializing GC data requires more work than linear memory, because diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index 4b12446f4..741afb22f 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -235,11 +235,8 @@ struct MetaDCEGraph { }); rooter.walk(segment->offset); }); - for (auto& segment : wasm.memory.segments) { - if (!segment.isPassive) { - rooter.walk(segment.offset); - } - } + ModuleUtils::iterActiveDataSegments( + wasm, [&](DataSegment* segment) { rooter.walk(segment->offset); }); // A parallel scanner for function bodies struct Scanner : public WalkerPass<PostWalker<Scanner>> { diff --git a/src/tools/wasm-reduce.cpp b/src/tools/wasm-reduce.cpp index 3cfc0bb11..2276f66a4 100644 --- a/src/tools/wasm-reduce.cpp +++ b/src/tools/wasm-reduce.cpp @@ -752,20 +752,14 @@ struct Reducer // TODO: bisection on segment shrinking? - void visitMemory(Memory* curr) { - std::cerr << "| try to simplify memory\n"; - + void visitDataSegment(DataSegment* curr) { // try to reduce to first function. first, shrink segment elements. // while we are shrinking successfully, keep going exponentially. bool shrank = false; - for (auto& segment : curr->segments) { - shrank = shrinkByReduction(&segment, 2); - } + shrank = shrinkByReduction(curr, 2); // the "opposite" of shrinking: copy a 'zero' element - for (auto& segment : curr->segments) { - reduceByZeroing( - &segment, 0, [](char item) { return item == 0; }, 2, shrank); - } + reduceByZeroing( + curr, 0, [](char item) { return item == 0; }, 2, shrank); } template<typename T, typename U, typename C> |