| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
|
|
|
|
|
|
| |
If a global is marked mutable but not assigned to, make it immutable.
If an immutable global is a copy of another, use the original, so we can remove the duplicates.
Fixes #2011
|
|
|
|
|
| |
This replaces the wasm2js code that lowered them to pessimistic (1-byte aligned) loads and stores. The new pass will do the optimal thing, keeping 2-byte alignment where possible.
This is also nicer as a standalone pass, which has the simple property that after it runs all loads and stores are aligned, instead of some code scattered inside wasm2js.
|
|
|
| |
That pass is very slow on unoptimized code (super-linear on the number of locals, which if unoptimized can be massive due to flatten).
|
|
|
| |
In particular, coalesce-locals is useful even if closure is run later (apparently it finds stuff closure can't).
|
|
|
|
|
| |
We flatten for the i64 lowering etc. passes, and it is worth optimizing afterwards, to clean up stuff they created. That is run if the user ran wasm2js with an optimization level (like wasm2js -O3).
Split the test files to check both optimized and unoptimized code.
|
| |
|
|
|
| |
If an i64 load/store that is being broken up has higher alignment, use that.
|
|
|
|
|
|
|
|
|
|
| |
Don't emit unneeded breaks in switch cases, instead do
case X:
case Y:
..
case W: break ..
for each group. Also, the group with the default doesn't need any cases but the default itself.
|
|
|
|
|
|
|
| |
SimplifyLocals (#2064)
Details in lengthy comment in the source.
Fixes #2063
|
|
|
|
|
|
|
| |
We had CI breakage that prevented this from being noticed before.
* Make binaryen.js not use NO_FILESYSTEM - need to investigate why recent emscripten changes broke our usage of that flag.
* Update a binaryen.js test.
|
| |
|
|
|
| |
Don't use temp vars to reorder them unless we need to.
|
|
|
| |
Mostly what we need for dynamic linking, at least on the binaryen side.
|
| |
|
|
|
|
|
| |
As well as i64 splitting this pass was also converting f32 to f64
at the wasm boundry. However it appears this is not actually useful
and makes somethings (such as dynamic linking) harder.
|
|
|
|
|
|
| |
* Emit ints as signed, so -1 isn't a big unsigned number.
* x - -c (where c is a constant) is larger than x + c in js (but not wasm)
* +(+x) => +x
* Avoid unnecessary coercions on calls, return, load, etc. - we just need coercions when entering or exiting "wasm" (not internally), and on actual operations that need them.
|
|
|
| |
Removes redundant | 0s and similar things. (Apparently closure compiler doesn't do that, so makes sense to do here.)
|
|
|
|
| |
(#2043)
|
|
|
|
| |
(#2042)
|
|
|
| |
Also fix the fuzzer's handling of feature flags so that wasm2js can work.
|
|
|
| |
Also run remove-unused-names which became more noticeably necessary after this change.
|
|
|
|
|
|
|
| |
Implement interpretation of remaining bulk memory ops, add bulk memory
spec tests with light modifications, fix bugs preventing the fuzzer
from running correctly with bulk memory, and fix bugs found by the
fuzzer.
|
|
|
| |
We run flatten there, which lets us simplify things a lot. Turns out that for assertions we didn't run it, which is why we still needed the old non-flat code paths. This adds flatten there and removes that old code and assumptions.
|
|
|
| |
Also test in pass-debug mode, for better coverage.
|
|
|
|
|
|
|
|
|
| |
When replacing the first argument to an asm call, allow more complex
expressions for expressing the address.
This fixes the case where the first argument might be the result
of adding a constant to __memory_base.
|
|
|
| |
It is invalid to print --5, we need to add a space - -5 so that it is valid JS to parse.
|
|
|
|
|
|
|
| |
This replaces all uses of __tempMemory__, the old scratch space location, with calls to function imports for scratch memory access. This lets us then implement those in a way that does not use the same heap as main memory. This avoids possible bugs with scratch memory overwriting something, or just in general that it has observable side effects, which can confuse fuzzing etc.
The intrinsics are currently implemented in the glue. We could perhaps emit them inline instead (but that might limit asm.js optimizations, so I wanted to keep our options open for now - easy to change later).
Also fixes some places where we used 0 as the scratch space address.
|
|
|
|
|
|
| |
* Don't assume function types exist in legalize-js-interface.
* Properly handle (ignore) imports in RemoveNonJSOps - do not try to recurse into them.
* Run legalize-js-interface and remove-unused-module-elements in wasm2js, the first is necessary, the last is nice to have.
|
| |
|
|
|
|
|
|
| |
This reverts commit cb2d63586c08a3dd194d2b733ceb3f5051c081f8.
The issues with feature validation were mostly resolved in #1993, and
this PR finishes the job by adding feature flags to wasm-as to avoid
emitting the DataCount section when bulk-memory is not enabled.
|
|
|
|
|
| |
cases are tricky (#2026)
leave them for later optimizers/minifiers
|
|
|
| |
Also emit the memory growth code based on memory growth, and not whether we are "use asm" or not.
|
|
|
| |
Split them into two i32 globals.
|
|
|
| |
Fixes #1984
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Before, we'd print
if (..) label: { .. }; else ..
But that is wrong, as it ends the if too early. After this, we print
if (..) label: { .. } else ..
The bug was we checked if the if body was a block, but not if it was a labelled block.
|
|
|
|
|
| |
In the absence of the target features section or command line flags. When there are command line flags, it is an error if they do not exactly match the target features section, except if --detect-features has been provided.
Also adds a --print-features pass to print the command line flags for all enabled options and uses it to make the feature tests more rigorous.
|
|
|
|
|
| |
* Make the memory instrumentation pass log both pointers and values.
* Use "env" as the import module - simpler to support and get working.
|
|
|
|
|
| |
* Emit an import statement for the memory.
* Update the imported memory's buffer when we grow.
|
|
|
|
|
|
|
|
| |
Previously we were searching for the function by name but this
doesn't work when the internal name for the function is different.
In order to repro such a case the shared.c test was converted to C++
since then binaryen's internal name is different since it comes from
the de-mangled name section.
|
|
|
| |
Fixes #2007 #2008
|
|
|
|
|
| |
Its presence was causing validation errors in the Emscripten test
suite. This should be reverted once the default feature set is no
longer All.
|
|
|
|
|
| |
This replaces the multiple asm.js tables (of power-of-2 size) with a single simple table.
Also supports importing the table.
|
|
|
|
|
|
|
|
| |
* DataCount section
Read the DataCount section and verify that it agrees with the data
section. Also emit the DataCount section when bulk-memory is enabled
and there are a nonzero number of segments. Factor out some shared
unit test code.
|
|
|
|
|
| |
This allows us to emit a (potentially modified) target features
section and conditionally emit other sections such as the DataCount
section based on the presence of features.
|
|
|
|
|
|
|
|
| |
* I64ToI32Lowering - don't assume address 0 is a hardcoded location for scratch memory. Import __tempMemory__ for that.
* RemoveNonJSOps - also use __tempMemory__. Oddly here the address was a hardcoded 1024 (perhaps where the rust program put a static global?).
* Support imported ints in wasm2js, coercing them as needed.
* Add "env" import support in the tests, since now we emit imports from there.
* Make wasm2js tests split out multi-module tests using split_wast which is more robust and avoids emitting multiple outputs in one file (which makes no sense for ES6 modules)
|
|
|
|
|
| |
* Refactor memory code to share it between the two emitting modes.
* Get memory emitting set up in the emscripten mode.
|
|
|
|
|
|
| |
Add a wasm2js option for the glue to be in emscripten-compatible format (as opposed to ES6). This does a few things so far:
* Emit START_FUNCTIONS, END_FUNCTIONS markers in the code, for future use in the optimizer.
* Emit the glue as a function to be called from emscripten.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Early work for #1929
* Leave core wasm module - the "asm.js function" - to Wasm2JSBuilder, and add Wasm2JSGlue which emits the code before and after that. Currently that's some ES6 code, but we may want to change that later.
* Add add AssertionEmitter class for the sole purpose of emitting modules + assertions for testing. This avoids some hacks from before like starting from index 1 (assuming the module at first position was already parsed and printed) and printing of the f32Equal etc. functions not at the very top (which was due to technical limitations before).
Logic-wise, there should be no visible change, except some whitespace and reodering, and that I made the exceptions print out the source of the assertion that failed from the wast:
-if (!check2()) fail2();
+if (!check2()) throw 'assertion failed: ( assert_return ( call add ( i32.const 1 ) ( i32.const 1 ) ) ( i32.const 2 ) )';
(fail2 etc. did not exist, and seems to just have given a unique number for each assertion?)
|