Commit Graph

17 Commits

Author SHA1 Message Date
Jakob Stoklund Olesen
99464bc29d Implement EntityRef for most of the entities module.
The only exception is Value which has two dimensions.
2016-07-15 16:03:14 -07:00
Jakob Stoklund Olesen
a39e418d32 Rewrite EBB and value references after parsing.
We llow forward references to values and EBBs, so it is not possible to rewrite
these from the source domain to the in-memory domain during parsing.

Instead go through all the instructions after parsing everything and rewrite the
value and EBB references when everything has been created and mapped.
2016-07-08 15:15:53 -07:00
Jakob Stoklund Olesen
a985bc18bc Don't return any values from inst_results() for VOID instructions.
Instructions that don't produce any result values are marked with first_type() =
VOID. The inst_results() iterator should not return any values for such
instructions.
2016-07-05 12:35:29 -07:00
Jakob Stoklund Olesen
a981fc5605 rustfmt v0.5.0 2016-07-01 14:26:24 -07:00
Jakob Stoklund Olesen
ecd8287eb0 Parse controlling type variable. Do basic type inference.
Replace the make_multi_inst() function with a make_inst_results() which uses
the constraint system to create the result values. A typevar argument ensures
that this function does not infer anything from the instruction data arguments.
These arguments may not be valid during parsing.

Implement basic type inference in the parser. If the designated value operand
on a polymorphic instruction refers to a known value, use that to infer the
controlling type variable.

This simple method of type inference requires the operand value to be defined
above the use in the text. Since reordering the EBBs could place a dominating
EBB below the current one, this is a bit fragile. One possibility would be to
require the value is defined in the same EBB. In all other cases, the
controlling typevar should be explicit.
2016-06-01 10:38:34 -07:00
Jakob Stoklund Olesen
fc8d2f92fd Clean up unused-import warnings. 2016-06-01 09:38:24 -07:00
Jakob Stoklund Olesen
1dcac579fb Parse basic blocks and instructions.
Create map entries for ebbs and values as they are defined, but leave ebb and
value operands unresolved on instructions as they are parsed. Instruction
operands can refer to ebbs and values that may not have been defined yet.

Don't infer or check result types yet.
2016-05-18 12:27:12 -07:00
Jakob Stoklund Olesen
5e0e923464 Track instruction order in an EBB.
Place instructions in a doubly linked list and point to the first and last
instruction in an EBB.

Provide an iterator for all the EBBs too. This doesn't reflect the layout
order, but simply the order blocks were created.
2016-05-13 17:58:55 -07:00
Jakob Stoklund Olesen
9c9be1cb58 Break entity references and instruction info out into new modules.
Avoid gathering too much code in repr.rs.

The `entities` module contains entity reference types, and the `instructions`
module contains instruction opcodes and formats.
2016-05-13 14:02:04 -07:00
Jakob Stoklund Olesen
21b0eae044 Fix build. 2016-05-02 16:04:21 -07:00
Jakob Stoklund Olesen
1d768ff734 Implement value lists.
Values that are defined together are represented as a singly linked list. These
lists appear in:

- Instructions with multiple result values. The first result value is special, and the
  following results form a linked list of Def extended_value table entries.

- EBB arguments are represented as a linked list of Argument extended_value
  table entries. The EbbData struct has pointers to the first and last argument
  to allow fast insertion at both ends.

Add a Values iterator type whicih can enumerate both kinds of value lists.
2016-05-02 15:36:54 -07:00
Jakob Stoklund Olesen
e026b36db4 Implement Index<Inst/StackSlot> for Function.
When Function serves as a container for IL entities, use the Index trait to
translate a reference class to a Data object.

Works for:

- StackSlot -> StackSlotData
- Inst -> InstructionData
2016-05-02 12:13:24 -07:00
Jakob Stoklund Olesen
ddea422ceb Add a write.rs module.
Convert a function to text.
2016-04-29 13:53:14 -07:00
Jakob Stoklund Olesen
5c4f3d01e2 Use x.to_string() instead of format!("{}", x).
Both use the Display trait.
2016-04-29 11:55:40 -07:00
Jakob Stoklund Olesen
88931983a8 Parse stack slot decls.
Add a stack slot array to repr::Function, use repr::StackSlot to reference them.

Parse stack slot declarations in the function preamble, add them to the
function.

Add a new `Context` struct which keeps track of mappings between identifiers
used in the file and real references.
2016-04-28 17:35:01 -07:00
Jakob Stoklund Olesen
021bde1191 Add FunctionName, Signature to repr::Function.
Simplify the uses in parser.rs to avoid too many module qualifiers.
2016-04-28 14:54:17 -07:00
Jakob Stoklund Olesen
3a570e8b21 Add repr.rs module containing the representation of functions.
A function owns instructions and extended basic blocks. References to these
entities are implemented as opaque structs indexing into the functions internal
tables. This avoids fighting Rust's ownership checking and it also makes
references 4 bytes on all platforms.

SSA values are identified similarly, but with an optimization for the first
value produced by an instruction. Very few instructions will produce more than
one value, and there is an extended value table for those.
2016-04-07 11:53:37 -07:00