From a802fbe07c270f510c87dfa93577bd4731c075f3 Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Tue, 4 Apr 2023 11:33:15 -0700 Subject: Use Names instead of indices to identify segments (#5618) All top-level Module elements are identified and referred to by Name, but for historical reasons element and data segments were referred to by index instead. Fix this inconsistency by using Names to refer to segments from expressions that use them. Also parse and print segment names like we do for other elements. The C API is partially converted to use names instead of indices, but there are still many functions that refer to data segments by index. Finishing the conversion can be done in the future once it becomes necessary. --- src/passes/PostEmscripten.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) (limited to 'src/passes/PostEmscripten.cpp') diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp index ea4922e3a..b569cd0e0 100644 --- a/src/passes/PostEmscripten.cpp +++ b/src/passes/PostEmscripten.cpp @@ -42,7 +42,7 @@ static bool isInvoke(Function* F) { } struct SegmentRemover : WalkerPass> { - SegmentRemover(Index segment) : segment(segment) {} + SegmentRemover(Name segment) : segment(segment) {} bool isFunctionParallel() override { return true; } @@ -66,19 +66,19 @@ struct SegmentRemover : WalkerPass> { } } - Index segment; + Name segment; }; static void calcSegmentOffsets(Module& wasm, std::vector
& segmentOffsets) { const Address UNKNOWN_OFFSET(uint32_t(-1)); - std::unordered_map passiveOffsets; + std::unordered_map passiveOffsets; if (wasm.features.hasBulkMemory()) { // Fetch passive segment offsets out of memory.init instructions struct OffsetSearcher : PostWalker { - std::unordered_map& offsets; - OffsetSearcher(std::unordered_map& offsets) + std::unordered_map& offsets; + OffsetSearcher(std::unordered_map& offsets) : offsets(offsets) {} void visitMemoryInit(MemoryInit* curr) { // The desitination of the memory.init is either a constant @@ -108,7 +108,7 @@ static void calcSegmentOffsets(Module& wasm, for (unsigned i = 0; i < wasm.dataSegments.size(); ++i) { auto& segment = wasm.dataSegments[i]; if (segment->isPassive) { - auto it = passiveOffsets.find(i); + auto it = passiveOffsets.find(segment->name); if (it != passiveOffsets.end()) { segmentOffsets.push_back(it->second); } else { @@ -126,13 +126,11 @@ static void calcSegmentOffsets(Module& wasm, } } -static void removeSegment(Module& wasm, Index segment) { +static void removeSegment(Module& wasm, Name segment) { PassRunner runner(&wasm); SegmentRemover(segment).run(&runner, &wasm); - // Resize the segment to zero. In theory we should completely remove it - // but that would mean re-numbering the segments that follow which is - // non-trivial. - wasm.dataSegments[segment]->data.resize(0); + // Resize the segment to zero. TODO: Remove it entirely instead. + wasm.getDataSegment(segment)->data.resize(0); } static Address getExportedAddress(Module& wasm, Export* export_) { @@ -160,21 +158,21 @@ static void removeData(Module& wasm, Address startAddress = getExportedAddress(wasm, start); Address endAddress = getExportedAddress(wasm, end); for (Index i = 0; i < wasm.dataSegments.size(); i++) { + auto& segment = wasm.dataSegments[i]; Address segmentStart = segmentOffsets[i]; - size_t segmentSize = wasm.dataSegments[i]->data.size(); + size_t segmentSize = segment->data.size(); if (segmentStart <= startAddress && segmentStart + segmentSize >= endAddress) { - if (segmentStart == startAddress && segmentStart + segmentSize == endAddress) { BYN_TRACE("removeData: removing whole segment\n"); - removeSegment(wasm, i); + removeSegment(wasm, segment->name); } else { // If we can't remove the whole segment then just set the string // data to zero. BYN_TRACE("removeData: removing part of segment\n"); size_t segmentOffset = startAddress - segmentStart; - char* startElem = &wasm.dataSegments[i]->data[segmentOffset]; + char* startElem = &segment->data[segmentOffset]; memset(startElem, 0, endAddress - startAddress); } return; -- cgit v1.2.3