Skip to content

Commit 0189dcc

Browse files
committed
Edit codegen
1 parent 63c033c commit 0189dcc

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

src/overview.md

+27
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,33 @@ Along the way, we also construct the THIR, which is an even more desugared HIR.
194194
THIR is used for pattern and exhaustiveness checking. It is also more
195195
convenient to convert into MIR than HIR is.
196196

197+
We do [many optimizations on the MIR][mir-opt] because it is still
198+
generic and that improves the code we generate later, improving compilation
199+
speed too.
200+
MIR is a higher level (and generic) representation, so it is easier to do
201+
some optimizations at MIR level than at LLVM-IR level. For example LLVM
202+
doesn't seem to be able to optimize the pattern the [`simplify_try`] mir
203+
opt looks for.
204+
205+
Rust code is _monomorphized_, which means making copies of all the generic
206+
code with the type parameters replaced by concrete types. To do
207+
this, we need to collect a list of what concrete types to generate code for.
208+
This is called _monomorphization collection_ and it happens at the MIR level.
209+
210+
### Code generation
211+
212+
We then begin what is vaguely called _code generation_ or _codegen_.
213+
The [code generation stage][codegen] is when higher level
214+
representations of source are turned into an executable binary. `rustc`
215+
uses LLVM for code generation. The first step is to convert the MIR
216+
to LLVM Intermediate Representation (LLVM IR). This is where the MIR
217+
is actually monomorphized, according to the list we created in the
218+
previous step.
219+
The LLVM IR is passed to LLVM, which does a lot more optimizations on it.
220+
It then emits machine code. It is basically assembly code with additional
221+
low-level types and annotations added (e.g. an ELF object or WASM).
222+
The different libraries/binaries are then linked together to produce the final
223+
binary.
197224

198225
[String interning]: https://en.wikipedia.org/wiki/String_interning
199226
[`rustc_lexer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lexer/index.html

0 commit comments

Comments
 (0)