summaryrefslogtreecommitdiff
path: root/test
Commit message (Collapse)AuthorAgeFilesLines
* [NFC] Rewrite PossibleContents::combine to be static (#5192)Alon Zakai2022-10-281-4/+11
| | | | | This makes the logic symmetric and easier to read. Measuring speed, this seems identical to before, so that concern seems fine.
* [Wasm GC] Fix the depth of the new array heap type (#5186)Alon Zakai2022-10-282-1/+62
|
* [C API] Add essential heap type utilities (#5160)dcode2022-10-261-21/+54
| | | | | | | | | | Adds heap type utility to the C API: BinaryenHeapTypeIsBasic BinaryenHeapTypeIsSignature BinaryenHeapTypeIsStruct BinaryenHeapTypeIsArray BinaryenHeapTypeIsSubType
* Move removable code in CodePushing (#5187)Alon Zakai2022-10-251-0/+48
| | | | | | | | | | | | | | | | | | | | This is safe since we "partially remove" it: we don't move it to a place it might execute more, but make it possibly execute less. See the new comment for more details. Motivated by wasm GC but this can help wasm MVP as well. In both cases loads from memory can trap, which limits what the VM can do to optimize them past conditions, but in trapsNeverHappens we can do that at the toolchain level: x = read(); if () { .. } use(x); => if () { .. } x = read(); // moved to here, and might not execute if the if did a break/return use(x);
* [Parser] Parse `return` (#5181)Thomas Lively2022-10-251-20/+77
| | | | | | | | | Unlike in the legacy parser, we cannot depend on the folded text format to determine how many values to return, so we determine that solely based on the current function context. To handle multivalue return correctly, fix a bug in which we could synthesize new `unreachable`s and place them before existing unreachable instructions (like returns) at the end of instruction sequences.
* [Parser] Parse `memory.copy` and `memory.fill` (#5178)Thomas Lively2022-10-211-0/+66
|
* [Wasm GC] Support BrOn* in CodePushing (#5177)Alon Zakai2022-10-211-0/+80
|
* Fix fuzzer to ignore externalize/internalize (#5176)Alon Zakai2022-10-212-54/+59
| | | | | The fuzzer started to fail on the recent externalize/internalize test that was added in #5175 as we lack interpreter support. Move that to a separate file and ignore it in the fuzzer for now.
* [Parser] Parse loads and stores (#5174)Thomas Lively2022-10-211-3/+218
| | | | | | | | | | Add parsing functions for `memarg`s, the offset and align fields of load and store instructions. These fields are interesting because they are lexically reserved words that need to be further parsed to extract their actual values. On top of that, add support for parsing all of the load and store instructions. This required fixing a buffer overflow problem in the generated parser code and adding more information to the signatures of the SIMD load and store instructions. `SIMDLoadStoreLane` instructions are particularly interesting because they may require backtracking to parse correctly.
* [Wasm GC] Externalize/Internalize allow nulls (#5175)Alon Zakai2022-10-211-0/+54
| | | | | These are encoded as RefAs operations, and we have optimizations that assume those trap on null, but Externalize/Internalize do not. Skip them there to avoid an error on the type being incorrect later.
* [Parser] Parse shared memory declarations (#5173)Thomas Lively2022-10-211-4/+4
|
* [Parser] Parse `memory.size` and `memory.grow` (#5165)Thomas Lively2022-10-201-0/+51
| | | | | Also add the ability to parse memory indexes to correctly handle the multi-memory versions of these instructions. Add and use a conversion from `Result` to `MaybeResult` as well.
* [Parser] Parse memories (#5164)Thomas Lively2022-10-191-0/+20
| | | | | | | Parse 32-bit and 64-bit memories, including their initial and max sizes. Shared memories are left to a follow-up PR. The memory abbreviation that includes inline data is parsed, but the associated data segment is not yet created. Also do some minor simplifications in neighboring helper functions for other kinds of module elements.
* [Parser] Parse SIMD ternary expressions and shifts (#5158)Thomas Lively2022-10-191-2/+30
|
* [Wasm GC] Use Cones in GUFA data reads and writes (#5157)Alon Zakai2022-10-191-14/+4
| | | | | | | | | | | When we read from a struct/array using a cone type, read from the types in the cone and nothing else. Previously we used the declared type in the wasm, which might be larger (both in the base type and the depth). Likewise, in a write. To do this, this extends ConeReadLocation with a depth (previously the depth there was assumed to be infinite, and now it is to a potentially limited depth). After this we are fully utilizing cone types in GUFA, as the test changes show (or at least I can't think of any other uses of cones).
* [C API] Align I31ref and Dataref to be nullable (#5153)dcode2022-10-192-6/+6
| | | The C API still returned non nullable types for `dataref` (`ref data` instead of `ref null data`) and `i31ref` (`ref i31` instead of `ref null i31`). This PR aligns with the current state of the GC proposal, making them nullable when obtained via the C API.
* [Parser] Parse SIMD lane manipulation instructions (#5156)Thomas Lively2022-10-191-0/+40
| | | Including all `SIMDExtract`, `SIMDReplace`, `SIMDShuffle` expressions.
* [Parser] Parse global.get and global.set (#5155)Thomas Lively2022-10-191-2/+12
| | | | Also add some missing error checking for the similar local instructions and make some neighboring styling more consistent.
* [Wasm GC] Filter GUFA expression locations by their type (#5149)Alon Zakai2022-10-182-2/+107
| | | | | | | | | | | | | | | | | Now that we have a cone type, we are able to represent in PossibleContents the natural content of a wasm location: a type or any of its subtypes. This allows us to enforce the wasm typing rules, that is, to filter the data arriving at a location by the wasm type of the location. Technically this could be unnecessary if we had full implementations of flowFoo and so forth, that is, tailored code for each wasm expression that makes sure we only contain and flow content that fits in the wasm type. Atm we don't have that, and until the wasm spec stabilizes it's probably not worth the effort. Instead, simply filter based on the type, which gives the same result (though it does take a little more work; I measured it at 3% or so of runtime). While doing so normalize cones to their actual maximum depth, which simplifies things and will help more later as well.
* [C API] Add bottom heap types and array heap type (#5150)dcode2022-10-182-0/+42
| | | Adds `BinaryenHeapTypeNone`, `BinaryenHeapTypeNoext` and `BinaryenHeapTypeNofunc` to obtain the bottom heap types. Also adds `BinaryenHeapTypeIsBottom` to test whether a given heap type is a bottom type, and `BinaryenHeapTypeGetBottom` to obtain the respective bottom type given a heap type.
* Parse and emit `array.len` without a type annotation (#5151)Thomas Lively2022-10-1810-19/+53
| | | Test that we can still parse the old annotated form as well.
* Implement `array` basic heap type (#5148)Thomas Lively2022-10-185-43/+136
| | | | | | | | | `array` is the supertype of all defined array types and for now is a subtype of `data`. (Once `data` becomes `struct` this will no longer be true.) Update the binary and text parsing of `array.len` to ignore the obsolete type annotation and update the binary emitting to emit a zero in place of the old type annotation and the text printing to print an arbitrary heap type for the annotation. A follow-on PR will add support for the newer unannotated version of `array.len`.
* Exhaustively test basic heap type relationships (#5147)Thomas Lively2022-10-171-0/+199
| | | | | | As the number of basic heap types has grown, the complexity of the subtype and LUB calculations has grown as well. To ensure that they are correct, test the complete matrix of basic types and trivial user-defined types. Fix the subtype calculation to make string types subtypes of `any` to make the test pass.
* [GUFA] Add some tests for #5142 (#5146)Alon Zakai2022-10-171-0/+130
|
* Binary format: Don't emit empty Memory sections (#5145)Alon Zakai2022-10-173-2/+12
| | | | If the only memories are imported, we don't need the section. We were already doing that for tables, functions, etc.
* [Wasm GC][GUFA] Avoid Many in roots (#5142)Alon Zakai2022-10-131-13/+13
| | | Instead of Many, use a proper Cone Type for the data, as appropriate.
* [Parser] Validate type annotations on `select` (#5139)Thomas Lively2022-10-131-1/+1
| | | | | Since the type annotations are not stored explicitly in Binaryen IR, we have to validate them in the parser. Implement this and fix a newly-caught incorrect annotation in the tests.
* Add "struct" and "structref" as an alias for "data" and "dataref" (#5141)Thomas Lively2022-10-131-0/+13
| | | | | | | In the upstream spec, `data` has been replaced with a type called `struct`. To allow for a graceful update in Binaryen, start by introducing "struct" as an alias for "data". Once users have stopped emitting `data` directly, future PRs will remove `data` and update the subtyping so that arrays are no longer subtypes of `struct`.
* [Parser] Parse `local.set` and `local.tee` (#5138)Thomas Lively2022-10-131-3/+6
|
* [Wasm GC] Add a getMaxDepths() helper for heap types (#5134)Alon Zakai2022-10-131-0/+29
| | | | | | This computes how deep the children of a heap type are. This will be useful in cone type optimizations, since we want to "normalize" cones: a cone of depth infinity can just be a cone of the actual maximum depth of existing children, etc., and it's simpler to have a single canonical representation to avoid extra work.
* [Parser] Parse `local.get` (#5137)Thomas Lively2022-10-131-44/+100
| | | | | This requires parsing local indices and fixing a bug in `Function::setLocalName` where it only set up the mapping from index to name and not the mapping from name to index.
* [Wasm GC] Add GUFA tests for struct reads from cones (#5135)Alon Zakai2022-10-131-0/+631
| | | We had cone tests for ref.eq and ref.cast etc. but not for struct.get.
* [Parser] Parse instructions with children (#5129)Thomas Lively2022-10-121-6/+459
| | | | | Parse unary, binary, drop, and select instructions, properly fixing up stacky code, unreachable code, and multivalue code so it can be represented in Binaryen IR.
* [Wasm GC] Add a method to traverse subtypes (#5131)Alon Zakai2022-10-121-0/+51
| | | This will be useful in further cone type optimizations.
* [Wasm GC] Fix the intersection of a bottom type null (#5128)Alon Zakai2022-10-121-0/+9
| | | | | When the heap types are not subtypes of each other, but a null is possible, the intersection exists and is a null. That null must be the shared bottom type.
* [Wasm GC] [GUFA] Add initial ConeType support (#5116)Alon Zakai2022-10-112-92/+711
| | | | | | | | | | | A cone type is a PossibleContents that has a base type and a depth, and it contains all subtypes up to that depth. So depth 0 is an exact type from before, etc. This only adds cone type computations when combining types, that is, when we combine two exact types we might get a cone, etc. This does not yet use the cone info in all places (like struct gets and sets), and it does not yet define roots of cone types, all of which is left for later. IOW this is the MVP of cone types that is just enough to add them + pass tests + test the new functionality.
* Support null characters in string.const expressions (#5123)Thomas Lively2022-10-111-3/+7
| | | | Remove an obsolete error about null characters and test both binary and text round tripping of a string constant containing an escaped zero byte.
* Make `Name` a pointer, length pair (#5122)Thomas Lively2022-10-111-2/+2
| | | | | | | | | | | | | | | | | | | | | | | With the goal of supporting null characters (i.e. zero bytes) in strings. Rewrite the underlying interned `IString` to store a `std::string_view` rather than a `const char*`, reduce the number of map lookups necessary to intern a string, and present a more immutable interface. Most importantly, replace the `c_str()` method that returned a `const char*` with a `toString()` method that returns a `std::string`. This new method can correctly handle strings containing null characters. A `const char*` can still be had by calling `data()` on the `std::string_view`, although this usage should be discouraged. This change is NFC in spirit, although not in practice. It does not intend to support any particular new functionality, but it is probably now possible to use strings containing null characters in at least some cases. At least one parser bug is also incidentally fixed. Follow-on PRs will explicitly support and test strings containing nulls for particular use cases. The C API still uses `const char*` to represent strings. As strings containing nulls become better supported by the rest of Binaryen, this will no longer be sufficient. Updating the C and JS APIs to use pointer, length pairs is left as future work.
* [Parser] Parse folded instructions (#5124)Thomas Lively2022-10-111-0/+60
| | | | | | | | | | | | | | | Parse folded expressions as described in the spec: https://webassembly.github.io/spec/core/text/instructions.html#folded-instructions. The old binaryen parser _only_ parses folded expressions, and furthermore requires them to be folded such that a parent instruction consumes the values produced by its children and only those values. The standard format is much more general and allows folded instructions to have an arbitrary number of children independent of dataflow. To prevent the rest of the parser from having to know or care about the difference between folded and unfolded instructions, parse folded instructions after their children have been parsed. This means that a sequence of instructions is always parsed in the order they would appear in a binary no matter how they are folded (or not folded).
* GUFA: Use SSA-style information (#5121)Alon Zakai2022-10-074-51/+147
| | | | | | | | | | | | | | | | | Previously we treated each local index as a location, and every local.set to that index could be read by every local.get. With this we connect only relevant sets to gets. Practically speaking, this removes LocalLocation which is what was just described, and instead there is ParamLocation for incoming parameter values. And local.get/set use normal ExpressionLocations to connect a set to a get. I was worried this would be slow, since computing LocalGraph takes time, but it actually more than makes up for itself on J2Wasm and we are faster actually rocket I guess since we do less updating after local.sets. This makes a noticeable change on the J2Wasm binary, and perhaps will help with benchmarks.
* Implement bottom heap types (#5115)Thomas Lively2022-10-0790-1760/+1946
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | These types, `none`, `nofunc`, and `noextern` are uninhabited, so references to them can only possibly be null. To simplify the IR and increase type precision, introduce new invariants that all `ref.null` instructions must be typed with one of these new bottom types and that `Literals` have a bottom type iff they represent null values. These new invariants requires several additional changes. First, it is now possible that the `ref` or `target` child of a `StructGet`, `StructSet`, `ArrayGet`, `ArraySet`, or `CallRef` instruction has a bottom reference type, so it is not possible to determine what heap type annotation to emit in the binary or text formats. (The bottom types are not valid type annotations since they do not have indices in the type section.) To fix that problem, update the printer and binary emitter to emit unreachables instead of the instruction with undetermined type annotation. This is a valid transformation because the only possible value that could flow into those instructions in that case is null, and all of those instructions trap on nulls. That fix uncovered a latent bug in the binary parser in which new unreachables within unreachable code were handled incorrectly. This bug was not previously found by the fuzzer because we generally stop emitting code once we encounter an instruction with type `unreachable`. Now, however, it is possible to emit an `unreachable` for instructions that do not have type `unreachable` (but are known to trap at runtime), so we will continue emitting code. See the new test/lit/parse-double-unreachable.wast for details. Update other miscellaneous code that creates `RefNull` expressions and null `Literals` to maintain the new invariants as well.
* Warn on too many parameters for Web VMs (#5119)Alon Zakai2022-10-061-0/+22
| | | Fixes emscripten-core/emscripten#17988
* wasm2js: Support for flexible module import naming (#5114)Sam Clegg2022-10-05118-410/+327
| | | | | | | | The previous code was making emscripten-specific assumptions about imports basically all coming from the `env` module. I can't find a way to make this backwards compatible so may do a combined roll with the emscripten-side change: https://github.com/emscripten-core/emscripten/pull/17806
* Strip em_js_deps exports (#5109)Sam Clegg2022-10-041-12/+28
| | | These are only needed for the metadata extraction in emcc.
* Simplify and fix heap type counting (#5110)Thomas Lively2022-10-0411-34/+40
| | | | | Annotations on array.get and array.set were not being counted and the code could generally be simplified since `count` already ignores types that don't need to be counted.
* Make Asyncify work with wasm64 (#5105)Sam Clegg2022-10-041-0/+1335
| | | | | The emscripten side is a little tricky but I've got some tests passing. Currently blocked on: https://github.com/emscripten-core/emscripten/issues/17969
* Fix ordering of visit() in MemoryGrow interpretation (#5108)Alon Zakai2022-10-031-0/+26
| | | | | | | This is a pretty subtle point that was missed in #4811 - we need to first visit the child, then compute the size, as the child may alter that size. Found by the fuzzer.
* Fix compiler warnings under emcc. NFC (#5104)Sam Clegg2022-10-031-3/+3
| | | | | These comparisons were showing up as warnings with the latest emcc/clang. I only noticed because I ran `ninja` to build everything whereas we only test the `binaryen` target under emscripten normally.
* [Wasm GC] Fix .depth() and add testing (#5102)Alon Zakai2022-09-301-0/+38
|
* Fix handling of unreachable selects in Directize (#5098)Alon Zakai2022-09-301-0/+36
| | | | We ignored only unreachable conditions, but we must ignore the arms as well, or else we could error.