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.
Best practices
2.4.
Compiletest
❱
2.4.1.
UI tests
2.4.2.
Test directives
2.4.3.
Minicore
2.5.
Ecosystem testing
❱
2.5.1.
Crater
2.5.2.
Fuchsia
2.5.3.
Rust for Linux
2.6.
Performance testing
2.7.
Suggest tests tool
2.8.
Misc info
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
4.3.
with the Rust benchmark suite
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.
Apple
19.2.
ARM
19.3.
Cleanup Crew
19.4.
Emscripten
19.5.
LLVM
19.6.
RISC-V
19.7.
WASI
19.8.
WebAssembly
19.9.
Windows
19.10.
Rust for Linux
20.
Licenses
21.
Editions
Bootstrapping
22.
Prologue
23.
What Bootstrapping does
24.
How Bootstrap does it
25.
Debugging bootstrap
High-level Compiler Architecture
26.
Prologue
27.
Overview of the compiler
28.
The compiler source code
29.
Queries: demand-driven compilation
❱
29.1.
The Query Evaluation Model in Detail
29.2.
Incremental compilation
29.3.
Incremental compilation In Detail
29.4.
Debugging and Testing
29.5.
Salsa
30.
Memory Management in Rustc
31.
Serialization in Rustc
32.
Parallel Compilation
33.
Rustdoc internals
❱
33.1.
Search
Source Code Representation
34.
Prologue
35.
Syntax and the AST
❱
35.1.
Lexing and Parsing
35.2.
Macro expansion
35.3.
Name resolution
35.4.
Attributes
35.5.
#[test] Implementation
35.6.
Panic Implementation
35.7.
AST Validation
35.8.
Feature Gate Checking
35.9.
Lang Items
36.
The HIR (High-level IR)
❱
36.1.
Lowering AST to HIR
36.2.
Debugging
37.
The THIR (Typed High-level IR)
38.
The MIR (Mid-level IR)
❱
38.1.
MIR construction
38.2.
MIR visitor and traversal
38.3.
MIR queries and passes: getting the MIR
39.
Inline assembly
Supporting Infrastructure
40.
Command-line arguments
41.
rustc_driver and rustc_interface
❱
41.1.
Example: Type checking
41.2.
Example: Getting diagnostics
42.
Errors and Lints
❱
42.1.
Diagnostic and subdiagnostic structs
42.2.
Translation
42.3.
LintStore
42.4.
Error codes
42.5.
Diagnostic items
42.6.
ErrorGuaranteed
Analysis
43.
Prologue
44.
Generic parameter definitions
❱
44.1.
EarlyBinder and instantiating parameters
45.
Binders and Higher ranked regions
❱
45.1.
Instantiating binders
46.
Early vs Late bound parameters
47.
The ty module: representing types
❱
47.1.
ADTs and Generic Arguments
47.2.
Parameter types/consts/regions
48.
TypeFolder and TypeFoldable
49.
Parameter Environments
❱
49.1.
What is it?
49.2.
How are ParamEnv's constructed internally
49.3.
Which ParamEnv do I use?
50.
Type inference
51.
Trait solving
❱
51.1.
Higher-ranked trait bounds
51.2.
Caching subtleties
51.3.
Implied bounds
51.4.
Specialization
51.5.
Chalk-based trait solving
❱
51.5.1.
Lowering to logic
51.5.2.
Goals and clauses
51.5.3.
Canonical queries
51.5.4.
Canonicalization
51.6.
Next-gen trait solving
❱
51.6.1.
Invariants of the type system
51.6.2.
The solver
51.6.3.
Canonicalization
51.6.4.
Coinduction
51.6.5.
Caching
51.6.6.
Proof trees
51.6.7.
Normalization
51.6.8.
Opaque types
51.6.9.
Significant changes and quirks
51.7.
Unsize and CoerceUnsized traits
52.
Type checking
❱
52.1.
Method Lookup
52.2.
Variance
52.3.
Coherence Checking
52.4.
Opaque Types
❱
52.4.1.
Inference details
52.4.2.
Return Position Impl Trait In Trait
52.4.3.
Region inference restrictions
53.
Effect checking
54.
Pattern and Exhaustiveness Checking
55.
Unsafety Checking
56.
MIR dataflow
57.
Drop elaboration
58.
The borrow checker
❱
58.1.
Tracking moves and initialization
❱
58.1.1.
Move paths
58.2.
MIR type checker
58.3.
Drop check
58.4.
Region inference
❱
58.4.1.
Constraint propagation
58.4.2.
Lifetime parameters
58.4.3.
Member constraints
58.4.4.
Placeholders and universes
58.4.5.
Closure constraints
58.4.6.
Error reporting
58.5.
Two-phase-borrows
59.
Closure capture inference
60.
Async closures/"coroutine-closures"
MIR to Binaries
61.
Prologue
62.
MIR optimizations
63.
Debugging MIR
64.
Constant evaluation
❱
64.1.
Interpreter
65.
Monomorphization
66.
Lowering MIR
67.
Code Generation
❱
67.1.
Updating LLVM
67.2.
Debugging LLVM
67.3.
Backend Agnostic Codegen
67.4.
Implicit Caller Location
68.
Libraries and Metadata
69.
Profile-guided Optimization
70.
LLVM Source-Based Code Coverage
71.
Sanitizers Support
72.
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.