Commit Graph

4112 Commits

Author SHA1 Message Date
Ivan Enderlin
938dedbbce doc(changelog) Add #960. 2019-11-13 15:35:37 +01:00
Ivan Enderlin
be9d7f2e6e chore(runtime-c-api) Update header files. 2019-11-13 15:29:33 +01:00
Ivan Enderlin
b081d17ab0 feat(runtime-c-api) Add support for clang in WASMER_H_MACROS. 2019-11-13 15:28:57 +01:00
Ivan Enderlin
645519c29c fix(runtime-c-api) Use #if defined instead of #ifdef. 2019-11-13 15:28:04 +01:00
bors[bot]
72864934f9
Merge #955
955: feat(runtime-core) Replace the `field-offset` crate by a custom `offset_of!` macro r=Hywan a=Hywan

The `field-offset` crate is unmaintained. When using its `offset_of!`
macro on a struct with a field of type `std::ptr::NonNull`, in release
mode, it generates a sigill.

This patch removes the `field-offset` crate, and implements a custom
`offset_of!` macro.

See #925 last commits to see an illustration of this bug.

Co-authored-by: Ivan Enderlin <ivan.enderlin@hoa-project.net>
2019-11-13 13:15:48 +00:00
Ivan Enderlin
8f20a28ab1
Merge branch 'master' into feat-runtime-core-field-offset 2019-11-13 13:22:41 +01:00
losfair
66e9184226 Specify test-threads=1 for singlepass spectests. 2019-11-13 15:06:42 +08:00
losfair
605ada7ad7 Run cargo fmt. 2019-11-13 14:53:34 +08:00
losfair
ccc474bd5d Remove debug files. 2019-11-13 14:53:11 +08:00
losfair
08a1dd3e8c Merge master and add documentation. 2019-11-13 14:52:22 +08:00
losfair
e2956e7b1a Run cargo fmt 2019-11-13 14:34:04 +08:00
losfair
47f1e2a4ef Fix parameter loading. 2019-11-13 14:18:21 +08:00
losfair
c552514fd2 Disable NaN canonicalizing on aarch64. 2019-11-13 11:35:44 +08:00
bors[bot]
d64d070c9f
Merge #954
954: Deny missing docs in the clif backend crate r=bjfish a=bjfish

<!-- 
Prior to submitting a PR, review the CONTRIBUTING.md document for recommendations on how to test:
https://github.com/wasmerio/wasmer/blob/master/CONTRIBUTING.md#pull-requests

-->

# Description
Deny missing docs in the clif backend crate
<!-- 
Provide details regarding the change including motivation,
links to related issues, and the context of the PR.
-->




Co-authored-by: Brandon Fish <brandon.j.fish@gmail.com>
Co-authored-by: Brandon Fish <bjfish@users.noreply.github.com>
2019-11-12 18:46:08 +00:00
Brandon Fish
af12bf4f68
Merge branch 'master' into feature/deny-missing-docs-clif-backend 2019-11-12 11:43:54 -06:00
losfair
f1339b4033 Fix known_registers size. 2019-11-13 01:00:27 +08:00
bors[bot]
8e32c9b3c6
Merge #925
925: feat(runtime-core) Support closures with a captured environment as host functions r=Hywan a=Hywan

Reboot of #882 and #219.

For the moment, host functions (aka imported functions) can be regular function pointers, or (as a side-effect) closures without a captured environment. This PR extends the support of host functions to closures with a captured environment. This is required for many other features (incl. the Python integration, the Ruby integration, WebAssembly Interface Types [see #787], and so on).

This PR is the culmination of previous ones, notably #915, #916 and #917. 

### General idea

The user-defined host function is wrapped inside a `wrap` function. This wrapper function initially receives a `vm::Ctx` as its first argument, which is passed to the host function when necessary. The patch keeps this behavior but it comes from `vm::FuncCtx`, which is a new structure. A `vm::FuncCtx` is held by `vm::ImportedFunc` such as:

```rust
#[repr(C)]
pub struct ImportedFunc {
    pub(crate) func: *const Func,
    pub(crate) func_ctx: NonNull<FuncCtx>,
}
```

where `vm::FuncCtx` is:

```rust
#[repr(C)]
pub struct FuncCtx {
    pub(crate) vmctx: NonNull<Ctx>,
    pub(crate) func_env: Option<NonNull<FuncEnv>>,
}
```

where `vm::FuncEnv` is:

```rust
#[repr(transparent)]
pub struct FuncEnv(pub(self) *mut c_void);
```

i.e. a raw opaque pointer.

So the wrapper function of a host function receives a `vm::Ctx`, which is used to find out the associated `FuncCtx` (by using the import backing), which holds `vm::FuncEnv`. It holds a pointer to the closure captured environment.

### Implementation details

#### How to get a pointer to a closure captured environment

A closure with a captured environment has a memory size greater than zero. This is how we detect it:

```rust
if mem::size_of::<Self>() != 0 { … }
```

To get a pointer to its captured environment, we use this statement:

```rust
NonNull::new(Box::into_raw(Box::new(self))).map(NonNull::cast)
```

(in `typed_func.rs`, in the `wrap` functions).

To reconstruct the closure based on the pointer, we use this statement:

```rust
let func: &FN = {
    let func: NonNull<FN> = func_env.cast();
    &*func.as_ptr()
};
```

That's basically how it works. And that's the core idea of this patch.

As a side effect, we have removed an undefined behavior (UB) in 2 places: The `mem::transmute(&())` has been removed (it was used to get the function pointer of `FN`). The transmute is replaced by `FuncEnv`, which provides a unified API, erasing the difference between host functions as closures with a captured environment, and host functions as function pointer. For a reason I ignore, the UB wasn't showing himself until this PR and a modification in the Singlepass backend. But now it's fixed.

#### Impact on `Backing`

After the modification on the `typed_func` and the `vm` modules, this is the other core idea of this patch: Updating the `backing` module so that `vm::ImportedFunc` replaces `vm::Ctx` by `vm::FuncCtx`.

When creating `vm::ImportedFunc`, a new `vm::FuncCtx` is created and its pointer is used. We are purposely leaking `vm::FuncCtx` so that the pointer is always valid. Hence the specific `Drop` implementation on `ImportBacking` to dereference the pointer, and to drop it properly.

#### Impact on the backends

Since the structure of `vm::ImportedFunc` has changed, backends must be updated. We must deref `FuncCtx` to reach its `vmctx` field.

#### Impact on `Instance`

Because `vm::ImportedFunc` has changed, it has a minor impact on the `instance` module, nothing crazy though.

Co-authored-by: Ivan Enderlin <ivan.enderlin@hoa-project.net>
2019-11-12 14:18:46 +00:00
Ivan Enderlin
a1e8a8f0db fix(runtime-core) Same bug with field-offset as before.
It will be fixed in a following PR.
2019-11-12 15:17:36 +01:00
Ivan Enderlin
0775d496d3 feat(runtime-core) Replace the field-offset crate by a custom offset_of! macro.
The `field-offset` crate is unmaintained. When using its `offset_of!`
macro on a struct with a field of type `std::ptr::NonNull`, in release
mode, it generates a sigill.

This patch removes the `field-offset` crate, and implements a custom
`offset_of!` macro.
2019-11-12 15:12:31 +01:00
Ivan Enderlin
5d6c74bfaa doc(changelog) Fix last release number, and fix CS. 2019-11-12 14:37:18 +01:00
Ivan Enderlin
89859a9ab5 Merge branch 'master' into feat-runtime-core-clos-host-function 2019-11-12 14:36:33 +01:00
Ivan Enderlin
0de7f4fd0b test(runtime-core) offset_of! fails with a struct containing NonNull types.
It fails only in release mode. That's a bug from the `field-offset`
crate. This patch is a temporary fix.
2019-11-12 14:34:55 +01:00
Heyang Zhou
8db67e452e
Merge pull request #943 from bjfish/singlepass-aarch64-travis
Singlepass Travis CI build
2019-11-12 21:24:15 +08:00
Brandon Fish
91b5059506 Deny missing docs in the clif backend crate 2019-11-11 20:05:04 -06:00
Syrus Akbary
3991db5b78
Merge pull request #953 from wasmerio/release-0.10.1
Prepare for 0.10.1 release
2019-11-11 16:24:13 -08:00
Mark McCaskey
69950d9e5f Prepare for 0.10.1 release 2019-11-11 16:22:37 -08:00
Ivan Enderlin
22abd8efdc doc(runtime-core) Add missing doc on vm::FuncCtx. 2019-11-12 01:10:32 +01:00
Ivan Enderlin
cf33bf8b20
Merge branch 'master' into feat-runtime-core-clos-host-function 2019-11-12 00:58:24 +01:00
Ivan Enderlin
f002f03e5d chore(changelog) Fix CS. 2019-11-12 00:56:34 +01:00
Ivan Enderlin
95706160ee Merge branch 'master' into feat-runtime-core-clos-host-function 2019-11-12 00:55:40 +01:00
Ivan Enderlin
bb81614be4 feat(llvm-backend) Update ImportedFunc structure.
`vm::ImportedFunc` in `runtime-core` has changed. Update LLVM accordingly.
2019-11-12 00:52:14 +01:00
Ivan Enderlin
06c6b3c8e8 feat(runtime-core) More ABI compatible definition of Func and FuncEnv. 2019-11-12 00:52:14 +01:00
Ivan Enderlin
11f34a9285 feat(clif-backend,singlepass-backend) Feed imported functions with FuncCtx.vmctx. 2019-11-12 00:51:57 +01:00
Ivan Enderlin
98e4ef066a feat(runtime-core) Feed imported functions with vm::Ctx again.
… and look for the associated `vm::FuncCtx`. This way, we don't break
the rule: “all functions receive a vmctx pointer as first argument.”.
2019-11-12 00:50:25 +01:00
bors[bot]
4c14ab0b8b
Merge #952
952: Generate C preprocessor code to hide things not on Windows r=MarkMcCaskey a=MarkMcCaskey

resolves #804 

# Review

- [x] Add a short description of the the change to the CHANGELOG.md file


Co-authored-by: Mark McCaskey <mark@wasmer.io>
Co-authored-by: nlewycky <nick@wasmer.io>
2019-11-11 23:19:19 +00:00
nlewycky
08c66d6b77
Fix typo. 2019-11-11 14:52:17 -08:00
Mark McCaskey
e121c47f18 Generate C preprocessor code to hide things not on Windows 2019-11-11 14:47:25 -08:00
Syrus Akbary
2343075bd9
Update azure-pipelines.yml 2019-11-11 14:14:09 -08:00
Syrus Akbary
239e1e0544
Update azure-pipelines.yml 2019-11-11 13:31:38 -08:00
Syrus Akbary
26472d634c
Merge pull request #951 from wasmerio/release-0.10.0
Prepare for 0.10.0 release
2019-11-11 12:18:45 -08:00
Mark McCaskey
cd6ff0a34a
Add links to contributors
Co-Authored-By: Syrus Akbary <me@syrusakbary.com>
2019-11-11 12:18:16 -08:00
Mark McCaskey
0a216c0779 Prepare for 0.10.0 release 2019-11-11 12:13:53 -08:00
Syrus Akbary
114ae21d63
Merge pull request #949 from wasmerio/fix/release-pipeline
Update release pipeline
2019-11-11 12:00:27 -08:00
Mark McCaskey
40b1955d99 Update release pipeline 2019-11-11 11:51:49 -08:00
bors[bot]
25ebbaae3d
Merge #923
923: Add probable fix of memory leak in trampoline code r=MarkMcCaskey a=MarkMcCaskey

might be what's needed for #810 ; but despite my best efforts I could not get asan working on osx, so I did not test it.

By my count this accounts for 40 bytes, so there may be another issue

edit: unless Rust is optimizing out turning a zero-sized type into a Box, in which case, this should account for 48 bytes

Co-authored-by: Mark McCaskey <mark@wasmer.io>
2019-11-11 18:57:12 +00:00
bors[bot]
8233f4cae4
Merge #941
941: Emit direct calls for local functions. r=nlewycky a=nlewycky



Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-11-11 17:52:10 +00:00
bors[bot]
5e71a8f094
Merge #942
942: Deny missing docs in runtime core and add missing docs r=bjfish a=bjfish

<!-- 
Prior to submitting a PR, review the CONTRIBUTING.md document for recommendations on how to test:
https://github.com/wasmerio/wasmer/blob/master/CONTRIBUTING.md#pull-requests

-->

# Description
Deny missing docs in runtime core and add missing docs
<!-- 
Provide details regarding the change including motivation,
links to related issues, and the context of the PR.
-->

# Review

- [x] Add a short description of the the change to the CHANGELOG.md file


Co-authored-by: Brandon Fish <brandon.j.fish@gmail.com>
2019-11-10 22:29:44 +00:00
Brandon Fish
a74acb7a8a Add missing rustdoc for macro debug 2019-11-10 16:28:33 -06:00
Brandon Fish
ea3b6fa6d7 Add missing rustdocs for Windows code 2019-11-10 16:03:43 -06:00
Brandon Fish
82ec5e970a Add additional rustdocs for missing docs found during CI 2019-11-10 15:16:07 -06:00