diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp index ec74bf4f529..d2ca3052968 100644 --- a/src/passes/MemoryPacking.cpp +++ b/src/passes/MemoryPacking.cpp @@ -118,7 +118,7 @@ struct MemoryPacking : public Pass { const std::unique_ptr& segment, const Referrers& referrers, std::vector& ranges); - void createSplitSegments(Builder& builder, + void createSplitSegments(Module* module, const DataSegment* segment, std::vector& ranges, std::vector>& packed, @@ -160,7 +160,6 @@ void MemoryPacking::run(Module* module) { std::vector> packed; Replacements replacements; - Builder builder(*module); for (size_t index = 0; index < segments.size(); ++index) { auto& segment = segments[index]; auto& currReferrers = referrers[segment->name]; @@ -178,7 +177,7 @@ void MemoryPacking::run(Module* module) { size_t segmentsRemaining = segments.size() - index; size_t currSegmentsStart = packed.size(); createSplitSegments( - builder, segment.get(), ranges, packed, segmentsRemaining); + module, segment.get(), ranges, packed, segmentsRemaining); std::vector currSegmentNames; for (size_t i = currSegmentsStart; i < packed.size(); ++i) { currSegmentNames.push_back(packed[i]->name); @@ -716,11 +715,12 @@ Expression* addStartAndOffset(T start, T offset, Builder& builder) { } void MemoryPacking::createSplitSegments( - Builder& builder, + Module* module, const DataSegment* segment, std::vector& ranges, std::vector>& packed, size_t segmentsRemaining) { + Builder builder(*module); size_t segmentCount = 0; bool hasExplicitName = false; for (size_t i = 0; i < ranges.size(); ++i) { @@ -763,7 +763,9 @@ void MemoryPacking::createSplitSegments( name = segment->name; hasExplicitName = segment->hasExplicitName; } else { - name = segment->name.toString() + "." + std::to_string(segmentCount); + name = Names::getValidDataSegmentName(*module, + segment->name.toString() + "." + + std::to_string(segmentCount)); } segmentCount++; } diff --git a/test/lit/passes/memory-packing_all-features.wast b/test/lit/passes/memory-packing_all-features.wast index 01650a592bc..d699a4ad31c 100644 --- a/test/lit/passes/memory-packing_all-features.wast +++ b/test/lit/passes/memory-packing_all-features.wast @@ -2557,3 +2557,16 @@ ) ) ) +(module + ;; Avoid colliding with existing segment names when splitting a segment. + ;; CHECK: (memory $0 1 1) + (memory $0 1 1) + ;; CHECK: (data $0 (i32.const 0) "a") + (data $0 (i32.const 0) "a\00\00\00\00\00\00\00\00\00b\00\00\00\00\00\00\00\00\00c") + ;; CHECK: (data $0.1_2 (i32.const 10) "b") + + ;; CHECK: (data $0.2 (i32.const 20) "c") + + ;; CHECK: (data $0.1 (i32.const 30) "d") + (data $0.1 (i32.const 30) "d") +)