diff options
-rw-r--r-- | src/s2wasm-main.cpp | 9 | ||||
-rw-r--r-- | src/s2wasm.h | 21 |
2 files changed, 22 insertions, 8 deletions
diff --git a/src/s2wasm-main.cpp b/src/s2wasm-main.cpp index 2ef8060ac..c3f3d0a2f 100644 --- a/src/s2wasm-main.cpp +++ b/src/s2wasm-main.cpp @@ -27,6 +27,7 @@ using namespace cashew; using namespace wasm; int main(int argc, const char *argv[]) { + bool ignoreUnknownSymbols = false; Options options("s2wasm", "Link .s file into .wast"); options .add("--output", "-o", "Output file (stdout if not specified)", @@ -35,6 +36,11 @@ int main(int argc, const char *argv[]) { o->extra["output"] = argument; Colors::disable(); }) + .add("--ignore-unknown", "", "Ignore unknown symbols", + Options::Arguments::Zero, + [&ignoreUnknownSymbols](Options *, const std::string &) { + ignoreUnknownSymbols = true; + }) .add("--global-base", "-g", "Where to start to place globals", Options::Arguments::One, [](Options *o, const std::string &argument) { @@ -54,7 +60,8 @@ int main(int argc, const char *argv[]) { ? std::stoull(options.extra["global-base"]) : 1; if (options.debug) std::cerr << "Global base " << globalBase << '\n'; - S2WasmBuilder s2wasm(wasm, input.c_str(), options.debug, globalBase); + S2WasmBuilder s2wasm(wasm, input.c_str(), options.debug, globalBase, + ignoreUnknownSymbols); if (options.debug) std::cerr << "Emscripten gluing..." << std::endl; std::stringstream meta; diff --git a/src/s2wasm.h b/src/s2wasm.h index 8ef1135dd..caf07f965 100644 --- a/src/s2wasm.h +++ b/src/s2wasm.h @@ -36,12 +36,19 @@ cashew::IString EMSCRIPTEN_ASM_CONST("emscripten_asm_const"); class S2WasmBuilder { AllocatingModule& wasm; MixedArena& allocator; - const char *s; + const char* s; bool debug; - -public: - S2WasmBuilder(AllocatingModule& wasm, const char* input, bool debug, size_t globalBase) - : wasm(wasm), allocator(wasm.allocator), debug(debug), globalBase(globalBase), nextStatic(globalBase) { + bool ignoreUnknownSymbols; + + public: + S2WasmBuilder(AllocatingModule& wasm, const char* input, bool debug, + size_t globalBase, bool ignoreUnknownSymbols) + : wasm(wasm), + allocator(wasm.allocator), + debug(debug), + ignoreUnknownSymbols(ignoreUnknownSymbols), + globalBase(globalBase), + nextStatic(globalBase) { s = input; scan(); s = input; @@ -50,7 +57,7 @@ public: fix(); } -private: + private: // state size_t globalBase, // where globals can start to be statically allocated, i.e., the data segment @@ -1156,7 +1163,7 @@ private: // must be a function address if (wasm.functionsMap.count(name) == 0) { std::cerr << "Unknown symbol: " << name << '\n'; - abort(); + if (!ignoreUnknownSymbols) abort(); } ensureFunctionIndex(name); *(relocation.data) = functionIndexes[name] + relocation.offset; |