Commit Graph

295 Commits

Author SHA1 Message Date
Jakob Stoklund Olesen
15d0108e4b Add a generic implementation of quadratic hash table probing.
We have multiple pre-computed constant hash tables that all use the same
quadratic probing algorithm.

Add a constant_hash Rust module to match the meta/constant_hash.py module.

Move the simple_hash() function into constant_hash. Its Python equivalent is in
the constant_hash.py module.
2016-08-18 13:44:17 -07:00
Jakob Stoklund Olesen
c3b7fc9a9c Move ir::Function into a sub-module.
Keep the top-level ir module free of implementation details that are
inadvertently exposed to sub-modules.
2016-08-12 16:46:44 -07:00
Jakob Stoklund Olesen
09b7420ca9 Use an EntityMap for stack slots.
Delete the StackSlots iterator and move the remaining StackSlotData into its
own module.
2016-08-12 16:44:39 -07:00
Jakob Stoklund Olesen
40e0989b8b Re-export common types in the cretonne::ir module.
Clients should not have to navigate the ir sub-modules to find commonly used
types.
2016-08-12 16:11:38 -07:00
Jakob Stoklund Olesen
9e87bffa82 Remove tests/lib.rs to avoid running tests twice.
The 'cargo test' command simply compiles each 'tests/*.rs' and runs the
enclosed tests. The 'lib.rs' source would get run as an individual test.
2016-08-12 11:05:29 -07:00
Jakob Stoklund Olesen
84a154a8ca Move integration tests into src/tools/tests.
The integration tests use both libcretonne and libreader, so moving them avoids
the circular dev-dependency.

Also go back to building everything under src/tools/target to avoid rebuilding
the libraries when cargo is invoked in different subdirectories. This speeds up
test-all.sh quite a bit.

Finally, skip the pure debug build. We build "cargo test" and "cargo build
--release" which should cover everything we need.
2016-08-12 10:43:10 -07:00
Jakob Stoklund Olesen
514ebc6bf9 Generate code to precompute predicates.
Each ISA predicate is assigned a bit the the Flags struct, and a corresponding
method is generated.
2016-08-12 10:13:50 -07:00
Jakob Stoklund Olesen
aeb376227e Implement the machinery to create a TargetIsa.
Add an isa::lookup() function which serves as a target registry for creating
Box<TargetIsa> trait objects.

An isa::Builder makes it possible to confugure the trait object before it is
created.
2016-08-11 11:52:11 -07:00
Jakob Stoklund Olesen
8c48739afd Document ISA builder. 2016-08-10 15:48:19 -07:00
Jakob Stoklund Olesen
b9baf06fb7 Add a settings::Builder data type.
- Move detail data structures into a settings::detail module to avoid polluting
  the settings namespace.

- Rename generated data types to 'Flags' in anticipation of computed predicate
  flags that can't be set. The Flags struct is immutable.

- Use a settings::Builder struct to manipulate settings, then pass it to
  Flags::new().
2016-08-10 15:47:06 -07:00
Jakob Stoklund Olesen
1ef72dd5ec Add support for enumerated settings.
The EnumSetting objects can take one of 256 named values.
2016-08-09 15:13:43 -07:00
Jakob Stoklund Olesen
07e851a222 Add settings::Stringwise.
This trait allows settings to be manipulated as strings, using descriptors and
constant hash-table lookups.

Amend gen_settings.py to generate the necessary constant tables.
2016-08-09 15:04:42 -07:00
Jakob Stoklund Olesen
d152719d93 Move simple_hash into its own module. 2016-08-09 15:04:42 -07:00
Jakob Stoklund Olesen
36ad7da3ec Add ISA-dependent settings for RISC-V. 2016-08-05 16:19:46 -07:00
Jakob Stoklund Olesen
cfeefde3fc Scaffolding for defining settings.
Settings can be defined globally or per-ISA. They are available to code through
a generated Settings struct with accessor methods per setting.
2016-08-05 15:50:57 -07:00
Jakob Stoklund Olesen
6b69391289 Scaffold implementation of the TargetIsa trait.
More to come here.
2016-08-05 09:55:53 -07:00
Jakob Stoklund Olesen
c47c524017 Add an empty isa/riscv module scaffold.
Targeted ISAs will be defined as sub-modules of isa.
2016-08-04 11:39:25 -07:00
Jakob Stoklund Olesen
f5008567c9 Add PrimaryEntityData marker trait.
Require this trait on the value type stored in an EntityMap to 'unlock' the
methods intended for primary entity maps that are allowed to create references
with the 'push method.

This prevents accidentally depending on these methods in secondary maps.
2016-08-01 19:52:57 -07:00
Morgan Phillips
549a14bf96 Merge branch 'master' of github.com:stoklund/cretonne into cfg-fix 2016-08-01 18:06:59 -07:00
Morgan Phillips
80abf8b1f0 Remove uses of EntityMap::len. 2016-08-01 18:04:25 -07:00
Jakob Stoklund Olesen
2c1e80b0e0 Remove the cfg::predecessors_iter() method and iterator.
This iterator enumerates all EBB references whether they are in the layout or
not. That is usually not what is needed when working with the CFG.

It is better to iterate over EBB referrences in layout order, or in reverse
post-order and then call the get_predecessors() method for each Ebb reference.

See the new implementation of print_cfg::cfg_connections().
2016-08-01 15:18:34 -07:00
Jakob Stoklund Olesen
02c1bb8f2c Print CFG edges from func.layout instead of cfg.predecessors_iter.
EBBs not in the layout should never be printed as part of the CFG.
2016-08-01 15:18:34 -07:00
Morgan Phillips
e9cfcf4f78 Improve the structure and comments of the module. 2016-08-01 15:00:08 -07:00
Morgan Phillips
5a38ca2db7 Remove println\! 2016-08-01 12:15:08 -07:00
Morgan Phillips
19a47d57b3 Add a dominator tree implementation. 2016-07-31 21:40:11 -07:00
Morgan Phillips
0ce01c1b8d Clean up the CFG representation. 2016-07-31 21:31:18 -07:00
Jakob Stoklund Olesen
bbdae39cb9 Add EntityMap::with_capacity.
Create a secondary entity map with space reserved for a known range of entity
references.

Add dfg.num_ebbs() and dfg.num_insts() methods to provide capacities.
2016-07-29 15:59:09 -07:00
Morgan Phillips
a9748dff02 Remove innacurate comments. 2016-07-28 17:51:50 -07:00
Morgan Phillips
82ff64820c Simplify the reverse_postorder_ebbs implementation. 2016-07-28 17:49:25 -07:00
Morgan Phillips
e94d7c2a99 Avoid cloning levels 2016-07-26 17:13:11 -07:00
Morgan Phillips
1cd6e35a42 Give the test module a more apt name. 2016-07-26 12:07:18 -07:00
Morgan Phillips
42b9835363 Fix broken reverse_postorder_ebbs implementation.
The previous implementation was actually a reverse preorder walk.
2016-07-26 02:54:42 -07:00
Morgan Phillips
400504d321 Cargo-fmt and cleanup. 2016-07-25 18:51:58 -07:00
Morgan Phillips
63b58214f7 Use cton_reader to simplify cfg traversal tests. 2016-07-25 18:49:39 -07:00
Morgan Phillips
bb7ecc8753 Change variable name to something more descriptive. 2016-07-25 01:05:15 -07:00
Morgan Phillips
91ced8df90 make postorder_ebbs into actually reverse_postorder_ebbs.
This is a more accurate description. Further return the ebbs in a
btreemap so that the index of each Ebb (its order of visitation) is
quick to lookup.
2016-07-25 00:41:34 -07:00
Jakob Stoklund Olesen
ae98edf8cc Add an analyze_branch method to InstructionData.
Rather than switching on instruction formats to discover the destination of a
branch, use the analyze_branch method which returns a BranchInfo enum with just
the relevant information.

This makes CFG algorithms independent of future instruction formats for
branches. Only analyze_branch needs to be updated when adding a new format.
2016-07-22 15:38:53 -07:00
Jakob Stoklund Olesen
20fc675fc0 Parse the BranchTable instruction format.
Resolve the jump table reference immediately since all jump tables are declared
in the preamble.
2016-07-22 15:16:14 -07:00
Jakob Stoklund Olesen
274671d12a Implement jump tables.
- Add a ir::jumptable module with a JumpTableData struct representing the vector
  of destinations.
- Add an entity map of jump tables to the Function.
- Parse and write jump tables in the function preamble.
- Rewrite EBB references in jumptables after parsing.
2016-07-22 14:48:53 -07:00
Jakob Stoklund Olesen
410c1390d1 Add a keys() iterator to EntityMap. 2016-07-22 14:48:53 -07:00
Jakob Stoklund Olesen
f116f03327 Move entry_block() into Layout.
The single entry block in a function is simply the first block in the layout.

Remove the 'entry' keyword from the textual IL, the lexer and parser.
2016-07-22 10:06:51 -07:00
Jakob Stoklund Olesen
38815dcca3 Rename the 'repr' module to 'ir'.
This module and its submodules define the Intermidiate Representation of the
Cretonne IL.
2016-07-22 09:34:28 -07:00
Morgan Phillips
367752be1d Replace btreesets with vectors. 2016-07-21 22:44:13 -07:00
Morgan Phillips
bdab73b0c7 Cargo-fmt fixes 2016-07-21 15:24:07 -07:00
Morgan Phillips
761fb54d8a Add support for postorder traversal of the cfg. 2016-07-21 15:22:27 -07:00
Morgan Phillips
30eb25d013 Track predecessors as well as successors in the CFG 2016-07-21 12:36:51 -07:00
Morgan Phillips
2caa802f50 Use EntityMap instead of BTreeMap 2016-07-21 12:08:02 -07:00
Jakob Stoklund Olesen
89ba9626c7 Move IR modules under repr/.
Use the cretonne::repr module as a common namespace for sub-modules defining the
in-memory representation of Cretonn IL.
2016-07-19 14:10:30 -07:00
Jakob Stoklund Olesen
6e04ec5df9 Prepare for repr sub-modules. 2016-07-19 13:53:02 -07:00
Jakob Stoklund Olesen
c1806d0ab0 Use DataFlowGraph in Function.
Replace the three tables instructions, extended_basic_blocks, and
extended_values with a single 'dfg' public member.

Clients using Function are changed to refer to func.layout and func.dfg
respectively.
2016-07-19 13:05:28 -07:00