summaryrefslogtreecommitdiff
path: root/src/tools/s2wasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/s2wasm.cpp')
-rw-r--r--src/tools/s2wasm.cpp16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/tools/s2wasm.cpp b/src/tools/s2wasm.cpp
index 2ee094af4..8c36a0d58 100644
--- a/src/tools/s2wasm.cpp
+++ b/src/tools/s2wasm.cpp
@@ -22,6 +22,7 @@
#include "support/command-line.h"
#include "support/file.h"
#include "s2wasm.h"
+#include "wasm-emscripten.h"
#include "wasm-linker.h"
#include "wasm-printing.h"
#include "wasm-validator.h"
@@ -32,6 +33,7 @@ using namespace wasm;
int main(int argc, const char *argv[]) {
bool ignoreUnknownSymbols = false;
bool generateEmscriptenGlue = false;
+ bool allowMemoryGrowth = false;
std::string startFunction;
std::vector<std::string> archiveLibraries;
Options options("s2wasm", "Link .s file into .wast");
@@ -73,6 +75,11 @@ int main(int argc, const char *argv[]) {
[](Options *o, const std::string &argument) {
o->extra["max-memory"] = argument;
})
+ .add("--allow-memory-growth", "", "Allow linear memory to grow at runtime",
+ Options::Arguments::Zero,
+ [&allowMemoryGrowth](Options *, const std::string &) {
+ allowMemoryGrowth = true;
+ })
.add("--emscripten-glue", "-e", "Generate emscripten glue",
Options::Arguments::Zero,
[&generateEmscriptenGlue](Options *, const std::string &) {
@@ -98,6 +105,11 @@ int main(int argc, const char *argv[]) {
});
options.parse(argc, argv);
+ if (allowMemoryGrowth && !generateEmscriptenGlue) {
+ Fatal() << "Error: adding memory growth code without Emscripten glue. "
+ "This doesn't do anything.\n";
+ }
+
auto debugFlag = options.debug ? Flags::Debug : Flags::Release;
auto input(read_file<std::string>(options.extra["infile"], Flags::Text, debugFlag));
@@ -138,6 +150,10 @@ int main(int argc, const char *argv[]) {
std::stringstream meta;
if (generateEmscriptenGlue) {
if (options.debug) std::cerr << "Emscripten gluing..." << std::endl;
+ if (allowMemoryGrowth) {
+ emscripten::generateMemoryGrowthFunction(linker.getOutput().wasm);
+ }
+
// dyncall thunks
linker.emscriptenGlue(meta);
}