Commit Graph

6024 Commits

Author SHA1 Message Date
Nick Fitzgerald
6559ea5ce6 Merge pull request #885 from alexcrichton/less-rebuild
Don't rebuild `wasmtime-cli` on all file changes
2020-02-03 21:50:55 +01:00
Nick Fitzgerald
a817a0879e Merge pull request #886 from alexcrichton/debug-config
Add a `Debug` implementation for `wsmtime::Config`
2020-02-03 21:50:23 +01:00
Yury Delendik
4599234c6f Don't generate DWARF sections when no functions were compiled. (#894) 2020-02-03 14:41:29 -06:00
Jakub Konka
e6cec049cb Add basic CI conf (#3)
* Add basic CI conf

* Pull in submodules in Rustfmt job

* Exclude WASI from workspace; fix name clash in memory crate

* Refactor CI conf
2020-02-03 09:59:09 +01:00
Jakub Konka
3d428b828f Add some (incomplete set) basic sanity end-to-end tests (#2)
* Add some (incomplete set) basic sanity end-to-end tests

This commit adds some (an incomplete set of) basic sanity end-to-end
tests. It uses `test.witx` to autogenerate types and module interface
functions (aka the syscalls), and tests their implementation. For
the host memory, it uses simplistic `&mut [u8]` where we have full
control of the addressing and contents.

* Add sanity test for baz interface func

This commit adds a sanity test for the `Foo::baz` interface func.

* Upcast start/len for Region to avoid overflow

* Reenable alignment checking for memory

* use an array to implement hostmemory

Co-authored-by: Pat Hickey <pat@moreproductive.org>
2020-02-03 07:38:48 +01:00
Alex Crichton
ef843b9e5a Add a Debug implementation for wsmtime::Config
Handy to have in some situations!
2020-02-01 02:47:46 -08:00
Alex Crichton
1a64acf43b Don't rebuild wasmtime-cli on all file changes
Print out an explicit `rerun-if-changed` annotation in the `build.rs`
for the `wasmtime-cli` crate to avoid rebuilding it constantly as files
like tests change which don't need to cause a rebuild.
2020-02-01 02:45:27 -08:00
Alex Crichton
ea4faa4a01 Don't panic on shared memories (#883)
* Don't panic on shared memories

Instead return a first-class error
2020-02-01 10:33:30 +01:00
Pat Hickey
f321f05a98 use lifetimes on types that require it 2020-01-31 15:18:49 -08:00
Peter Huene
f2fa484abf Merge pull request #880 from joshtriplett/profile-overrides
Don't spend build time optimizing build-time-only crates
2020-01-31 21:29:23 +01:00
Josh Triplett
8affec0896 Don't spend build time optimizing build-time-only crates
Crates used exclusively at build time, such as proc-macro crates and
their dependencies, don't benefit substantially from optimization; they
take far longer to optimize than time saved when running them during the
build. No machine code from these crates will appear in the final
compiled binary.

Use the new profile-overrides mechanism in Rust 1.41
(https://doc.rust-lang.org/cargo/reference/profiles.html#overrides) to
build such crates with opt-level 0.

On a 4-thread laptop, this brings build time from 6m27s to 4m21s, and
CPU time spent from 23m43s to 16m23s.
2020-01-31 11:47:15 -08:00
Alex Crichton
97ff297683 Remove another thread local in instance.rs (#862)
* Remove another thread local in `instance.rs`

This commit removes another usage of `thread_local!` in the continued
effort to centralize all thread-local state per-call (or basically state
needed for traps) in one location. This removal is targeted at the
support for custom signal handlers on instances, removing the previous
stack of instances with instead a linked list of instances.

The `with_signals_on` method is no longer necessary (since it was always
called anyway) and is inferred from the first `vmctx` argument of the
entrypoints into wasm. These functions establish a linked list of
instances on the stack, if needed, to handle signals when they happen.

This involved some refactoring where some C++ glue was moved into Rust,
so now Rust handles a bit more of the signal handling logic.

* Update some inline docs about `HandleTrap`
2020-01-31 13:45:54 +01:00
Nick Fitzgerald
cc07565985 Merge pull request #879 from alexcrichton/fix-leak
Fix a memory leak with link errors
2020-01-31 11:59:49 +01:00
Alex Crichton
d22b60e834 Fix a memory leak with link errors
During creation of an `InstanceHandle` if a link error occurred (such as
an element segment doesn't fit) then the instance itself would be leaked
by accident. This commit fixes the issue by ensuring that an
`InstanceHandle` is created very quickly so if any initialization later
fails it will be cleaned up through normal destructors.
2020-01-30 23:47:12 -08:00
Pat Hickey
29c3ef9d09 we now parse witx paths and the ctx type name in the macro invocation 2020-01-30 16:38:16 -08:00
Nick Fitzgerald
84c4d8cc6c Remove always-on logging from fuzz targets (#878)
Now that the `cargo fuzz` tooling is better, it is easier to reproduce failures,
and we don't need to be super paranoid about logging here.
2020-01-30 23:46:50 +01:00
Pat Hickey
0ba8e73184 change proc macro argument parsing to use syn 2020-01-30 14:29:53 -08:00
Alex Crichton
c6438d0d44 fuzz: Don't panic on module compilation errors (#875)
Let's avoid having two phases of checks and just ignore the module
compilation errors during the instantiate oracle, only relying on one check.
2020-01-30 22:22:05 +01:00
Sergei Pepyakin
f2382db461 Check the types of values returned by Callable (#876)
If the values mismatch to the ones that were specified by the
signature of the callable, raise a trap!
2020-01-30 21:11:41 +01:00
Sergei Pepyakin
eb183d7ab3 Run rustfmt 1.41 (#877) 2020-01-30 21:03:50 +01:00
Alex Crichton
43c2da04b6 Try to fix Python wheel management on CI (#874)
We've been getting some errors on Linux which seem like they might be
related to a pinned `wheel` dependency. Apparently I originally added
this dependency to CI and I have no idea why I wrote down a `==`
dependency for it, so let's try not pinning and see what happens.
2020-01-30 18:23:40 +01:00
Alex Crichton
83ff0150b4 Improve panics/traps from imported functions (#857)
* Improve panics/traps from imported functions

This commit performs a few refactorings and fixes a bug as well. The
changes here are:

* The `thread_local!` in the `wasmtime` crate for trap information is
  removed. The thread local in the `wasmtime_runtime` crate is now
  leveraged to transmit trap information.

* Panics in user-provided functions are now caught explicitly to be
  carried across JIT code manually. Getting Rust panics unwinding
  through JIT code is pretty likely to be super tricky and difficult to
  do, so in the meantime we can get by with catching panics and resuming
  the panic once we've resumed in Rust code.

* Various take/record trap apis have all been removed in favor of
  working directly with `Trap` objects, where the internal trap object
  has been expanded slightly to encompass user-provided errors as well.

This borrows a bit #839 and otherwise will...

Closes #848

* Rename `r#return` to `ret`
2020-01-30 15:15:20 +01:00
Yury Delendik
a8cad05e80 Fix 'not enough arguments' during wasmtime run (#858)
* Fix 'not enough arguments' during wasmtime run

* add simple cli smoke tests

* autogenerate wasm
2020-01-30 14:29:50 +01:00
Pat Hickey
e2079c085d report which field a struct validation error occured in 2020-01-29 13:18:57 -08:00
Andrew Brown
bc50815eac Re-enable simd_const.wast spec test (#872) 2020-01-29 09:02:24 +01:00
Pat Hickey
814dd19488 structs that contain pointers work! 2020-01-28 18:17:48 -08:00
Pat Hickey
35d9373976 we now validate Copy structs 2020-01-28 16:34:34 -08:00
Pat Hickey
62e00434b0 structs implementing Copy are scaffolded out.
todo: need an unsafe method for casting pointers in order to validate
contents via recursive descent
2020-01-28 15:45:52 -08:00
Andrew Brown
3502cd3cd1 Remove unused import; fixes #1367 (#1368) 2020-01-28 13:11:37 -05:00
Pat Hickey
373560b88a and now funcs work again 2020-01-27 20:28:27 -08:00
Pat Hickey
c780421c28 i think the memory model is fixed now? at least until arrays.... 2020-01-27 20:21:53 -08:00
Pat Hickey
ec456e9e50 new memory model. not quite complete 2020-01-27 18:20:47 -08:00
Pat Hickey
e6a4ae205c return values written to pointers! 2020-01-27 12:40:54 -08:00
Alex Crichton
1defae2742 Run cargo update on dependencies (#868)
Looks like we're able to actually drop a good number of various deps,
especially some large-ish ones like syn 0.14!

      Adding proc-macro2 v1.0.8
      Adding syn v1.0.14

    Removing base64 v0.10.1
    Removing cloudabi v0.0.3
    Removing crossbeam-utils v0.6.6
    Removing failure v0.1.6
    Removing failure_derive v0.1.6
    Removing fuchsia-cprng v0.1.1
    Removing proc-macro2 v0.4.30
    Removing proc-macro2 v1.0.7
    Removing quote v0.6.13
    Removing rand_core v0.3.1
    Removing rand_core v0.4.2
    Removing rand_os v0.1.3
    Removing rdrand v0.4.0
    Removing syn v0.14.9
    Removing syn v1.0.13
    Removing synstructure v0.9.0
    Removing unicode-xid v0.1.0
    Removing wincolor v1.0.2

    Updating arbitrary v0.3.2 -> v0.3.3
    Updating arrayref v0.3.5 -> v0.3.6
    Updating constant_time_eq v0.1.4 -> v0.1.5
    Updating crates.io index
    Updating derive_arbitrary v0.3.1 -> v0.3.3
    Updating indexmap v1.3.0 -> v1.3.1
    Updating itoa v0.4.4 -> v0.4.5
    Updating jobserver v0.1.18 -> v0.1.19
    Updating memchr v2.2.1 -> v2.3.0
    Updating num_cpus v1.11.1 -> v1.12.0
    Updating proc-macro-error v0.4.4 -> v0.4.5
    Updating proc-macro-error-attr v0.4.3 -> v0.4.5
    Updating quickcheck v0.9.0 -> v0.9.2
    Updating rand v0.7.2 -> v0.7.3
    Updating redox_users v0.3.1 -> v0.3.4
    Updating rust-argon2 v0.5.1 -> v0.7.0
    Updating rustversion v1.0.1 -> v1.0.2
    Updating serde_json v1.0.44 -> v1.0.45
    Updating structopt v0.3.7 -> v0.3.8
    Updating structopt-derive v0.4.0 -> v0.4.1
    Updating termcolor v1.0.5 -> v1.1.0
    Updating thread_local v1.0.0 -> v1.0.1
    Updating toml v0.5.5 -> v0.5.6
    Updating winapi-util v0.1.2 -> v0.1.3
2020-01-27 10:57:25 +01:00
Jakub Konka
4b84d19f77 Update instantiate.rs (#864)
* Update instantiate.rs

This must have snuck in the latest refactor of auto-generating the hostcalls from `*.witx` files.

* Fix formatting
2020-01-26 16:44:10 -06:00
Jakub Konka
daf0772bd5 Fix environ crate tests on nightly 2020-01-26 22:24:40 +01:00
Pat Hickey
a20ef36a49 multiple layers of pointers work! 2020-01-24 19:57:18 -08:00
Pat Hickey
020778b7da we can handle one layer of pointers! 2020-01-24 18:08:37 -08:00
Pat Hickey
e789033651 bugfix 2020-01-24 15:16:09 -08:00
Pat Hickey
42eca19b50 types: make the tryfrom/to impl for the abi type, not the signed variant 2020-01-24 15:12:51 -08:00
Nick Fitzgerald
573cae2dda Merge pull request #861 from alexcrichton/empty-file
Remove a stray empty file
2020-01-24 12:58:51 -08:00
Alex Crichton
62a86ae52b Remove a stray empty file
Forgotten in a previous refactoring!
2020-01-24 12:30:38 -08:00
Alex Crichton
16804673a2 Support parsing the text format in wasmtime crate (#813)
* Support parsing the text format in `wasmtime` crate

This commit adds support to the `wasmtime::Module` type to parse the
text format. This is often quite convenient to support in testing or
tinkering with the runtime. Additionally the `wat` parser is pretty
lightweight and easy to add to builds, so it's relatively easy for us to
support as well!

The exact manner that this is now supported comes with a few updates to
the existing API:

* A new optional feature of the `wasmtime` crate, `wat`, has been added.
  This is enabled by default.
* The `Module::new` API now takes `impl AsRef<[u8]>` instead of just
  `&[u8]`, and when the `wat` feature is enabled it will attempt to
  interpret it either as a wasm binary or as the text format. Note that
  this check is quite cheap since you just check the first byte.
* A `Module::from_file` API was added as a convenience to parse a file
  from disk, allowing error messages for `*.wat` files on disk to be a
  bit nicer.
* APIs like `Module::new_unchecked` and `Module::validate` remain
  unchanged, they require the binary format to be called.

The intention here is to make this as convenient as possible for new
developers of the `wasmtime` crate. By changing the default behavior
though this has ramifications such as, for example, supporting the text
format implicitly through the C API now.

* Handle review comments

* Update more tests to avoid usage of `wat` crate

* Go back to unchecked for now in wasm_module_new

Looks like C# tests rely on this?
2020-01-24 14:20:51 -06:00
Alex Crichton
47d6db0be8 Reel in unsafety around InstanceHandle (#856)
* Reel in unsafety around `InstanceHandle`

This commit is an attempt, or at least is targeted at being a start, at
reeling in the unsafety around the `InstanceHandle` type. Currently this
type represents a sort of moral `Rc<Instance>` but is a bit more
specialized since the underlying memory is allocated through mmap.

Additionally, though, `InstanceHandle` exposes a fundamental flaw in its
safety by safetly allowing mutable access so long as you have `&mut
InstanceHandle`. This type, however, is trivially created by simply
cloning a `InstanceHandle` to get an owned reference. This means that
`&mut InstanceHandle` does not actually provide any guarantees about
uniqueness, so there's no more safety than `&InstanceHandle` itself.

This commit removes all `&mut self` APIs from `InstanceHandle`,
additionally removing some where `&self` was `unsafe` and `&mut self`
was safe (since it was trivial to subvert this "safety"). In doing so
interior mutability patterns are now used much more extensively through
structures such as `Table` and `Memory`. Additionally a number of
methods were refactored to be a bit clearer and use helper functions
where possible.

This is a relatively large commit unfortunately, but it snowballed very
quickly into touching quite a few places. My hope though is that this
will prevent developers working on wasmtime internals as well as
developers still yet to migrate to the `wasmtime` crate from falling
into trivial unsafe traps by accidentally using `&mut` when they can't.
All existing users relying on `&mut` will need to migrate to some form
of interior mutability, such as using `RefCell` or `Cell`.

This commit also additionally marks `InstanceHandle::new` as an `unsafe`
function. The rationale for this is that the `&mut`-safety is only the
beginning for the safety of `InstanceHandle`. In general the wasmtime
internals are extremely unsafe and haven't been audited for appropriate
usage of `unsafe`. Until that's done it's hoped that we can warn users
with this `unsafe` constructor and otherwise push users to the
`wasmtime` crate which we know is safe.

* Fix windows build

* Wrap up mutable memory state in one structure

Rather than having separate fields

* Use `Cell::set`, not `Cell::replace`, where possible

* Add a helper function for offsets from VMContext

* Fix a typo from merging

* rustfmt

* Use try_from, not as

* Tweak style of some setters
2020-01-24 14:20:35 -06:00
Alex Crichton
3db1074c15 Improve handling of strings for backtraces (#843)
* Improve handling of strings for backtraces

Largely avoid storing strings at all in the `wasmtime-*` internal
crates, and instead only store strings in a separate global cache
specific to the `wasmtime` crate itself. This global cache is inserted
and removed from dynamically as modules are created and deallocated, and
the global cache is consulted whenever a `Trap` is created to
symbolicate any wasm frames.

This also avoids the need to thread `module_name` through the jit crates
and back, and additionally removes the need for `ModuleSyncString`.

* Run rustfmt
2020-01-24 11:53:55 -06:00
Alex Crichton
21e0a99884 Delete the wasmtime-wasi-c crate (#844)
This commit deletes the old C implementation of the original
`wasi_unstable` module, instead only leaving around our single
`wasmtime-wasi` crate as the implementation for both
`wasi_snapshot_preview1` and `wasi_unstable`.

This hasn't been discussed (AFAIK) up until now, so this is also a
proposal! Some thoughts in favor of this deletion I would have are:

* This has been off-by-default for ages
* We don't build or test any of this on CI
* Published binaries with `wasmtime` do not have this possibility
  enabled
* Future refactorings to the `wasmtime-wasi` crate will either need to
  work around how the C implementation is different or bring it up to
  speed.

This is motivated by the last bullet point where I was working on
getting `wasmtime-wasi` working purely as an implementation detail on
top of the `wasmtime` crate itself, but quickly ran into a case where
the CLI would need to multiplex all sorts of wasi implementations. In
any case I'm curious what others think, is this too soon? Is there
something remaining blocking this? (etc)
2020-01-24 08:54:17 -08:00
Joshua Nelson
5edf015ada Make get_libcall_funcref pub(crate) (#1291)
* Make `get_libcall_funcref` `pub(crate)`

Closes https://github.com/bytecodealliance/cranelift/issues/1273.

Since get_libcall_funcref is only used internally by the verifier,
it doesn't make sense to have it be public. This will encourage users to
look elsewhere for `memcpy` (they should be looking at
https://docs.rs/cranelift-frontend/0.51.0/cranelift_frontend/struct.FunctionBuilder.html#method.emit_small_memcpy)
2020-01-24 16:43:44 +01:00
Ryan Hunt
c360007b19 Drop 'basic-blocks' feature (#1363)
* All: Drop 'basic-blocks' feature

This makes it so that 'basic-blocks' cannot be disabled and we can
start assuming it everywhere.

* Tests: Replace non-bb filetests with bb version

* Tests: Adapt solver-fixedconflict filetests to use basic blocks
2020-01-23 22:36:06 -07:00
Pat Hickey
b6d342ccb5 some progress on marshalling args 2020-01-23 17:55:59 -08:00
Ryan Hunt
710182ad26 Wasm: Add support for nullref type
Reference types now supports proper a nullref type. This commit changes
the Wasm translator to support this.
2020-01-23 16:31:34 -06:00