Getting Started
About this guide
Building and debugging rustc
1.
How to build and run the compiler
❱
1.1.
Quickstart
1.2.
Prerequisites
1.3.
Suggested Workflows
1.4.
Distribution artifacts
1.5.
Building Documentation
1.6.
Rustdoc overview
1.7.
Adding a new target
1.8.
Optimized build
2.
Testing the compiler
❱
2.1.
Running tests
❱
2.1.1.
Testing with Docker
2.1.2.
Testing with CI
2.2.
Adding new tests
2.3.
Compiletest
❱
2.3.1.
UI tests
2.3.2.
Test headers
2.4.
Performance testing
2.5.
Crater
2.6.
Suggest tests tool
3.
Debugging the compiler
❱
3.1.
Using the tracing/logging instrumentation
4.
Profiling the compiler
❱
4.1.
with the linux perf tool
4.2.
with Windows Performance Analyzer
5.
crates.io Dependencies
Contributing to Rust
6.
Contribution Procedures
7.
About the compiler team
8.
Using Git
9.
Mastering @rustbot
10.
Walkthrough: a typical contribution
11.
Implementing new language features
12.
Stability attributes
13.
Stabilizing Features
14.
Feature Gates
15.
Coding conventions
16.
Procedures for Breaking Changes
17.
Using external repositories
18.
Fuzzing
19.
Notification groups
❱
19.1.
ARM
19.2.
Cleanup Crew
19.3.
LLVM
19.4.
RISC-V
19.5.
Windows
20.
Licenses
21.
Editions
Bootstrapping
22.
Prologue
23.
What Bootstrapping does
24.
How Bootstrap does it
High-level Compiler Architecture
25.
Prologue
26.
Overview of the compiler
27.
The compiler source code
28.
Queries: demand-driven compilation
❱
28.1.
The Query Evaluation Model in Detail
28.2.
Incremental compilation
28.3.
Incremental compilation In Detail
28.4.
Debugging and Testing
28.5.
Salsa
29.
Memory Management in Rustc
30.
Serialization in Rustc
31.
Parallel Compilation
32.
Rustdoc internals
❱
32.1.
Search
Source Code Representation
33.
Prologue
34.
Command-line arguments
35.
rustc_driver and rustc_interface
❱
35.1.
Example: Type checking
35.2.
Example: Getting diagnostics
36.
Syntax and the AST
❱
36.1.
Lexing and Parsing
36.2.
Macro expansion
36.3.
Name resolution
36.4.
#[test] Implementation
36.5.
Panic Implementation
36.6.
AST Validation
36.7.
Feature Gate Checking
36.8.
Lang Items
37.
The HIR (High-level IR)
❱
37.1.
Lowering AST to HIR
37.2.
Debugging
38.
The THIR (Typed High-level IR)
39.
The MIR (Mid-level IR)
❱
39.1.
MIR construction
39.2.
MIR visitor and traversal
39.3.
MIR passes: getting the MIR for a function
40.
Identifiers in the compiler
41.
Closure expansion
42.
Inline assembly
Analysis
43.
Prologue
44.
The ty module: representing types
❱
44.1.
Generics and substitutions
44.2.
TypeFolder and TypeFoldable
44.3.
Generic arguments
44.4.
Constants in the type system
44.5.
Bound vars and Parameters
45.
Parameter Environments
❱
45.1.
What is it?
45.2.
How are ParamEnv's constructed internally
45.3.
Which ParamEnv do I use?
46.
Type inference
47.
Trait solving
❱
47.1.
Early and Late Bound Parameter Definitions
❱
47.1.1.
What are early and late bound parameters
47.1.2.
Interactions with turbofishing
47.2.
Higher-ranked trait bounds
47.3.
Caching subtleties
47.4.
Implied bounds
47.5.
Specialization
47.6.
Chalk-based trait solving
❱
47.6.1.
Lowering to logic
47.6.2.
Goals and clauses
47.6.3.
Canonical queries
47.6.4.
Canonicalization
47.7.
Next-gen trait solving
❱
47.7.1.
Invariants of the type system
47.7.2.
The solver
47.7.3.
Canonicalization
47.7.4.
Coinduction
47.7.5.
Caching
47.7.6.
Proof trees
47.7.7.
Normalization
47.7.8.
Opaque types
47.7.9.
Significant changes and quirks
47.8.
Unsize and CoerceUnsized traits
48.
Type checking
❱
48.1.
Method Lookup
48.2.
Variance
48.3.
Opaque Types
❱
48.3.1.
Inference details
48.3.2.
Return Position Impl Trait In Trait
48.3.3.
Region inference restrictions
49.
Effect checking
50.
Pattern and Exhaustiveness Checking
51.
Unsafety Checking
52.
MIR dataflow
53.
Drop elaboration
54.
The borrow checker
❱
54.1.
Tracking moves and initialization
❱
54.1.1.
Move paths
54.2.
MIR type checker
54.3.
Drop check
54.4.
Region inference
❱
54.4.1.
Constraint propagation
54.4.2.
Lifetime parameters
54.4.3.
Member constraints
54.4.4.
Placeholders and universes
54.4.5.
Closure constraints
54.4.6.
Error reporting
54.5.
Two-phase-borrows
55.
Errors and Lints
❱
55.1.
Diagnostic and subdiagnostic structs
55.2.
Translation
55.3.
LintStore
55.4.
Error codes
55.5.
Diagnostic items
55.6.
ErrorGuaranteed
MIR to Binaries
56.
Prologue
57.
MIR optimizations
58.
Debugging
59.
Constant evaluation
❱
59.1.
Interpreter
60.
Monomorphization
61.
Lowering MIR
62.
Code Generation
❱
62.1.
Updating LLVM
62.2.
Debugging LLVM
62.3.
Backend Agnostic Codegen
62.4.
Implicit Caller Location
63.
Libraries and Metadata
64.
Profile-guided Optimization
65.
LLVM Source-Based Code Coverage
66.
Sanitizers Support
67.
Debugging support in the Rust compiler
Appendix A: Background topics
Appendix B: Glossary
Appendix C: Code Index
Appendix D: Compiler Lecture Series
Appendix E: Bibliography
Appendix Z: HumorRust
Light (default)
Rust
Coal
Navy
Ayu
Rust Compiler Development Guide
Reporting region errors
TODO: we should discuss how to generate errors from the results of these analyses.