@@ -13,7 +13,7 @@ will finally take the MIR and produce some executable machine code.
13
13
14
14
> NOTE: This part of a compiler is often called the _ backend_ . The term is a bit
15
15
> overloaded because in the compiler source, it usually refers to the "codegen
16
- > backend" (i.e. LLVM or Cranelift ). Usually, when you see the word "backend"
16
+ > backend" (i.e. LLVM, Cranelift, or GCC ). Usually, when you see the word "backend"
17
17
> in this part, we are referring to the "codegen backend".
18
18
19
19
So what do we need to do?
@@ -26,29 +26,27 @@ So what do we need to do?
26
26
collecting all the concrete types is called _ monomorphization collection_ .
27
27
1 . Next, we need to actually lower the MIR to a codegen IR
28
28
(usually LLVM IR) for each concrete type we collected.
29
- 2 . Finally, we need to invoke LLVM or Cranelift , which runs a bunch of
29
+ 2 . Finally, we need to invoke the codegen backend , which runs a bunch of
30
30
optimization passes, generates executable code, and links together an
31
31
executable binary.
32
32
33
33
[ codegen1 ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html
34
34
35
35
The code for codegen is actually a bit complex due to a few factors:
36
36
37
- - Support for multiple codegen backends (LLVM and Cranelift ). We try to share as much
37
+ - Support for multiple codegen backends (LLVM, Cranelift, and GCC ). We try to share as much
38
38
backend code between them as possible, so a lot of it is generic over the
39
39
codegen implementation. This means that there are often a lot of layers of
40
40
abstraction.
41
41
- Codegen happens asynchronously in another thread for performance.
42
- - The actual codegen is done by a third-party library (either LLVM or Cranelift ).
42
+ - The actual codegen is done by a third-party library (either of the 3 backends ).
43
43
44
- Generally, the [ ` rustc_codegen_ssa ` ] [ ssa ] crate contains backend-agnostic code
45
- (i.e. independent of LLVM or Cranelift), while the [ ` rustc_codegen_llvm ` ] [ llvm ]
46
- crate contains code specific to LLVM codegen.
44
+ Generally, the [ ` rustc_codegen_ssa ` ] [ ssa ] crate contains backend-agnostic code,
45
+ while the [ ` rustc_codegen_llvm ` ] [ llvm ] crate contains code specific to LLVM codegen.
47
46
48
47
[ ssa ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/index.html
49
48
[ llvm ] : https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/index.html
50
49
51
50
At a very high level, the entry point is
52
51
[ ` rustc_codegen_ssa::base::codegen_crate ` ] [ codegen1 ] . This function starts the
53
52
process discussed in the rest of this chapter.
54
-
0 commit comments