From e696560332211216d26e9396033b8ba50af0fa82 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 14 Jan 2016 14:43:59 -0800 Subject: --entry option in binaryen-shell, which lets you call an entry point. also support exit() --- src/binaryen-shell.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/binaryen-shell.cpp') 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* 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 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) { -- cgit v1.2.3 From 68bf9868afae04d603810c862642c794e8eb998f Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 14 Jan 2016 15:14:07 -0800 Subject: add assert on wasm segments --- src/binaryen-shell.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'src/binaryen-shell.cpp') diff --git a/src/binaryen-shell.cpp b/src/binaryen-shell.cpp index facc706a4..b0965344c 100644 --- a/src/binaryen-shell.cpp +++ b/src/binaryen-shell.cpp @@ -63,6 +63,7 @@ struct ShellExternalInterface : ModuleInstance::ExternalInterface { memory = (char*)calloc(wasm.memory.initial, 1); // apply memory segments for (auto segment : wasm.memory.segments) { + assert(segment.offset + segment.size <= wasm.memory.initial); memcpy(memory + segment.offset, segment.data, segment.size); } } -- cgit v1.2.3