Commit Graph

1125 Commits

Author SHA1 Message Date
Dan Gohman
acf4f1009b Eliminate redundant uses of format!.
https://github.com/rust-lang-nursery/rust-clippy/wiki#useless_format
2017-08-31 12:47:05 -07:00
Dan Gohman
abbc6ddf24 Use is_empty() instead of comparing len() with 0.
https://github.com/rust-lang-nursery/rust-clippy/wiki#len_zero
2017-08-31 12:47:05 -07:00
Dan Gohman
adfdd77311 Avoid creating a reference to a reference.
https://github.com/rust-lang-nursery/rust-clippy/wiki#needless_borrow
2017-08-31 12:47:05 -07:00
Dan Gohman
b411d01d6d Use [] instead of .get().unwrap().
https://github.com/rust-lang-nursery/rust-clippy/wiki#get_unwrap
2017-08-31 12:47:05 -07:00
Dan Gohman
2efdc0ed37 Update rustfmt to 0.9.0. 2017-08-31 10:44:59 -07:00
Dan Gohman
46fb64cbb4 Add SideEffects::new(). 2017-08-31 10:28:56 -07:00
Dan Gohman
52186b8390 Refactor code for obtaining the header block. 2017-08-31 10:28:56 -07:00
Dan Gohman
fc374b6c06 Test that stack layout with an unsupported offset is rejected cleanly. 2017-08-31 08:54:50 -07:00
Dan Gohman
bd0590604d Test dfg's next_inst(). 2017-08-31 08:54:50 -07:00
Dan Gohman
4c3ac6053f Test the error case of condcode parsing. 2017-08-31 08:54:50 -07:00
Dan Gohman
6702221e94 Change EbbHeaderBlockData's predecessors list from a HashMap to a Vec. (#148)
In addition to efficiency, this change also eliminates some nondeterminsm
resulting from HashMap key ordering.
2017-08-31 08:54:34 -07:00
Dan Gohman
a0a3401ef1 Don't special-case br_table with an empty table.
Empty br_table tables are very uncommon (they're easy for wasm producers to
optimize away), so we don't need to special-case them.
2017-08-30 15:05:00 -07:00
Dan Gohman
4ccd21ba94 Simplify iteration. 2017-08-30 15:04:53 -07:00
Dan Gohman
110697cfdd Replace match blocks with .expect calls. 2017-08-30 14:53:49 -07:00
Dan Gohman
5e99a4fb6a Simplify a pattern-match. 2017-08-30 14:53:39 -07:00
Dan Gohman
0cc8bd06cd Remove unnecessary () values. 2017-08-30 14:53:34 -07:00
Dan Gohman
8647b10135 Loop over references to containers instead of using explicit iteration methods.
https://github.com/rust-lang-nursery/rust-clippy/wiki#explicit_iter_loop
2017-08-30 14:52:17 -07:00
Dan Gohman
03698f6bc8 Use slices rather than Vec borrows.
https://github.com/rust-lang-nursery/rust-clippy/wiki#ptr_arg
2017-08-30 14:48:17 -07:00
Dan Gohman
01744d6f65 Avoid unneeded return keywords. 2017-08-30 14:46:48 -07:00
Dan Gohman
3532c3533a Teach simple_gvn that iconst.i32 is not congruent to iconst.i64. 2017-08-30 14:33:54 -07:00
Dan Gohman
9ea5226b89 Add simple_gvn to the optimization pipeline for WebAssembly functions. 2017-08-30 14:32:42 -07:00
Dan Gohman
dcb65b59c1 Remove an unnecessary mut, fixing a compiler warning. 2017-08-30 09:10:08 -07:00
Dan Gohman
b2fcb1ad17 Change translate_module to use a slice rather than a borrowed Vec.
This makes it more convenient to call from a cargo-fuzz fuzzer.
2017-08-30 09:10:08 -07:00
Dan Gohman
5303e7708b Handle wasmparser errors gracefully. 2017-08-30 09:10:08 -07:00
Jakob Stoklund Olesen
0deaa616a3 Record identity assignments in regalloc constraint solver.
Fixes #147.

The Solver::reassign_in() method would previously not record fixed
register assignments for values that are already in the correct
register. The register would simply be marked as unavailable for the
solver.

This did have the effect of tripping up the sanity checks in
Solver::add_var() when that method was called with such a "reassigned"
value. The function can be called for a value that already has a fixed
assignment, but the sanity checks want to make sure the variable
constraints are compatible with the existing fixed assignment. When no
such assignment could be found, the method panicked.

To fix this, make sure that even identity reassignments are recorded
in the assignments vector. Instead, filter the identity assignments out
before scheduling a move sequence for the assignments.

Also add some debug tracing to the regalloc solver.
2017-08-29 10:45:33 -07:00
Dan Gohman
c380df1d04 Eliminate a heap allocation. 2017-08-29 05:44:40 -07:00
Dan Gohman
4afa5df3b6 Remove the last_inst_return field.
It's not necessary to explicitly track whether the last instruction is a
return; if the builder for the last block isn't filled by the time we reach
the end, it needs a return to fill it.
2017-08-29 05:09:25 -07:00
Dan Gohman
ea1d053831 Simplify the "am I in unreachable code" predicate.
The phantom unreachable stack is only used when the real unreachable stack is
active, so it's sufficient to check whether the real unreachable stack is empty.
2017-08-29 03:36:38 -07:00
Dan Gohman
c71d4fc01b Remove a stale comment. 2017-08-29 03:30:22 -07:00
Dan Gohman
253f602a4c Fix a few warnings. 2017-08-28 17:17:41 -07:00
Dan Gohman
f905dc914b Enable missing_docs errors in the wasm crate.
This adds `#![deny(missing_docs)]` to the wasm crate, and adds documentation
to several struct and enum fields, as needed.
2017-08-28 17:07:28 -07:00
Denis Merigoux
ee9989c4b9 Dumped code from the wasm2cretonne repo.
Integrated wasm test suite translation as cretonne test

Fixes #146.
Fixes #143.
2017-08-28 15:57:43 -07:00
Jakob Stoklund Olesen
e8276ed965 Add more heap expansion tests. 2017-08-28 15:47:21 -07:00
Jakob Stoklund Olesen
2201e6249e Add Intel encodings for brz.b1 and brnz.b1.
Use these encodings to test trapz.b1 and trapnz.b1.

When a b1 value is stored in a register, only the low 8 bits are valid.
This is so we can use the various setCC instructions to generate the b1
registers.
2017-08-28 14:56:11 -07:00
Jakob Stoklund Olesen
217434b474 Add custom legalization for conditional traps.
The expansion of these instructions requires the CFG to be modified,
something the Python XForms can't yet do.
2017-08-28 11:19:42 -07:00
Jakob Stoklund Olesen
6d9198d55f Recompute the dominator tree on demand.
The legalizer can invalidate the dominator tree, but we don't actually
need a dominator tree during legalization, so defer the construction of
the domtree.

- Add an "invalid" state to the dominator tree along with clear() and
  is_valid() methods to test it.
- Invalidate the dominator tree as part of legalization.
- Ensure that a valid dominator tree exists before the passes that need
  it.

Together these features add up to a manual invalidation mechanism for
the dominator tree.
2017-08-28 11:16:29 -07:00
Jakob Stoklund Olesen
fecbcbb7b4 Drop the domtree argument to legalize_function().
Future legalization patterns will have the ability to mutate the
flowgraph, so the domtree's list of RPO blocks is not a good guide for
iteration. Use the layout order instead. This will pick up any new EBBs
inserted.
2017-08-25 10:36:25 -07:00
Jakob Stoklund Olesen
aae946128b Add heap_addr custom legalization.
The expansion of a heap_addr instruction depends on the type of heap and
its configuration, so this is handled by custom code.

Add a couple examples of heap access code to the language reference
manual.
2017-08-24 14:44:47 -07:00
Jakob Stoklund Olesen
3b71a27632 Add heaps to the Cretonne IL.
Add preamble syntax for declaring static and dynamic heaps, and update
the langref section on heaps. Add IR support for heap references.

Remove the heap_load and heap_store as discussed in #144. We will use
heap_addr along with native load and store instructions in their place.

Add the heap_addr instruction and document its bounds checking
semantics.
2017-08-23 14:15:59 -07:00
Jakob Stoklund Olesen
a9238eda7a Clean up the documentation for the entity module. 2017-08-18 17:14:31 -07:00
Jakob Stoklund Olesen
9cb0529be4 Move EntityList and SparseMap into the entity module.
These data structures are dependent on EntityRef and EntityMap, so it
makes sense to keep them in the same module.
2017-08-18 16:14:06 -07:00
Jakob Stoklund Olesen
7e08b14cf6 Split EntityMap into entity::PrimaryMap and entity::EntityMap.
The new PrimaryMap replaces the primary EntityMap and the PrimaryEntityData
marker trait which was causing some confusion. We now have a clear
division between the two types of maps:

- PrimaryMap is used to assign entity numbers to the primary data for an
  entity.
- EntityMap is a secondary mapping adding additional info.

The split also means that the secondary EntityMap can now behave as if
all keys have a default value. This means that we can get rid of the
annoying ensure() and get_or_default() methods ther were used everywhere
instead of indexing. Just use normal indexing now; non-existent keys
will return the default value.
2017-08-18 16:04:43 -07:00
Jakob Stoklund Olesen
8599372098 Rename the entity_ref module to 'entity'.
This is in preparation for moving a number of data structures into
sub-modules of the 'entity' module:

- EntityList
- EntityMap
- SparseMap
2017-08-18 15:07:21 -07:00
Jakob Stoklund Olesen
c7b9bc1abf Prefer to use qualified type names in generated code.
Emit type names like ir::Foo instead of just Foo to avoid very long
manual use declarations in files including generated code.
2017-08-18 14:14:23 -07:00
Jakob Stoklund Olesen
6bcb24b3a6 Add a uimm32 operand kind.
We already have a uoffset32 operand kind, but that prints as an offset
with a permanent sign.
2017-08-18 13:07:44 -07:00
Jakob Stoklund Olesen
f2ebabaf5f Custom legalization for global_addr.
The code to compute the address of a global variable depends on the kind
of variable, so custom legalization is required.

- Add a legalizer::globalvar module which exposes an
  expand_global_addr() function. This module is likely to grow as we add
  more types of global variables.
- Add a ArgumentPurpose::VMContext enumerator. This is used to represent
  special 'vmctx' arguments that are used as base pointers for vmctx
  globals.
2017-08-18 10:08:06 -07:00
Jakob Stoklund Olesen
5dba00b761 Add support for custom legalization actions.
The custom_legalize() method on XFormGroup can be used to call a
custom function to legalize specific opcodes.

This will be used shortly to expand global_addr which has an expansion
that depends on the details of the global variable being referenced.
2017-08-17 18:33:53 -07:00
Jakob Stoklund Olesen
4b94ea21ed Switch to a FuncCursor in the top-level legalizer loop.
Stop passing Cursor references to legalizer functions. Give them the
whole &mut Function instead. Given the whole Function reference, these
functions can create their own cursors.

This lets legalizer actions access other Function data structures like
the global variables.
2017-08-17 16:13:15 -07:00
Jakob Stoklund Olesen
5566c99dba Check for global variable deref cycles in the verifier. 2017-08-17 15:11:58 -07:00
Jakob Stoklund Olesen
bf4ae3bb2e Add global variables to Cretonne IL.
See #144 for discussion.

- Add a new GlobalVar entity type both in Python and Rust.
- Define a UnaryGlobalVar instruction format containing a GlobalVar
  reference.
- Add a globalvar.rs module defining the GlobalVarData with support for
  'vmctx' and 'deref' global variable kinds.

Langref:
    Add a section about global variables and the global_addr
    instruction.

Parser:
    Add support for the UnaryGlobalVar instruction format as well as
    global variable declarations in the preamble.
2017-08-17 14:41:27 -07:00