summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2016-01-14 17:50:26 -0800
committerAlon Zakai <alonzakai@gmail.com>2016-01-14 17:50:26 -0800
commit5192fc38ca377939b4411f52e73e1a4bc3127d2d (patch)
tree7d410383c76d05d5a306ad46f5d65dce1aa7f2dc
parent30abeaa9e2151cd5d7b0ad730ee26eec12d69636 (diff)
parent831f8e982fdaa447950571b5e5cc5d179aa132cc (diff)
downloadbinaryen-5192fc38ca377939b4411f52e73e1a4bc3127d2d.tar.gz
binaryen-5192fc38ca377939b4411f52e73e1a4bc3127d2d.tar.bz2
binaryen-5192fc38ca377939b4411f52e73e1a4bc3127d2d.zip
Merge pull request #104 from WebAssembly/more-torture
More torture
-rwxr-xr-xcheck.py17
-rw-r--r--src/binaryen-shell.cpp28
-rw-r--r--src/wasm-s-parser.h3
-rw-r--r--test/s2wasm_known_binaryen_shell_test_failures.txt290
4 files changed, 335 insertions, 3 deletions
diff --git a/check.py b/check.py
index c9a44a4b0..15804b53e 100755
--- a/check.py
+++ b/check.py
@@ -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