summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/s2wasm-main.cpp9
-rw-r--r--src/s2wasm.h21
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;