summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/support/file.h4
-rw-r--r--src/tools/wasm-emscripten-finalize.cpp8
-rw-r--r--src/wasm-emscripten.h4
-rw-r--r--src/wasm/wasm-emscripten.cpp15
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