diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-14 14:43:59 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-14 14:43:59 -0800 |
commit | e696560332211216d26e9396033b8ba50af0fa82 (patch) | |
tree | 7305f6cbef226d953687e098b62aa2eabf69d979 /src | |
parent | 4bcda1c61bf9d5138980db34b49a9ccf37d1fd09 (diff) | |
download | binaryen-e696560332211216d26e9396033b8ba50af0fa82.tar.gz binaryen-e696560332211216d26e9396033b8ba50af0fa82.tar.bz2 binaryen-e696560332211216d26e9396033b8ba50af0fa82.zip |
--entry option in binaryen-shell, which lets you call an entry point. also support exit()
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-shell.cpp | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/src/binaryen-shell.cpp b/src/binaryen-shell.cpp index 6000430a5..facc706a4 100644 --- a/src/binaryen-shell.cpp +++ b/src/binaryen-shell.cpp @@ -44,7 +44,11 @@ IString ASSERT_RETURN("assert_return"), ASSERT_INVALID("assert_invalid"), SPECTEST("spectest"), PRINT("print"), - INVOKE("invoke"); + INVOKE("invoke"), + EXIT("exit"); + +struct ExitException { +}; // // Implementation of the shell interpreter execution environment @@ -69,6 +73,9 @@ struct ShellExternalInterface : ModuleInstance::ExternalInterface { std::cout << argument << '\n'; } return Literal(); + } else if (import->module == ENV && import->base == EXIT) { + std::cout << "exit()\n"; + throw ExitException(); } std::cout << "callImport " << import->name.str << "\n"; abort(); @@ -172,9 +179,17 @@ struct Invocation { static void run_asserts(size_t* i, bool* checked, AllocatingModule* wasm, Element* root, std::unique_ptr<SExpressionWasmBuilder>* builder, - bool print_before, bool print_after) { + bool print_before, bool print_after, + Name entry) { auto interface = new ShellExternalInterface(); auto instance = new ModuleInstance(*wasm, interface); + if (entry.is() > 0) { + ModuleInstance::LiteralList arguments; + try { + instance->callExport(entry, arguments); + } catch (ExitException& x) { + } + } while (*i < root->size()) { Element& curr = *(*root)[*i]; IString id = curr[0]->str(); @@ -253,6 +268,7 @@ int main(int argc, char **argv) { bool print_before = false; bool print_after = false; std::vector<std::string> passes; + Name entry; assert(argc > 0 && "expect at least program name as an argument"); for (size_t i = 1, e = argc; i != e; i++) { @@ -271,6 +287,9 @@ int main(int argc, char **argv) { std::cout << " -print-before : print modules before processing them\n"; std::cout << " -print-after : print modules after processing them\n"; std::cout << "\n"; + std::cout << "execution options:\n"; + std::cout << " --entry=[ENTRY] : call ENTRY() after parsing the module\n"; + std::cout << "\n"; std::cout << "passes:\n"; std::cout << " -O : execute default optimization passes\n"; auto allPasses = PassRegistry::get()->getRegisteredNames(); @@ -284,6 +303,8 @@ int main(int argc, char **argv) { passes.push_back("remove-unused-names"); passes.push_back("merge-blocks"); passes.push_back("simplify-locals"); + } else if (arg.substr(0, 7) == "--entry") { + entry = Name(strchr(curr, '=') + 1); } else { // otherwise, assumed to be a pass const char* name = curr + 1; @@ -368,7 +389,7 @@ int main(int argc, char **argv) { } run_asserts(&i, &checked, &wasm, &root, &builder, print_before, - print_after); + print_after, entry); } if (checked) { |