diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-01-14 17:50:26 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-01-14 17:50:26 -0800 |
commit | 5192fc38ca377939b4411f52e73e1a4bc3127d2d (patch) | |
tree | 7d410383c76d05d5a306ad46f5d65dce1aa7f2dc | |
parent | 30abeaa9e2151cd5d7b0ad730ee26eec12d69636 (diff) | |
parent | 831f8e982fdaa447950571b5e5cc5d179aa132cc (diff) | |
download | binaryen-5192fc38ca377939b4411f52e73e1a4bc3127d2d.tar.gz binaryen-5192fc38ca377939b4411f52e73e1a4bc3127d2d.tar.bz2 binaryen-5192fc38ca377939b4411f52e73e1a4bc3127d2d.zip |
Merge pull request #104 from WebAssembly/more-torture
More torture
-rwxr-xr-x | check.py | 17 | ||||
-rw-r--r-- | src/binaryen-shell.cpp | 28 | ||||
-rw-r--r-- | src/wasm-s-parser.h | 3 | ||||
-rw-r--r-- | test/s2wasm_known_binaryen_shell_test_failures.txt | 290 |
4 files changed, 335 insertions, 3 deletions
@@ -276,6 +276,23 @@ if torture: fails=os.path.abspath(os.path.join('test', 's2wasm_known_gcc_test_failures.txt')), out=s2wasm_torture_out) assert os.path.isdir(s2wasm_torture_out), 'Expected output directory %s' % s2wasm_torture_out + # execute it TODO: parallelize, use waterfall + known_failures = set(open(os.path.join('test', 's2wasm_known_binaryen_shell_test_failures.txt')).read().split('\n')) + total = 0 + bad_failures = [] + for wast in sorted(os.listdir(s2wasm_torture_out)): + total += 1 + cmd = [os.path.join('bin', 'binaryen-shell'), os.path.join(s2wasm_torture_out, wast), '--entry=main'] + print ' '.join(cmd) + try: + subprocess.check_call(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except: + if wast not in known_failures: + bad_failures.append(wast) + if len(bad_failures) > 0: + print '\nbad failures:\n' + print '\n'.join(bad_failures) + raise Exception('bad failures :( %d out of %d' % (len(bad_failures), total)) shutil.rmtree(s2wasm_torture_out) if unexpected_result_count: fail(unexpected_result_count, 0) diff --git a/src/binaryen-shell.cpp b/src/binaryen-shell.cpp index 6000430a5..b0965344c 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 @@ -59,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); } } @@ -69,6 +74,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 +180,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 +269,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 +288,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 +304,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 +390,7 @@ int main(int argc, char **argv) { } run_asserts(&i, &checked, &wasm, &root, &builder, print_before, - print_after); + print_after, entry); } if (checked) { diff --git a/src/wasm-s-parser.h b/src/wasm-s-parser.h index 1fb126ad0..242a4b5a9 100644 --- a/src/wasm-s-parser.h +++ b/src/wasm-s-parser.h @@ -964,12 +964,15 @@ private: } else if (input[1] == '\\') { *write++ = '\\'; input += 2; + continue; } else if (input[1] == 'n') { *write++ = '\n'; input += 2; + continue; } else if (input[1] == 't') { *write++ = '\t'; input += 2; + continue; } else { *write++ = (char)(unhex(input[1])*16 + unhex(input[2])); input += 3; diff --git a/test/s2wasm_known_binaryen_shell_test_failures.txt b/test/s2wasm_known_binaryen_shell_test_failures.txt new file mode 100644 index 000000000..54739a8f4 --- /dev/null +++ b/test/s2wasm_known_binaryen_shell_test_failures.txt @@ -0,0 +1,290 @@ +20000412-2.c.s.wast +20000412-4.c.s.wast +20000528-1.c.s.wast +20000801-1.c.s.wast +20000910-2.c.s.wast +20001111-1.c.s.wast +20001124-1.c.s.wast +20001228-1.c.s.wast +20010116-1.c.s.wast +20010518-2.c.s.wast +20010915-1.c.s.wast +20011024-1.c.s.wast +20020206-2.c.s.wast +20020402-2.c.s.wast +20020406-1.c.s.wast +20020413-1.c.s.wast +20021011-1.c.s.wast +20021015-1.c.s.wast +20021120-3.c.s.wast +20021204-1.c.s.wast +20021219-1.c.s.wast +20030125-1.c.s.wast +20030218-1.c.s.wast +20030221-1.c.s.wast +20030222-1.c.s.wast +20030313-1.c.s.wast +20030626-2.c.s.wast +20030916-1.c.s.wast +20031012-1.c.s.wast +20031201-1.c.s.wast +20031204-1.c.s.wast +20040218-1.c.s.wast +20041114-1.c.s.wast +20041124-1.c.s.wast +20041126-1.c.s.wast +20050125-1.c.s.wast +20050203-1.c.s.wast +20050218-1.c.s.wast +20050502-1.c.s.wast +20050502-2.c.s.wast +20050826-1.c.s.wast +20051113-1.c.s.wast +20060110-1.c.s.wast +20060420-1.c.s.wast +20060905-1.c.s.wast +20060930-2.c.s.wast +20070201-1.c.s.wast +20070517-1.c.s.wast +20071018-1.c.s.wast +20071029-1.c.s.wast +20071030-1.c.s.wast +20071120-1.c.s.wast +20071202-1.c.s.wast +20071219-1.c.s.wast +20080122-1.c.s.wast +20080502-1.c.s.wast +20080522-1.c.s.wast +20080604-1.c.s.wast +20081218-1.c.s.wast +20090814-1.c.s.wast +20100708-1.c.s.wast +20101011-1.c.s.wast +20101013-1.c.s.wast +20111208-1.c.s.wast +20111212-1.c.s.wast +20120105-1.c.s.wast +20120808-1.c.s.wast +20120919-1.c.s.wast +20121108-1.c.s.wast +20131127-1.c.s.wast +20140425-1.c.s.wast +920501-9.c.s.wast +920612-1.c.s.wast +920711-1.c.s.wast +920909-1.c.s.wast +930513-1.c.s.wast +930930-2.c.s.wast +931110-1.c.s.wast +941014-2.c.s.wast +950710-1.c.s.wast +950915-1.c.s.wast +960215-1.c.s.wast +960327-1.c.s.wast +960405-1.c.s.wast +960521-1.c.s.wast +980506-3.c.s.wast +980605-1.c.s.wast +980612-1.c.s.wast +981206-1.c.s.wast +990106-2.c.s.wast +990222-1.c.s.wast +990404-1.c.s.wast +990513-1.c.s.wast +990628-1.c.s.wast +991112-1.c.s.wast +991228-1.c.s.wast +align-2.c.s.wast +alloca-1.c.s.wast +anon-1.c.s.wast +bcp-1.c.s.wast +bitfld-1.c.s.wast +bitfld-3.c.s.wast +builtin-constant.c.s.wast +builtin-prefetch-2.c.s.wast +const-addr-expr-1.c.s.wast +eeprof-1.c.s.wast +index-1.c.s.wast +ipa-sra-1.c.s.wast +ipa-sra-2.c.s.wast +loop-2f.c.s.wast +loop-2g.c.s.wast +loop-9.c.s.wast +medce-1.c.s.wast +memcpy-1.c.s.wast +memcpy-2.c.s.wast +memcpy-bi.c.s.wast +memset-1.c.s.wast +memset-2.c.s.wast +memset-3.c.s.wast +packed-1.c.s.wast +packed-2.c.s.wast +pending-4.c.s.wast +pr15296.c.s.wast +pr20100-1.c.s.wast +pr20527-1.c.s.wast +pr22493-1.c.s.wast +pr23047.c.s.wast +pr27073.c.s.wast +pr27260.c.s.wast +pr27285.c.s.wast +pr28403.c.s.wast +pr28651.c.s.wast +pr29006.c.s.wast +pr32244-1.c.s.wast +pr32500.c.s.wast +pr33142.c.s.wast +pr33992.c.s.wast +pr34176.c.s.wast +pr34456.c.s.wast +pr34971.c.s.wast +pr35472.c.s.wast +pr36038.c.s.wast +pr36321.c.s.wast +pr36339.c.s.wast +pr36343.c.s.wast +pr36691.c.s.wast +pr36765.c.s.wast +pr37573.c.s.wast +pr37882.c.s.wast +pr37924.c.s.wast +pr38212.c.s.wast +pr38236.c.s.wast +pr39120.c.s.wast +pr39228.c.s.wast +pr40022.c.s.wast +pr40493.c.s.wast +pr40657.c.s.wast +pr41239.c.s.wast +pr41395-1.c.s.wast +pr41395-2.c.s.wast +pr41463.c.s.wast +pr42512.c.s.wast +pr42614.c.s.wast +pr42691.c.s.wast +pr43008.c.s.wast +pr43236.c.s.wast +pr43784.c.s.wast +pr43835.c.s.wast +pr44164.c.s.wast +pr44202-1.c.s.wast +pr44852.c.s.wast +pr45070.c.s.wast +pr47237.c.s.wast +pr47337.c.s.wast +pr49123.c.s.wast +pr49218.c.s.wast +pr49279.c.s.wast +pr51466.c.s.wast +pr51581-1.c.s.wast +pr51877.c.s.wast +pr51933.c.s.wast +pr52760.c.s.wast +pr52979-1.c.s.wast +pr52979-2.c.s.wast +pr53688.c.s.wast +pr54471.c.s.wast +pr54985.c.s.wast +pr56799.c.s.wast +pr56982.c.s.wast +pr57124.c.s.wast +pr57131.c.s.wast +pr57344-3.c.s.wast +pr57344-4.c.s.wast +pr57860.c.s.wast +pr57877.c.s.wast +pr58365.c.s.wast +pr58419.c.s.wast +pr59229.c.s.wast +pr59358.c.s.wast +pr60017.c.s.wast +pr60960.c.s.wast +pr61375.c.s.wast +pr63659.c.s.wast +printf-1.c.s.wast +regstack-1.c.s.wast +simd-1.c.s.wast +simd-2.c.s.wast +simd-5.c.s.wast +strcmp-1.c.s.wast +strcpy-1.c.s.wast +string-opt-17.c.s.wast +string-opt-18.c.s.wast +string-opt-5.c.s.wast +strlen-1.c.s.wast +strncmp-1.c.s.wast +struct-aliasing-1.c.s.wast +struct-cpy-1.c.s.wast +struct-ini-1.c.s.wast +switch-1.c.s.wast +vrp-1.c.s.wast +vrp-2.c.s.wast +vrp-3.c.s.wast +vrp-5.c.s.wast +vrp-6.c.s.wast +zerolen-1.c.s.wast +pr57144.c.s.wast +pr57281.c.s.wast +pr57321.c.s.wast +pr57344-1.c.s.wast +pr57344-2.c.s.wast +pr57829.c.s.wast +pr57861.c.s.wast +pr57875.c.s.wast +pr58209.c.s.wast +pr58277-2.c.s.wast +pr58364.c.s.wast +pr58385.c.s.wast +pr58387.c.s.wast +pr58431.c.s.wast +pr58564.c.s.wast +pr58570.c.s.wast +pr58574.c.s.wast +pr58640-2.c.s.wast +pr58662.c.s.wast +pr58726.c.s.wast +pr58831.c.s.wast +pr58943.c.s.wast +pr58984.c.s.wast +pr59014-2.c.s.wast +pr59014.c.s.wast +pr59101.c.s.wast +pr59221.c.s.wast +pr59387.c.s.wast +pr59388.c.s.wast +pr59413.c.s.wast +pr59747.c.s.wast +pr60062.c.s.wast +pr60072.c.s.wast +pr60454.c.s.wast +pr61306-1.c.s.wast +pr61306-2.c.s.wast +pr61306-3.c.s.wast +pr61725.c.s.wast +pr63302.c.s.wast +pr7284-1.c.s.wast +ptr-arith-1.c.s.wast +pure-1.c.s.wast +pushpop_macro.c.s.wast +restrict-1.c.s.wast +scope-1.c.s.wast +shiftdi.c.s.wast +shiftopt-1.c.s.wast +simd-4.c.s.wast +strct-pack-1.c.s.wast +strct-pack-2.c.s.wast +strct-pack-3.c.s.wast +struct-ini-2.c.s.wast +struct-ini-3.c.s.wast +struct-ini-4.c.s.wast +struct-ret-2.c.s.wast +tstdi-1.c.s.wast +unroll-1.c.s.wast +usmul.c.s.wast +vrp-7.c.s.wast +wchar_t-1.c.s.wast +widechar-1.c.s.wast +widechar-2.c.s.wast +zero-struct-1.c.s.wast +zero-struct-2.c.s.wast +zerolen-2.c.s.wast |