Commit Graph

3700 Commits

Author SHA1 Message Date
bjorn3
f84e1c16c7 Enforce all OperandKind have documentation 2021-10-31 19:57:04 +01:00
bjorn3
e8f3c0c6a9 Use InstructionFormat inside InstructionFormatBuilder 2021-10-31 19:57:04 +01:00
bjorn3
2fbd57e9e2 Remove imm_with_name
It is only used once to rename an imm field to mask
2021-10-31 19:57:04 +01:00
bjorn3
74261ccd79 Never use the first vararg as typevar operand
If an instruction only takes varargs as values, it may have no arguments
at all.
2021-10-31 19:57:04 +01:00
bjorn3
e4d42a1be4 Move arg unpacking for all remaining expand functions to simple_legalize 2021-10-31 18:26:25 +01:00
bjorn3
ce3175993a Inline expand_br_icmp, expand_stack_load and expand_stack_store 2021-10-31 18:00:39 +01:00
bjorn3
96b14ed8eb Match on InstructionData instead of Opcode
This should be faster by avoiding matching on InstructionData to get the
Opcode, then on Opcode and then finally on the InstructionData again to
get the arguments
2021-10-31 17:52:43 +01:00
Chris Fallin
e953c2dd4c Merge pull request #3480 from bjorn3/move_constant_hash_gen_table
Move generate_table from cranelift-codegen-shared to cranelift-codege…
2021-10-29 09:59:56 -07:00
wasmtime-publish
c1a6a0523d Release Wasmtime 0.31.0 (#3489)
* Bump Wasmtime to 0.31.0

[automatically-tag-and-release-this-commit]

* Update 0.31.0 release notes

Co-authored-by: Wasmtime Publish <wasmtime-publish@users.noreply.github.com>
Co-authored-by: Alex Crichton <alex@alexcrichton.com>
2021-10-29 09:09:35 -05:00
bjorn3
91d4f36970 Move generate_table from cranelift-codegen-shared to cranelift-codegen-meta 2021-10-29 14:43:09 +02:00
Nick Fitzgerald
49133f62e6 Merge pull request #3476 from fitzgen/logging-in-cranelift-test-compile
cranelift: in `test_compile` filetest, log disasm not clif
2021-10-26 11:00:23 -07:00
Nick Fitzgerald
8aa8dfe26a cranelift: in test_compile filetest, log disasm not clif
With the old backends, this would log the lowered+legalized clif, but the log is
useles now with the new backends. Logging the disasm is the new moral
equivalent.
2021-10-26 10:21:31 -07:00
Alex Crichton
490d49a768 Adjust dependency directives between crates (#3420)
* Adjust dependency directives between crates

This commit is a preparation for the release process for Wasmtime. The
specific changes here are to delineate which crates are "public", and
all version requirements on non-public crates will now be done with
`=A.B.C` version requirements instead of today's `A.B.C` version
requirements.

The purpose for doing this is to assist with patch releases that might
happen in the future. Patch releases of wasmtime are already required to
not break the APIs of "public" crates, but no such guarantee is given
about "internal" crates. This means that a patch release runs the risk,
for example, of breaking an internal API. In doing so though we would
also need to release a new major version of the internal crate, but we
wouldn't have a great hole in the number scheme of major versions to do
so. By using `=A.B.C` requirements for internal crates it means we can
safely ignore strict semver-compatibility between releases of internal
crates for patch releases, since the only consumers of the crate will be
the corresponding patch release of the `wasmtime` crate itself (or other
public crates).

The `publish.rs` script has been updated with a check to verify that
dependencies on internal crates are all specified with an `=`
dependency, and dependnecies on all public crates are without a `=`
dependency. This will hopefully make it so we don't have to worry about
what to use where, we just let CI tell us what to do. Using this
modification all version dependency declarations have been updated.

Note that some crates were adjusted to simply remove their `version`
requirement in cases such as the crate wasn't published anyway (`publish
= false` was specified) or it's in the `dev-dependencies` section which
doesn't need version specifiers for path dependencies.

* Switch to normal sever deps for cranelift dependencies

These crates will now all be considered "public" where in patch releases
they will be guaranteed to not have breaking changes.
2021-10-26 09:06:03 -05:00
Nick Fitzgerald
e3a423c3e8 Remove some uses of foo.expect(&format!(...)) pattern
This eagerly evaluates the `format!` and produces a `String` with a heap
allocation, regardless whether `foo` is `Some`/`Ok` or `None`/`Err`. Using
`foo.unwrap_or_else(|| panic!(...))` makes it so that the error message
formatting is only evaluated if `foo` is `None`/`Err`.
2021-10-25 17:35:23 -07:00
Anton Kirilov
e9c4164b94 Call membarrier() after making JIT mappings executable on AArch64 Linux
The membarrier() system call ensures that no processor has fetched
a stale instruction stream.

Copyright (c) 2021, Arm Limited.
2021-10-25 13:25:35 +01:00
Michael Chesser
da51fae4c3 Rename executable to already_protected 2021-10-22 13:44:47 +01:00
Michael Chesser
61ecccf306 Avoid updating memory protection on allocations that have the right protection. 2021-10-22 13:44:47 +01:00
Chris Fallin
472b1b2e8a Avoid quadratic behavior in pathological label-alias case in MachBuffer.
Fixes #3468.

If a program has many instances of the pattern "goto next; next:" in a
row (i.e., no-op branches to the fallthrough address), the branch
simplification in `MachBuffer` would remove them all, as expected.
However, in order to work correctly, the algorithm needs to track all
labels that alias the current buffer tail, so that they can be adjusted
later if another branch chomp occurs.

When many thousands of this branch-to-next pattern occur, many thousands
of labels will reference the current buffer tail, and this list of
thousands of labels will be shuffled between the branch metadata struct
and the "labels at tail" struct as branches are appended and then
chomped immediately.

It's possible that with smarter data structure design, we could somehow
share the list of labels -- e.g., a single array of all labels, in order
they are bound, with ranges of indices in this array used to represent
lists of labels (actually, that seems like a better design in general);
but let's leave that to future optimization work.

For now, we can avoid the quadratic behavior by just "giving up" if the
list is too long; it's always valid to not optimize a branch. It is very
unlikely that the "normal" case will have more than 100 "goto next"
branches in a row, so this should not have any perf impact; if it does,
we will leave 1 out of every 100 such branches un-optimized in a long
sequence of thousands.

This takes total compilation time down on my machine from ~300ms to
~72ms for the `foo.wasm` case in #3441. For reference, the old backend
(now removed), built from arbitrarily-chosen-1-year-old commit
`c7fcc344`, takes 158ms, so we're ~twice as fast, which is what I would
expect.
2021-10-21 12:07:39 -07:00
Chris Fallin
e9921574d7 Update to regalloc.rs 0.0.32.
It appears that some allocation heuristics have changed slightly since
0.0.31, so some of the golden-output filetests are updated as well.
Ideally we would rely more on runtests rather than golden-compilation
tests; but for now this is sufficient. (I'm not sure exactly what in
regalloc.rs changed to alter these heuristics; it's actually been almost
a year since the 0.0.31 release with several refactorings and tweaks
merged since then.)

Fixes #3441.
2021-10-20 15:28:42 -07:00
Alex Crichton
fb585fde40 Update the wast crate dependency (#3464)
Pulls in a few minor fixes for stack overflows with module linking as
well as some updates to other various wasm proposals.
2021-10-20 11:25:52 -05:00
Alex Crichton
e2a724ce18 Update the object crate to 0.27.0 (#3465)
Mostly just keeping us up to date with changes there since we somewhat
heavily rely on it now.
2021-10-20 10:52:06 -05:00
Alex Crichton
e8d3b8e3ea Fix an off-by-two condition in heap legalization (#3462)
This commit fixes an issue in Cranelift where legalization of
`heap_addr` instructions (used by wasm to represent heap accesses) could
be off-by-two where loads that should be valid were actually treated as
invalid. The bug here happened in an optimization where tests against
odd constants were being altered to tests against even constants by
subtracting one from the limit instead of adding one to the limit. The
comment around this area has been updated in accordance with a little
more math-stuff as well to help future readers.
2021-10-19 13:19:20 -05:00
Alex Crichton
9c6884e28d Update the spec reference testsuite submodule (#3450)
* Update the spec reference testsuite submodule

This commit brings in recent updates to the spec test suite. Most of the
changes here were already fixed in `wasmparser` with some tweaks to
esoteric modules, but Wasmtime also gets a bug fix where where import
matching for the size of tables/memories is based on the current runtime
size of the table/memory rather than the original type of the
table/memory. This means that during type matching the actual value is
consulted for its size rather than using the minimum size listed in its
type.

* Fix now-missing directories in build script
2021-10-13 16:14:12 -05:00
Chris Fallin
14cde24377 Merge pull request #3447 from bjorn3/remove_unused_inst_flags
Remove various unused things from the meta crate
2021-10-13 11:31:31 -07:00
Nick Fitzgerald
d377b665c6 Initial ISLE integration with the x64 backend
On the build side, this commit introduces two things:

1. The automatic generation of various ISLE definitions for working with
CLIF. Specifically, it generates extern type definitions for clif opcodes and
the clif instruction data `enum`, as well as extractors for matching each clif
instructions. This happens inside the `cranelift-codegen-meta` crate.

2. The compilation of ISLE DSL sources to Rust code, that can be included in the
main `cranelift-codegen` compilation.

Next, this commit introduces the integration glue code required to get
ISLE-generated Rust code hooked up in clif-to-x64 lowering. When lowering a clif
instruction, we first try to use the ISLE code path. If it succeeds, then we are
done lowering this instruction. If it fails, then we proceed along the existing
hand-written code path for lowering.

Finally, this commit ports many lowering rules over from hand-written,
open-coded Rust to ISLE.

In the process of supporting ISLE, this commit also makes the x64 `Inst` capable
of expressing SSA by supporting 3-operand forms for all of the existing
instructions that only have a 2-operand form encoding:

    dst = src1 op src2

Rather than only the typical x86-64 2-operand form:

    dst = dst op src

This allows `MachInst` to be in SSA form, since `dst` and `src1` are
disentangled.

("3-operand" and "2-operand" are a little bit of a misnomer since not all
operations are binary operations, but we do the same thing for, e.g., unary
operations by disentangling the sole operand from the result.)

There are two motivations for this change:

1. To allow ISLE lowering code to have value-equivalence semantics. We want ISLE
   lowering to translate a CLIF expression that evaluates to some value into a
   `MachInst` expression that evaluates to the same value. We want both the
   lowering itself and the resulting `MachInst` to be pure and referentially
   transparent. This is both a nice paradigm for compiler writers that are
   authoring and maintaining lowering rules and is a prerequisite to any sort of
   formal verification of our lowering rules in the future.

2. Better align `MachInst` with `regalloc2`'s API, which requires that the input
   be in SSA form.
2021-10-12 17:11:58 -07:00
Chris Fallin
f227699536 Make ISLE part of the root Cargo workspace. 2021-11-11 16:00:12 -08:00
Nick Fitzgerald
4c61c96c3f Add Cargo.toml metadata 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
e23564700d Add myself as a second author 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
bd8c7faf12 Add support for hex integer literals 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
8f5dffab72 Add better error messages for duplicate term declarations 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
22e18a9d98 Remove eprintln!s that shouldn't have been committed 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
037db8aab6 Make sure that infallible match operations come after fallible ones
Eventually we will probably want to sort by a partial ordering based on pattern
subsumption to break ties between rules with the same priority. This local
heuristic of making sure infallibilty comes last is good enough for now and
handles the cases we care about thus far.

Fixes #10
2021-11-11 15:56:55 -08:00
Nick Fitzgerald
6c6b7a2b78 Add a method to pretty-print a trie 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
0411b20871 Fix allow declaration 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
7fab7c5eab Emit if lets against Option<x> instead of Option<(x,)> 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
0c6956376b Allow irrefutable let patterns in the generated code 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
e015a49270 Do not use 1-member tuples in external constructor/extractor trait methods
Just use the single member type directly.
2021-11-11 15:56:55 -08:00
Nick Fitzgerald
0e02ec4cba Use BTree{Map,Set} instead of Hash{Map,Set} to ensure deterministic output
Fixes #8
2021-11-11 15:56:55 -08:00
Nick Fitzgerald
efe7df7f45 Keep track of where primitives are defined for better error messages 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
fe836a2302 Yield source positions from lexer that have file-relative offsets
They were previously all source texts concatenated-relative offsets, which would
cause `miette` to error out when trying to find the line/col when displaying
errors. Not good to have errors when displaying errors! Gets very confusing when
trying to track down ISLE type errors and things.
2021-11-11 15:56:55 -08:00
Nick Fitzgerald
7f8cb75e54 Allow terms to have both extractors and constructors
Fixes #4
2021-11-11 15:56:55 -08:00
Nick Fitzgerald
fddff6ee2d Fix a panic when checking the call graph for an extractor with type errors in its definition 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
9af23bf061 Report the recursive calls when an extractor is recursive 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
31d1cf3808 Fill out implementation overview in README 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
381dadadd0 Move trie construction out to its own module 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
bffaccde1f Add a tutorial to the README 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
0e082e8d6f Make sure that every decl has a definition at the end of type checking 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
d2bd07c246 Check that integer literals are primitive types in patterns 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
ce207ee953 Check that integer literals are a primitive type 2021-11-11 15:56:55 -08:00
Nick Fitzgerald
a099b2b590 Extend fuzzing to semantic analysis and codegen
* Fix a panic when we are substituting macro args, but we already had an error
  involving the macro.

* Fix a stack overflow when an internal extractor's definition is recursive.
2021-11-11 15:56:55 -08:00