summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm2asm-main.cpp67
-rw-r--r--src/wasm2asm.h9
2 files changed, 40 insertions, 36 deletions
diff --git a/src/wasm2asm-main.cpp b/src/wasm2asm-main.cpp
index 12a802107..c75272b8d 100644
--- a/src/wasm2asm-main.cpp
+++ b/src/wasm2asm-main.cpp
@@ -18,58 +18,57 @@
// wasm2asm console tool
//
-#include "wasm2asm.h"
+
+#include "support/colors.h"
+#include "support/command-line.h"
+#include "support/file.h"
#include "wasm-s-parser.h"
+#include "wasm2asm.h"
using namespace cashew;
using namespace wasm;
-namespace wasm {
-int debug = 0;
-}
-
-int main(int argc, char **argv) {
- debug = getenv("WASM2ASM_DEBUG") ? getenv("WASM2ASM_DEBUG")[0] - '0' : 0;
-
- char *infile = argv[1];
+int main(int argc, const char *argv[]) {
+ Options options("wasm2asm", "Transform .wast files to asm.js");
+ options
+ .add("--output", "-o", "Output file (stdout if not specified)",
+ Options::Arguments::One,
+ [](Options *o, const std::string &argument) {
+ o->extra["output"] = argument;
+ Colors::disable();
+ })
+ .add_positional("INFILE", Options::Arguments::One,
+ [](Options *o, const std::string &argument) {
+ o->extra["infile"] = argument;
+ });
+ options.parse(argc, argv);
- if (debug) std::cerr << "loading '" << infile << "'...\n";
- FILE *f = fopen(argv[1], "r");
- assert(f);
- fseek(f, 0, SEEK_END);
- int size = ftell(f);
- char *input = new char[size+1];
- rewind(f);
- int num = fread(input, 1, size, f);
- // On Windows, ftell() gives the byte position (\r\n counts as two bytes), but when
- // reading, fread() returns the number of characters read (\r\n is read as one char \n, and counted as one),
- // so return value of fread can be less than size reported by ftell, and that is normal.
- assert((num > 0 || size == 0) && num <= size);
- fclose(f);
- input[num] = 0;
+ auto input(
+ read_file<std::vector<char>>(options.extra["infile"], options.debug));
- if (debug) std::cerr << "s-parsing...\n";
- SExpressionParser parser(input);
- Element& root = *parser.root;
+ if (options.debug) std::cerr << "s-parsing..." << std::endl;
+ SExpressionParser parser(input.data());
+ Element &root = *parser.root;
- if (debug) std::cerr << "w-parsing...\n";
+ if (options.debug) std::cerr << "w-parsing..." << std::endl;
AllocatingModule wasm;
SExpressionWasmBuilder builder(wasm, *root[0], [&]() { abort(); });
- if (debug) std::cerr << "asming...\n";
- Wasm2AsmBuilder wasm2asm;
+ if (options.debug) std::cerr << "asming..." << std::endl;
+ Wasm2AsmBuilder wasm2asm(options.debug);
Ref asmjs = wasm2asm.processWasm(&wasm);
- if (debug) {
- std::cerr << "a-printing...\n";
+ if (options.debug) {
+ std::cerr << "a-printing..." << std::endl;
asmjs->stringify(std::cout, true);
std::cout << '\n';
}
- if (debug) std::cerr << "j-printing...\n";
+ if (options.debug) std::cerr << "j-printing..." << std::endl;
JSPrinter jser(true, true, asmjs);
jser.printAst();
- std::cout << jser.buffer << "\n";
+ Output output(options.extra["output"], options.debug);
+ output << jser.buffer << std::endl;
- if (debug) std::cerr << "done.\n";
+ if (options.debug) std::cerr << "done." << std::endl;
}
diff --git a/src/wasm2asm.h b/src/wasm2asm.h
index ad73159e6..69abf9c3f 100644
--- a/src/wasm2asm.h
+++ b/src/wasm2asm.h
@@ -32,8 +32,6 @@
namespace wasm {
-extern int debug;
-
using namespace cashew;
IString ASM_FUNC("asmFunc"),
@@ -106,6 +104,8 @@ void flattenAppend(Ref ast, Ref extra) {
class Wasm2AsmBuilder {
public:
+ Wasm2AsmBuilder(bool debug) : debug(debug), tableSize(-1) {}
+
Ref processWasm(Module* wasm);
Ref processFunction(Function* func);
@@ -171,6 +171,7 @@ public:
}
private:
+ bool debug;
// How many temp vars we need
std::vector<size_t> temps; // type => num temps
// Which are currently free to use
@@ -186,6 +187,10 @@ private:
void addImport(Ref ast, Import *import);
void addTables(Ref ast, Module *wasm);
void addExports(Ref ast, Module *wasm);
+
+ Wasm2AsmBuilder() = delete;
+ Wasm2AsmBuilder(const Wasm2AsmBuilder &) = delete;
+ Wasm2AsmBuilder &operator=(const Wasm2AsmBuilder &) = delete;
};
Ref Wasm2AsmBuilder::processWasm(Module* wasm) {