summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/asm2wasm.cpp28
-rw-r--r--src/tools/wasm-shell.cpp37
2 files changed, 50 insertions, 15 deletions
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp
index 7f1a07d1d..031b1fd23 100644
--- a/src/tools/asm2wasm.cpp
+++ b/src/tools/asm2wasm.cpp
@@ -21,6 +21,7 @@
#include "support/colors.h"
#include "support/command-line.h"
#include "support/file.h"
+#include "wasm-builder.h"
#include "wasm-printing.h"
#include "asm2wasm.h"
@@ -40,9 +41,13 @@ int main(int argc, const char *argv[]) {
o->extra["output"] = argument;
Colors::disable();
})
- .add("--mapped-globals", "-m", "Mapped globals", Options::Arguments::One,
+ .add("--mapped-globals", "-n", "Mapped globals", Options::Arguments::One,
[](Options *o, const std::string &argument) {
- o->extra["mapped globals"] = argument;
+ std::cerr << "warning: the --mapped-globals/-m option is deprecated (a mapped globals file is no longer needed as we use wasm globals)" << std::endl;
+ })
+ .add("--mem-init", "-t", "Import a memory initialization file into the output module", Options::Arguments::One,
+ [](Options *o, const std::string &argument) {
+ o->extra["mem init"] = argument;
})
.add("--total-memory", "-m", "Total memory size", Options::Arguments::One,
[](Options *o, const std::string &argument) {
@@ -62,10 +67,6 @@ int main(int argc, const char *argv[]) {
});
options.parse(argc, argv);
- const auto &mg_it = options.extra.find("mapped globals");
- const char *mappedGlobals =
- mg_it == options.extra.end() ? nullptr : mg_it->second.c_str();
-
const auto &tm_it = options.extra.find("total memory");
size_t totalMemory =
tm_it == options.extra.end() ? 16 * 1024 * 1024 : atoi(tm_it->second.c_str());
@@ -95,15 +96,18 @@ int main(int argc, const char *argv[]) {
Asm2WasmBuilder asm2wasm(wasm, pre.memoryGrowth, options.debug, imprecise, opts);
asm2wasm.processAsm(asmjs);
+ // import mem init file, if provided
+ const auto &memInit = options.extra.find("mem init");
+ if (memInit != options.extra.end()) {
+ auto filename = memInit->second.c_str();
+ auto data(read_file<std::vector<char>>(filename, Flags::Binary, options.debug ? Flags::Debug : Flags::Release));
+ // create the memory segment
+ wasm.memory.segments.emplace_back(Builder(wasm).makeGetGlobal(Name("memoryBase"), i32), data);
+ }
+
if (options.debug) std::cerr << "printing..." << std::endl;
Output output(options.extra["output"], Flags::Text, options.debug ? Flags::Debug : Flags::Release);
WasmPrinter::printModule(&wasm, output.getStream());
- if (mappedGlobals) {
- if (options.debug)
- std::cerr << "serializing mapped globals..." << std::endl;
- asm2wasm.serializeMappedGlobals(mappedGlobals);
- }
-
if (options.debug) std::cerr << "done." << std::endl;
}
diff --git a/src/tools/wasm-shell.cpp b/src/tools/wasm-shell.cpp
index 72e8e13ba..a95ced87f 100644
--- a/src/tools/wasm-shell.cpp
+++ b/src/tools/wasm-shell.cpp
@@ -125,14 +125,19 @@ static void run_asserts(size_t* i, bool* checked, Module* wasm,
// maybe parsed ok, but otherwise incorrect
invalid = !WasmValidator().validate(wasm);
}
- assert(invalid);
+ if (!invalid) {
+ Colors::red(std::cerr);
+ std::cerr << "[should have been invalid]\n";
+ Colors::normal(std::cerr);
+ std::cerr << &wasm << '\n';
+ abort();
+ }
} else if (id == INVOKE) {
assert(wasm);
Invocation invocation(curr, instance.get(), *builder->get());
invocation.invoke();
- } else {
+ } else if (wasm) { // if no wasm, we skipped the module
// an invoke test
- assert(wasm);
bool trapped = false;
WASM_UNUSED(trapped);
Literal result;
@@ -169,6 +174,7 @@ static void run_asserts(size_t* i, bool* checked, Module* wasm,
int main(int argc, const char* argv[]) {
Name entry;
+ std::set<size_t> skipped;
Options options("wasm-shell", "Execute .wast files");
options
@@ -176,6 +182,21 @@ int main(int argc, const char* argv[]) {
"--entry", "-e", "call the entry point after parsing the module",
Options::Arguments::One,
[&entry](Options*, const std::string& argument) { entry = argument; })
+ .add(
+ "--skip", "-s", "skip input on certain lines (comma-separated-list)",
+ Options::Arguments::One,
+ [&skipped](Options*, const std::string& argument) {
+ size_t i = 0;
+ while (i < argument.size()) {
+ auto ending = argument.find(',', i);
+ if (ending == std::string::npos) {
+ ending = argument.size();
+ }
+ auto sub = argument.substr(i, ending - i);
+ skipped.insert(atoi(sub.c_str()));
+ i = ending + 1;
+ }
+ })
.add_positional("INFILE", Options::Arguments::One,
[](Options* o, const std::string& argument) {
o->extra["infile"] = argument;
@@ -195,9 +216,19 @@ int main(int argc, const char* argv[]) {
size_t i = 0;
while (i < root.size()) {
Element& curr = *root[i];
+ if (skipped.count(curr.line) > 0) {
+ Colors::green(std::cerr);
+ std::cerr << "SKIPPING [line: " << curr.line << "]\n";
+ Colors::normal(std::cerr);
+ i++;
+ continue;
+ }
IString id = curr[0]->str();
if (id == MODULE) {
if (options.debug) std::cerr << "parsing s-expressions to wasm...\n";
+ Colors::green(std::cerr);
+ std::cerr << "BUILDING MODULE [line: " << curr.line << "]\n";
+ Colors::normal(std::cerr);
Module wasm;
std::unique_ptr<SExpressionWasmBuilder> builder;
builder = wasm::make_unique<SExpressionWasmBuilder>(wasm, *root[i]);