diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/support/file.h | 4 | ||||
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 8 | ||||
-rw-r--r-- | src/wasm-emscripten.h | 4 | ||||
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 15 |
4 files changed, 31 insertions, 0 deletions
diff --git a/src/support/file.h b/src/support/file.h index c15e3f6ce..8355767ee 100644 --- a/src/support/file.h +++ b/src/support/file.h @@ -59,6 +59,10 @@ class Output { return out; } + std::ostream& write(const char* s, std::streamsize c) { + return out.write(s, c); + } + private: Output() = delete; Output(const Output &) = delete; diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 4c9f8df36..495ed5df9 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -40,6 +40,7 @@ int main(int argc, const char *argv[]) { std::string inputSourceMapFilename; std::string outputSourceMapFilename; std::string outputSourceMapUrl; + std::string dataSegmentFile; bool emitBinary = true; bool debugInfo = false; bool legalizeJavaScriptFFI = true; @@ -94,6 +95,9 @@ int main(int argc, const char *argv[]) { .add("--output-source-map-url", "-osu", "Emit specified string as source map URL", Options::Arguments::One, [&outputSourceMapUrl](Options *o, const std::string& argument) { outputSourceMapUrl = argument; }) + .add("--separate-data-segments", "", "Separate data segments to a file", + Options::Arguments::One, + [&dataSegmentFile](Options *o, const std::string& argument) { dataSegmentFile = argument;}) .add_positional("INFILE", Options::Arguments::One, [&infile](Options *o, const std::string& argument) { infile = argument; @@ -161,6 +165,10 @@ int main(int argc, const char *argv[]) { generator.generateDynCallThunks(); generator.generateJSCallThunks(numReservedFunctionPointers); std::string metadata = generator.generateEmscriptenMetadata(dataSize, initializerFunctions, numReservedFunctionPointers); + if (!dataSegmentFile.empty()) { + Output memInitFile(dataSegmentFile, Flags::Binary, Flags::Release); + generator.separateDataSegments(&memInitFile); + } if (options.debug) { std::cerr << "Module after:\n"; diff --git a/src/wasm-emscripten.h b/src/wasm-emscripten.h index 21bd21bea..78d24b13f 100644 --- a/src/wasm-emscripten.h +++ b/src/wasm-emscripten.h @@ -19,6 +19,8 @@ #include "wasm.h" #include "wasm-builder.h" +#include "support/file.h" + namespace wasm { @@ -53,6 +55,8 @@ public: void fixInvokeFunctionNames(); + void separateDataSegments(Output* outfile); + private: Module& wasm; Builder builder; diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index d7c323da9..a99482d39 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -810,4 +810,19 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata( return meta.str(); } +void EmscriptenGlueGenerator::separateDataSegments(Output* outfile) { + size_t lastEnd = 0; + for (Memory::Segment& seg : wasm.memory.segments) { + size_t offset = seg.offset->cast<Const>()->value.geti32(); + 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(); + } + wasm.memory.segments.clear(); +} + } // namespace wasm |