summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* Followup to workaround for minification of wasm2js mem init (#2318)Brion Vibber2019-08-3010-30/+30
| | | | | | | | | | | | | Emscripten's minifier mis-minifies a couple bits in the memory init function that's used with wasm2js when not using an external memory init file: https://github.com/emscripten-core/emscripten/issues/8886 Previous fix worked around the bug in one place but failed to account for another. Have now confirmed that it works with this change in place. Updated test cases to match.
* Temporarily build with -Wno-implicit-int-float-conversion (#2315)Sam Clegg2019-08-291-0/+4
| | | | | See #2314
* Update AppVeyor to Visual Studio 2017 (#2316)Derek Schuff2019-08-291-3/+6
| | | Also don't do duplicate builds.
* Add missing new features to the C and JS APIs (#2312)Daniel Wirtz2019-08-288-0/+20
|
* Allow all features on wasm2js and add atomic tests (#2311)Heejin Ahn2019-08-286-15/+113
| | | | | | This adds `-all` argument to wasm2js testing and fixes wasm2js to actually take that argument (currently it doesn't, when it takes a wast file). This also adds a wasm2js test for `atomic.fence` instruction that was added in #2307.
* Add atomic.fence instruction (#2307)Heejin Ahn2019-08-2745-817/+1558
| | | | | | | This adds `atomic.fence` instruction: https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#fence-operator This also fix bugs in `atomic.wait` and `atomic.notify` instructions in binaryen.js and adds tests for them.
* Do not hoist truncation of wasm2js divisions (#2305)Thomas Lively2019-08-264-2/+91
| | | | | | It is not valid to defer the truncation of divisions because accumulated non-integral results can produce different values when they are combined before truncation. This was causing a test failure in the Rust test suite.
* Fix auto_update_tests.py after #2114 (#2306)Sam Clegg2019-08-262-41/+41
|
* Remove test output from source tree (#2114)Sam Clegg2019-08-218-27/+22
|
* Support --version argument in command line tools (#2304)Sam Clegg2019-08-204-7/+52
|
* Add initial support for anyref as an opaque type (#2294)Jay Phelps2019-08-2041-48/+279
| | | | | | | | | | | | | Another round of trying to push upstream things from my fork. This PR only adds support for anyref itself as an opaque type. It does NOT implement the full [reference types proposal](https://github.com/WebAssembly/reference-types/blob/master/proposals/reference-types/Overview.md)--so no table.get/set/grow/etc or ref.null, ref.func, etc. Figured it was easier to review and merge as we go, especially if I did something fundamentally wrong. *** I did put it under the `--enable-reference-types` flag as I imagine that even though this PR doesn't complete the full feature set, it probably is the right home. Lmk if not. I'll also be adding a few github comments to places I want to point out/question.
* Fix infinite loop in AsmConstWalker::visitCall (#2303)Guanzhong Chen2019-08-163-1/+32
|
* Remove code to handle EM_ASM and setjmp/longjmp (#2302)Guanzhong Chen2019-08-163-187/+53
| | | | | | | | | This reverts commit 12add6f17c377de7ac334e8fa7885b61b98f3db4 (#2283). This is done due to the complexity of supporting EM_ASM and setjmp/longjmp, especially with dynamic linking thrown into the mix. In https://reviews.llvm.org/D66356, using EM_ASM and setjmp/longjmp in the same function is now an error.
* Switch python indentation from 2-space to 4-space (#2299)Sam Clegg2019-08-1627-2794/+2792
| | | | | | | | pep8 specifies 4 space indentation. The use of 2 spaces is, I believe a historical anomaly where certain large organizations such as google chose 2 over 4 and have yet to make the switch. Since there isn't too much code in binaryen today it seems reasonable to make the switch.
* wasm2js: Fix switch lowering, don't fall through after the hoisted parts (#2301)Alon Zakai2019-08-168-38/+137
| | | | | The switch lowering will "hoist" blocks of code into the JS switch when it can. If it can hoist some but not others, it must not fall through into those others (while it can fall through the hoisted ones - they began as nested blocks with falling-through between them). To fix this, after the hoisted ones issue a break out of the switch (which now contains all the hoisted code, so breaking out of it gets to the code right after the hoisted ones). fixes #2300
* Upgrade flake8 and run it on python 3 (#2297)Guanzhong Chen2019-08-1310-53/+60
|
* Add basic exception handling support (#2282)Heejin Ahn2019-08-1352-850/+5548
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This adds basic support for exception handling instructions, according to the spec: https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md This PR includes support for: - Binary reading/writing - Wast reading/writing - Stack IR - Validation - binaryen.js + C API - Few IR routines: branch-utils, type-updating, etc - Few passes: just enough to make `wasm-opt -O` pass - Tests This PR does not include support for many optimization passes, fuzzer, or interpreter. They will be follow-up PRs. Try-catch construct is modeled in Binaryen IR in a similar manner to that of if-else: each of try body and catch body will contain a block, which can be omitted if there is only a single instruction. This block will not be emitted in wast or binary, as in if-else. As in if-else, `class Try` contains two expressions each for try body and catch body, and `catch` is not modeled as an instruction. `exnref` value pushed by `catch` is get by `pop` instruction. `br_on_exn` is special: it returns different types of values when taken and not taken. We make `exnref`, the type `br_on_exn` pushes if not taken, as `br_on_exn`'s type.
* Add missing copy in Copier::visitPush (#2295)Heejin Ahn2019-08-111-1/+3
| | | It seems this was missing in #2289.
* Followups to #2292, code cleanups for opt-utils.h (#2293)Alon Zakai2019-08-091-24/+18
|
* Support empty export names in wasm2js and JS mangling in general (#2290)Alon Zakai2019-08-094-0/+81
|
* Duplicate Import Elimination (#2292)Alon Zakai2019-08-099-46/+158
| | | | | | | | | | | | | This is both an optimization and a workaround for the problem that emscripten-core/emscripten#7641 uncovered and had to be reverted because of. What's going on there is that wasm-emscripten-finalize turns emscripten_longjmp_jmpbuf into emscripten_longjmp (for some LLVM internal reason - there's a long comment in the source that I didn't fully follow). There are two such imports already, one for each name, and before that PR, we ended up with just one. After that PR, we end up with two. And with two, the minification of import names gets confused - we have two imports with the same name, and the code there ends up ignoring one of them. I'm not sure why that PR changed things - I guess the wasm-emscripten-finalize code looks at the name, and that PR changed what name appears? @sbc100 maybe #2285 is related? Anyhow, it's not trivial to make import minification code support two identical imports, but I don't think we should - we should avoid having such duplication anyhow. And we should add an assert that they don't exist (I'll open a PR for that later when it's possible). This fixes the duplication by adding a useful pass to remove duplicate imports (just functions, for now). Pretty simple, but we didn't do it yet. Even if there is a wasm-emscripten-finalize bug we need to fix with those duplicate imports, I think this pass is still a good thing to add. I confirmed that this fixes the issue caused by that PR.
* Fix EM_ASM not working with setjmp/longjmp (#2283)Guanzhong Chen2019-08-093-53/+187
|
* Copying fixes (#2289)Alon Zakai2019-08-071-2/+4
| | | | | We didn't have an OverriddenVisitor in the copying code, and sadly unimplemented visitors just return null. That explains the crash in #2288 The missing visitors were push and pop.
* Make auto_update_tests.py support selective updates (#2287)Guanzhong Chen2019-08-071-12/+24
|
* Allow running a portion of binaryen test suite (#2286)Guanzhong Chen2019-08-073-35/+53
|
* wasm-emscripten-finalize: Remove reliance on name section (#2285)Sam Clegg2019-08-063-4/+16
| | | | | | | | There were a couple of places where we were relying on internal names and therefore a name section. After this change wasm-emscripten-finalize works correctly on binaries without a name section at all and only relies on the names of imports and exports.
* Remove trailing whitespaces after 'else' in stack IR (#2284)Heejin Ahn2019-08-063-8/+7
|
* Implement --check-stack-overflow flag for wasm-emscripten-finalize (#2278)Guanzhong Chen2019-08-026-8/+475
|
* Remove `-no-pie` since clang doesn't like it (#2279)Alex Crichton2019-08-021-2/+2
| | | | | | | It appears that the previous PR I had for `clang` didn't actually run on the PR and I forgot to include the removal of `-no-pie` in the PR. Sorry about that! This should fix the CI issues seen [here] [here]: https://travis-ci.org/WebAssembly/binaryen/jobs/566546589
* Revert "Fix EM_ASM not working with setjmp/longjmp (#2271)" (#2277)Alon Zakai2019-08-013-180/+53
| | | | | This reverts commit 692f4666fd116fb7827b53348978f29bba253d47. See details in the reverted PR.
* Compile Linux release binaries with Clang (#2274)Alex Crichton2019-08-011-1/+3
| | | | | | This fixes #2273 for... unknown reasons. The tl;dr; is that the current release binaries built in this Alpine container seem to segfault when run over some wasm files when an exception is thrown, but clang-built binaries magically seems to not segfault!
* Proper Asyncify list name handling (#2275)Alon Zakai2019-07-314-0/+50
| | | | | The lists are comma separated, but the names can have internal commas since they are human-readable. This adds awareness of bracketing things, so void foo(int, double) is parsed as a single function name, properly. Helps emscripten-core/emscripten#9128
* Python3-ify check.py and auto_update_tests.py (#2270)Alon Zakai2019-07-3121-271/+233
| | | | | I fixed flatten.bin.txt which seems to have just had some corrupted data, and I removed some fancy unicode from the spec comments tests, which I'm not sure it's important enough to figure out how to fix. Fixes #1691
* Fix EM_ASM not working with setjmp/longjmp (#2271)Guanzhong Chen2019-07-313-53/+180
| | | | | This fix does not handle dynamic linking, which requires additional work. Refs https://github.com/emscripten-core/emscripten/issues/8894.
* Make sure binaryen.js tests validate (#2269)Heejin Ahn2019-07-2911-12/+61
| | | | | | Without `assert`, even if a test does not validate, the errors will only show up in its corresponding `.txt` file while the test will succeed. This makes sure it errors out when a test fails to validate. This also adds validation checks if there is none.
* Fix stack pointer identification for wasm::ABI::getStackSpace(). (#2243)William Maddox2019-07-283-0/+851
| | | | | | | | * Fix stack pointer identification for wasm::ABI::getStackSpace(). Recent stack pointer simplification in Emscripten broke the --spill-pointers pass. This fix for #2229 restores this functionality by recognizing an alternative coding idiom in Emscripten-generated WASM code.
* wasm2js: Mangle import names for JS (#2267)Alon Zakai2019-07-287-10/+114
| | | | | | | This fixes names that would be invalid in JS, like a.b. Turns out the Go compiler emits wasm with such imports. Also add some docs on how to use wasm2js. Fixes #2263
* Fix extra unreachable generation (#2266)Heejin Ahn2019-07-277-46/+412
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently various expressions handle this differently, and now we consistently follow this rules: --- For all non-control-flow value-returning instructions, if a type of an expression is unreachable, we emit an unreachable and don't emit the instruction itself. If we don't emit an unreachable, instructions that follow can have validation failure in wasm binary format. For example: ``` [unreachable] (f32.add [unreachable] (i32.eqz [unreachable] (unreachable) ) ... ) ``` This is a valid prgram in binaryen IR, because the unreachable type propagates out of an expression, making both i32.eqz and f32.add unreachable. But in binary format, this becomes: ``` unreachable i32.eqz f32.add ;; validation failure; it expects f32 but takes an i32! ``` And here f32.add causes validation failure in wasm validation. So in this case we add an unreachable to prevent following instructions to consume the current value (here i32.eqz). In actual tests, I used `global.get` to an f32 global, which does not return a value, instead of `f32.add`, because `f32.add` itself will not be emitted if one of argument is unreachable. --- So the changes are: - For instructions that don't return a value, removes unreachable emitting code if it exists. - Add the unreachable emitting code for value-returning instructions if there isn't one. - Check for unreachability only once after emitting all children for atomic instructions. Currently only atomic instructions check unreachability after visiting each children and bail out right after, which is valid, but not consistent with others. - Don't emit an extra unreachable after a return (and return_call). I guess it is unnecessary.
* Fix unreachable prefix in instruction printing (#2265)Heejin Ahn2019-07-268-11/+86
| | | | | | | | | When a memory instruction's type is unreachable, i.e., one of its child expressions is unreachable, the instruction will be printed like `unreachable.load`, which is invalid text format. This prints unreachable prefix instruction types as `i32` to just make them pass the parser. It is OK because they are not reachable anyway. Also this removes printing of `?` in atomic.rmw instruction printing.
* Asyncify: whitelist and blacklist support (#2264)Alon Zakai2019-07-268-20/+733
| | | | | | | | | The blacklist means "functions here are to be ignored and not instrumented, we can assume they never unwind." The whitelist means "only these functions, and no others, can unwind." I had hoped such lists would not be necessary, since Asyncify's overhead is much smaller than the old Asyncify and Emterpreter, but as projects have noticed, the overhead to size and speed is still significant. The lists give power users a way to reduce any unnecessary overhead. A slightly tricky thing is escaping of names: we escape names from the names section (see #2261 #1646). The lists arrive in human-readable format, so we escape them before comparing to the internal escaped names. To enable that I refactored wasm-binary a little bit to provide the escaping logic, cc @yurydelendik If both lists are specified, an error is shown (since that is meaningless). If a name appears in a list that is not in the module, we show a warning, which will hopefully help people debug typos etc. I had hoped to make this an error, but the problem is that due to inlining etc. a single list will not always work for both unoptimized and optimized builds (a function may vanish when optimizing, due to duplicate function elimination or inlining). Fixes #2218.
* Enable all features in wasm-shell assert failure tests (#2254)Heejin Ahn2019-07-251-0/+1
| | | | | | | If we don't enable features in assertion failure tests, new feature tests fail not because they are malformed but because they have unsupported features. It's hard to add tests because existing `assert_invalid` tests were already failing because they have unsupported features.
* More push/pop support (#2260)Heejin Ahn2019-07-2410-38/+255
| | | | | | | This adds - `push`/`pop` support for other types: v128 and exnref - `push`/`pop` support for binaryen.js Because binaryen.js follows Binaryen's AST structure, without `pop` in binaryen.js, EH instructions cannot be represented in binaryen.js.
* Remove extra parens from binaryen-c.cpp (NFC) (#2262)Heejin Ahn2019-07-241-21/+21
|
* Fuzz all feature flags, and fix another SignExt issue in the fuzzer (#2259)Alon Zakai2019-07-242-5/+8
|
* Put Extend* opcodes behind SignExt feature. fixes #2257 (#2258)Alon Zakai2019-07-241-1/+1
|
* Add tail-call to the change log (#2253)Thomas Lively2019-07-241-0/+2
|
* Print events in color (#2255)Heejin Ahn2019-07-241-7/+21
| | | | | This prints events in color like other module elements such as globals. This also splits `visitEvent` into two functions to be consistent with `visitGlobals` or `visitFunctions`.
* Allow 0-value events (#2256)Heejin Ahn2019-07-246-12/+11
| | | | Before I disallowed events with no values, but spec does not say anything about it, so I think that restriction is not necessary.
* Finalize tail call support (#2246)Thomas Lively2019-07-2328-139/+758
| | | | Adds tail call support to fuzzer and makes small changes to handle return calls in multiple utilities and passes. Makes larger changes to DAE and inlining passes to properly handle tail calls.
* Upgrade Travis CI system (#2252)Heejin Ahn2019-07-232-5/+9
| | | | | | | This upgrades the OS in the Travis CI to Bionic and GCC version to 7. This also fixes a bug that COMPILER_FLAGS was not correctly added at build time in gcc tests. Somehow this bug hasn't manifested so far, but after upgrading, this failed thread sanitizer tests because -fsanitize=thread was added only at link time and not in build time.