diff options
Diffstat (limited to 'src/wasm/wasm-emscripten.cpp')
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index fea5048f6..3416c731d 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -111,12 +111,12 @@ public: StringConstantTracker(Module& wasm) : wasm(wasm) { calcSegmentOffsets(); } const char* stringAtAddr(Address address) { - for (unsigned i = 0; i < wasm.memory.segments.size(); ++i) { - Memory::Segment& segment = wasm.memory.segments[i]; + for (unsigned i = 0; i < wasm.dataSegments.size(); ++i) { + auto& segment = wasm.dataSegments[i]; Address offset = segmentOffsets[i]; if (offset != UNKNOWN_OFFSET && address >= offset && - address < offset + segment.data.size()) { - return &segment.data[address - offset]; + address < offset + segment->data.size()) { + return &segment->data[address - offset]; } } Fatal() << "unable to find data for ASM/EM_JS const at: " << address; @@ -159,9 +159,9 @@ private: } searcher(passiveOffsets); searcher.walkModule(&wasm); } - for (unsigned i = 0; i < wasm.memory.segments.size(); ++i) { - auto& segment = wasm.memory.segments[i]; - if (segment.isPassive) { + for (unsigned i = 0; i < wasm.dataSegments.size(); ++i) { + auto& segment = wasm.dataSegments[i]; + if (segment->isPassive) { auto it = passiveOffsets.find(i); if (it != passiveOffsets.end()) { segmentOffsets.push_back(it->second); @@ -169,7 +169,7 @@ private: // This was a non-constant offset (perhaps TLS) segmentOffsets.push_back(UNKNOWN_OFFSET); } - } else if (auto* addrConst = segment.offset->dynCast<Const>()) { + } else if (auto* addrConst = segment->offset->dynCast<Const>()) { auto address = addrConst->value.getUnsigned(); segmentOffsets.push_back(address); } else { @@ -220,7 +220,7 @@ static void removeSegment(Module& wasm, Index segment) { // 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.memory.segments[segment].data.resize(0); + wasm.dataSegments[segment]->data.resize(0); } static Address getExportedAddress(Module& wasm, Export* export_) { @@ -250,9 +250,9 @@ static std::vector<AsmConst> findEmAsmConsts(Module& wasm, StringConstantTracker stringTracker(wasm); Address startAddress = getExportedAddress(wasm, start); Address endAddress = getExportedAddress(wasm, end); - for (Index i = 0; i < wasm.memory.segments.size(); i++) { + for (Index i = 0; i < wasm.dataSegments.size(); i++) { Address segmentStart = stringTracker.segmentOffsets[i]; - size_t segmentSize = wasm.memory.segments[i].data.size(); + size_t segmentSize = wasm.dataSegments[i]->data.size(); if (segmentStart <= startAddress && segmentStart + segmentSize >= endAddress) { Address address = startAddress; @@ -269,7 +269,7 @@ static std::vector<AsmConst> findEmAsmConsts(Module& wasm, // If we can't remove the whole segment then just set the string // data to zero. size_t segmentOffset = startAddress - segmentStart; - char* startElem = &wasm.memory.segments[i].data[segmentOffset]; + char* startElem = &wasm.dataSegments[i]->data[segmentOffset]; memset(startElem, 0, endAddress - startAddress); } break; @@ -343,18 +343,18 @@ EmJsWalker findEmJsFuncsAndReturnWalker(Module& wasm) { // single segment. // We can detect this by checking for segments that contain only JS strings. // When we find such segements we remove them from the final binary. - for (Index i = 0; i < wasm.memory.segments.size(); i++) { + for (Index i = 0; i < wasm.dataSegments.size(); i++) { Address start = walker.stringTracker.segmentOffsets[i]; Address cur = start; - while (cur < start + wasm.memory.segments[i].data.size()) { + while (cur < start + wasm.dataSegments[i]->data.size()) { if (walker.codeAddresses.count(cur) == 0) { break; } cur.addr += walker.codeAddresses[cur]; } - if (cur == start + wasm.memory.segments[i].data.size()) { + if (cur == start + wasm.dataSegments[i]->data.size()) { // Entire segment is contains JS strings. Remove it. removeSegment(wasm, i); } @@ -509,24 +509,24 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata() { void EmscriptenGlueGenerator::separateDataSegments(Output* outfile, Address base) { size_t lastEnd = 0; - for (Memory::Segment& seg : wasm.memory.segments) { - if (seg.isPassive) { + for (auto& seg : wasm.dataSegments) { + if (seg->isPassive) { Fatal() << "separating passive segments not implemented"; } - if (!seg.offset->is<Const>()) { + if (!seg->offset->is<Const>()) { Fatal() << "separating relocatable segments not implemented"; } - size_t offset = seg.offset->cast<Const>()->value.getInteger(); + size_t offset = seg->offset->cast<Const>()->value.getInteger(); offset -= base; size_t fill = offset - lastEnd; if (fill > 0) { std::vector<char> buf(fill); outfile->write(buf.data(), fill); } - outfile->write(seg.data.data(), seg.data.size()); - lastEnd = offset + seg.data.size(); + outfile->write(seg->data.data(), seg->data.size()); + lastEnd = offset + seg->data.size(); } - wasm.memory.segments.clear(); + wasm.dataSegments.clear(); } } // namespace wasm |