summaryrefslogtreecommitdiff
path: root/Notes/PhaseOverview.md
diff options
context:
space:
mode:
Diffstat (limited to 'Notes/PhaseOverview.md')
-rw-r--r--Notes/PhaseOverview.md80
1 files changed, 80 insertions, 0 deletions
diff --git a/Notes/PhaseOverview.md b/Notes/PhaseOverview.md
new file mode 100644
index 00000000..43766f5e
--- /dev/null
+++ b/Notes/PhaseOverview.md
@@ -0,0 +1,80 @@
+Target Load
+- Parse the passes target specification
+Parse: V V V
+- Convert the source code 1:1 (excluding comments and whitespace) into AST (ordering is maintained)
+LoadCrates: V V V
+- Load any explicitly mentioned extern crates (note: not all crates appear here)
+Expand: V V V
+- Do AST transformations from attributes and macros, also loads the remaining extern crates (std/core, and any triggered by macro expansion)
+- Macro expansion also will trigger parsers
+Implicit Crates: V V V
+- test harness, allocator crate, panic crate
+Resolve Use: V V V
+- Annotate every `use` item with its source (has to handle some nasty recursion)
+Resolve Index: V V V
+- Generate an index of visible items for every module (avoids needing recursioon in the next pass)
+Resolve Absolute: V V V
+- Resolve all paths into either variable names (types/values) or absolute paths.
+HIR Lower: V V V
+- Convert the now-excessive AST into a simpler format "HIR" (convers both expressions and the module tree)
+Resolve Type Aliases: V V V
+- Replace any usage of type aliases with the actual type (NOTE: Doesn't do associated types)
+Resolve Bind: V V V
+- Iterate the HIR tree and set binding annotations on all concrete types (avoids path lookups later)
+Resolve HIR Markings: V V V
+- Generate "markings" (e.g. for Copy/Sync/Send/...) for all types
+Sort Impls: V V V
+- (small pass) sort impls into groups (TODO: why is this done so late?)
+Resolve UFCS Outer: V V V
+- Determine source trait for all top-level <T>::Type paths (aka UfcsUnknown)
+Resolve UFCS paths: V V V
+- Do the same, but include for expressions this time
+- Also normalises the results of the previous pass (expanding known associated types)
+Constant Evaluate: V V V
+- Evaluate all constants
+- NOTE: This is the first stage that can peek forwards (can trigger typecheck+MIR generation for items)
+Typecheck Outer: V V V
+- Check that impls are sane.
+Typecheck Expressions: V V V
+- Resolve and check types for all expressions
+Expand HIR Annotate: V V V
+- Annotate how expressions are used (used for closure extraction and reborrows)
+Expand HIR Closures: V V V
+- Extract closures into structures implmenting Fn* traits
+Expand HIR VTables: V V V
+- Generate vtables for types (NOTE: Has to be done after closure generation)
+Expand HIR Calls: V V V
+- Converts method and callable calls into explicit function calls
+Expand HIR Reborrows: V V V
+- Apply reborrow rules (taking `&mut *v` instead of `v`)
+Expand HIR ErasedType: V V V
+- Replace all erased types `impl Trait` with the true type
+Typecheck Expressions (validate): V V V
+- Double-check that all previous passes haven't broken any of the type system's rules
+Lower MIR: V V V
+- Convert HIR expressions into a control-flow graph (MIR)
+MIR Validate: V V V
+- Check that the generated MIR is consistent
+MIR Cleanup: V V V
+- Perform various transformations on the MIR:
+ - Replace reads of `const` items with the item itself
+ - Convert casts to unsized types into `MakeDst` operations
+MIR Optimise: V V V
+- Perform various simple optimisations on the MIR (constant propagation, dead code elimination, borrow elimination)
+- Does some inlining too
+MIR Validate PO: V V V
+- Re-validate the MIR
+MIR Validate Full: V V V
+- Optionally: Perform expensive state-tracking validation on the MIR
+Trans Enumerate: V V V
+- Enumerate all items that are needed for code generation (primarily, which types are used for generics)
+Trans Auto Impls: V V V
+- Create magic trait impls as enumerated in the previous pass
+Trans Monomorph: V V V
+- Generate monomorphised copies of all functions (with generics replaced with the real types)
+MIR Optimise Inline: V V V
+- Run optimisation again, this time with full type infomration (primiarly for inlining)
+HIR Serialise: V V V
+- Write out the HIR dump (module tree and generic/inline MIR)
+Trans Codegen: V V V
+- Generate final output file (typically emitting a C source file then calling the C compiler)