| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
per-memory (#2507)
The PR updates the bulk memory operations (memory.fill, memory.copy,
table.fill, etc.) to support 64-bit addresses and counts. Previously these functions
only took u32's, even with memory64 enabled. (#2506)
This PR also allows "software-bounds-checked" memories and "guard-page-checked"
memories to coexist in the same module. It creates two versions of every memory
operation: an unrestricted version (that works with any memory) and a _default32
version (for memories with default page size and i32 indexing). (#2507)
#2506 and #2507 have been squashed together to avoid a performance regression.
This is a stepping stone to supporting custom-page-sizes (which will need to be
software-bounds-checked) (#2508).
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
| |
Thanks to MEM_ADDR we don't need to think about big-endian vs
little-endian for any scalar(!) operations.
|
| |
|
| |
|
| |
|
| |
|
| |
|
|
|
|
|
|
| |
This continues the work from #1783 and reduces special handling of elem
exprs, by treating them the same as other const expressions (init
expressions).
|
| |
|
| |
|
| |
|
| |
|
|
|
| |
Co-authored-by: Shravan Narayan <shravanrn@gmail.com>
|
| |
|
|
|
| |
per http://man.openbsd.org/alloca.3
|
| |
|
| |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
* wasm2c: multiple .c outputs
This enables wasm2c to have multiple .c outputs, which allows parallel
compilation of the wasm2c outputs. This is useful when the input WASM module is
big.
wasm2c takes the number of .c outputs as an argument to `--num-outputs`
(defaulting to 1). If the number is equal to 1, the .c output does not change
except for two new macro declarations and the ordering of declarations and
definitions. If greater than 1, wasm2c outputs change in the following ways:
1) wasm2c outputs a [module-name]-impl.h that includes any module-wide
declarations, including:
* content of `WriteSourceTop()`
* function type declarations
* tag types
* tag declarations
* function declarations
* data segments and elem segments declarations
Any static declaration become extern in this header.
2) wasm2c outputs [module-name]_i.c for i = [0, ..., number of .c outputs - 1). Any
module-wide material is written to [module-name]_0.c, including:
* function types, tags, data segments, elem segments
* imports and exports
* module initialization, instantiation and free
3) For each function implementation, wasm2c assigns it to one output .c file
by sorting the function names and partitioning into roughly equal buckets.
Alternately, the caller can supply its own assignment function (helpful if it wants
the assignments to be more stable in the face of function insertion or deletion).
|
| |
|
|
|
| |
This change incorporates [simd-everywhere](https://github.com/simd-everywhere/simde) into the wasm2c output, which maps wasm SIMD C intrinsics to any supported target architecture.
|
|
|
|
|
|
| |
We had been running the GitHub UBSAN wasm2c tests with -fsanitize=undefined
but without -fno-sanitize-recover, meaning some of the spec tests
were printing UBSAN error messages but still returning 0, so we
weren't seeing the test failures.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This makes wasm2c serialize each function type, rather than registering
function types at module-initialization time. The serialized function
type is the SHA-256 of the mangled param and result types (with a space
between params and results).
At runtime in call_indirect, a known (immediate) function type is
compared against the function type stored in a funcref structure. For
call_indirects to functions local to the module, or for any
call_indirect when the toolchain merges string constants across
compilation units (generally, GCC and clang), this can be done by
comparing the pointers to each function type. Otherwise, the actual
32-byte values are compared.
The function type IDs can be looked up at runtime with
`Z_[modname]_get_func_type`, which matches the API from
`wasm_rt_register_func_type`. A new `callback` example demos this.
wasm2c does the SHA-256 either by linking against libcrypto or, if not
available or if requested via `cmake -DUSE_INTERNAL_SHA256=ON`, by using
a vendored (header-only) PicoSHA2. There is no runtime dependency on
SHA-256 in the wasm2c runtime or generated modules.
This eliminates the last of the per-module state, so this commit also removes
the [modname]_init_module() function and the s_module_initialized bool.
|
|
|
|
|
|
|
| |
Note, there are still some issues here that needs to be resolved,
mostly about memory sandboxing (bounds checking).
Since this is still experimental I've also added a `--experimental` flag
to wasm2c that is required in addition to passing `--enable-memory64`.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
As well as the testsuite update there are two notable changes that
come with it here. These can both be split out an landed first if
it makes sense.
1. wasm2c now supports element sections containing externref. Currently
only the null reference is supported.
2. element segments no longer use funcref as the default element type
but instead, unless explicitly included in the binary, the
element type defaults to the type of the table in which the segment
is active.
Fixes: #1612 #2022
|
|
|
|
| |
(#2047)
|
|
|
|
|
|
|
|
| |
Correct handling of Wasm's 8gb model on Windows
- Uses the Windows ExceptionHandler to track access violations (segfaults)
- Fix Windows memory to reserve, but not commit memory up front
- Correct handling of return values in os_mmap functions
- Decouple stack depth handling and heap bounds checking
|
|
|
|
| |
Restores current versions of all non-SIMD tests in the core testsuite
and multi-memory and exception-handling proposals.
|
| |
|
|
|
| |
Co-authored-by: Yuhan Deng <yhdeng@stanford.edu>
|
|
|
| |
Co-authored-by: Angela Montemayor <amontema@cs.stanford.edu>
|
|
|
|
|
| |
(The imports.txt and exports.txt tests require multi-table and
are disabled until reference types is supported.)
|
|
|
|
|
|
|
|
|
| |
Enable optimization when compiling the wasm2c output on non-Windows platforms (effectively GCC and clang). This required:
- Preventing load instructions from being optimized away if their value is unused (using inline assembly with an input operand and empty code). This is necessary to force an OOB trap on platforms that use mprotect and the signal handler to detect OOB.
- Disabling tail-call optimization in the compiler, to make sure that infinite recursion traps. (This required bumping the version of macOS in GitHub Actions to get a new-enough AppleClang. We should revert this back to 'macos-latest' as soon as that becomes the default.)
- Using NaN-quieting versions of a bunch of FP ops that were previously only used on Windows, and adding floor/ceil and promotion/demotion.
- Using the '-frounding-math' and '-fsignaling-nans' compiler flags to tell GCC and clang not to fold certain FP ops (e.g. subtracting zero, multiplying by 1).
Fixes #1925.
|
|
Store templated wasm2c code as .h/.c; build templates on demand
|