summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-14 14:43:59 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-14 14:43:59 -0800
commite696560332211216d26e9396033b8ba50af0fa82 (patch)
tree7305f6cbef226d953687e098b62aa2eabf69d979 /src
parent4bcda1c61bf9d5138980db34b49a9ccf37d1fd09 (diff)
downloadbinaryen-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.cpp27
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) {