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
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.
Attributes
36.5.
#[test] Implementation
36.6.
Panic Implementation
36.7.
AST Validation
36.8.
Feature Gate Checking
36.9.
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 queries and passes: getting the MIR
40.
Identifiers in the Compiler
41.
Closure expansion
42.
Inline assembly
Analysis
43.
Prologue
44.
Generic parameter definitions
❱
44.1.
What is ty::Generics
44.2.
Early vs Late bound parameters
❱
44.2.1.
Implementation nuances of early/late bound parameters
44.2.2.
Interactions with turbofishing
45.
The ty module: representing types
❱
45.1.
ADTs and Generic Arguments
45.2.
Parameter types/consts/regions
45.3.
EarlyBinder and instantiating parameters
45.4.
Binder and Higher ranked regions
45.5.
Instantiating binders
45.6.
Constants in the type system
46.
TypeFolder and TypeFoldable
47.
Parameter Environments
❱
47.1.
What is it?
47.2.
How are ParamEnv's constructed internally
47.3.
Which ParamEnv do I use?
48.
Type inference
49.
Trait solving
❱
49.1.
Higher-ranked trait bounds
49.2.
Caching subtleties
49.3.
Implied bounds
49.4.
Specialization
49.5.
Chalk-based trait solving
❱
49.5.1.
Lowering to logic
49.5.2.
Goals and clauses
49.5.3.
Canonical queries
49.5.4.
Canonicalization
49.6.
Next-gen trait solving
❱
49.6.1.
Invariants of the type system
49.6.2.
The solver
49.6.3.
Canonicalization
49.6.4.
Coinduction
49.6.5.
Caching
49.6.6.
Proof trees
49.6.7.
Normalization
49.6.8.
Opaque types
49.6.9.
Significant changes and quirks
49.7.
Unsize and CoerceUnsized traits
50.
Type checking
❱
50.1.
Method Lookup
50.2.
Variance
50.3.
Coherence Checking
50.4.
Opaque Types
❱
50.4.1.
Inference details
50.4.2.
Return Position Impl Trait In Trait
50.4.3.
Region inference restrictions
51.
Effect checking
52.
Pattern and Exhaustiveness Checking
53.
Unsafety Checking
54.
MIR dataflow
55.
Drop elaboration
56.
The borrow checker
❱
56.1.
Tracking moves and initialization
❱
56.1.1.
Move paths
56.2.
MIR type checker
56.3.
Drop check
56.4.
Region inference
❱
56.4.1.
Constraint propagation
56.4.2.
Lifetime parameters
56.4.3.
Member constraints
56.4.4.
Placeholders and universes
56.4.5.
Closure constraints
56.4.6.
Error reporting
56.5.
Two-phase-borrows
57.
Errors and Lints
❱
57.1.
Diagnostic and subdiagnostic structs
57.2.
Translation
57.3.
LintStore
57.4.
Error codes
57.5.
Diagnostic items
57.6.
ErrorGuaranteed
58.
Async closures/"coroutine-closures"
MIR to Binaries
59.
Prologue
60.
MIR optimizations
61.
Debugging MIR
62.
Constant evaluation
❱
62.1.
Interpreter
63.
Monomorphization
64.
Lowering MIR
65.
Code Generation
❱
65.1.
Updating LLVM
65.2.
Debugging LLVM
65.3.
Backend Agnostic Codegen
65.4.
Implicit Caller Location
66.
Libraries and Metadata
67.
Profile-guided Optimization
68.
LLVM Source-Based Code Coverage
69.
Sanitizers Support
70.
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
Feature Gate Checking
TODO
: this chapter
#1158