Skip to content

Commit 54396a3

Browse files
committed
Scaffold internals docs & add initial overview
1 parent a70a60a commit 54396a3

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

mk/docs.mk

+8-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ ERR_IDX_GEN = $(RPATH_VAR2_T_$(CFG_BUILD)_H_$(CFG_BUILD)) $(ERR_IDX_GEN_EXE)
6565

6666
D := $(S)src/doc
6767

68-
DOC_TARGETS := book nomicon style error-index
68+
DOC_TARGETS := book nomicon style error-index internals
6969
COMPILER_DOC_TARGETS :=
7070
DOC_L10N_TARGETS :=
7171

@@ -208,6 +208,13 @@ doc/nomicon/index.html: $(RUSTBOOK_EXE) $(wildcard $(S)/src/doc/nomicon/*.md) |
208208
$(Q)rm -rf doc/nomicon
209209
$(Q)$(RUSTBOOK) build $(S)src/doc/nomicon doc/nomicon
210210

211+
internals: doc/internals/index.html
212+
213+
doc/internals/index.html: $(RUSTBOOK_EXE) $(wildcard $(S)/src/doc/internals/*.md) | doc/
214+
@$(call E, rustbook: $@)
215+
$(Q)rm -rf doc/internals
216+
$(Q)$(RUSTBOOK) build $(S)src/doc/internals doc/internals
217+
211218
style: doc/style/index.html
212219

213220
doc/style/index.html: $(RUSTBOOK_EXE) $(wildcard $(S)/src/doc/style/*.md) | doc/

src/doc/internals/README.md

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
% Rust Compiler Internals
2+
3+
The Rust compiler is a complex project. Upon first inspection, it can be a
4+
daunting task to attempt to understand all the various crates & modules, the
5+
flow of data and the internal data structures.
6+
7+
This guide aims to give the reader a greater understanding of the inner
8+
workings of the compiler along with some in-depth views into the individual
9+
components of which it is composed.
10+
11+
**NOTE**: This guide assumes a working knowledge of Rust & compilers in
12+
general.

src/doc/internals/SUMMARY.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Summary
2+
3+
* [Overview](overview.md)

src/doc/internals/overview.md

+67
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
% Overview
2+
3+
The Rust compiler is comprised of six main compilation phases.
4+
5+
1. Parsing input
6+
2. Configuration & expanding (cfg rules & syntax extension expansion)
7+
3. Running analysis passes
8+
4. Translation to LLVM
9+
5. LLVM passes
10+
6. Linking
11+
12+
Phase one is responsible for parsing & lexing the input to the compiler. The
13+
output of this phase is an abstract syntax tree (AST). The AST at this point
14+
includes all macro uses & attributes. This means code which will be later
15+
expanded and/or removed due to `cfg` attributes is still present in this
16+
version of the AST. Parsing abstracts away details about individual fies which
17+
have been read into the AST.
18+
19+
Phase two handles configuration and macro expansion. You can think of this
20+
phase as a function acting on the AST from the previous phase. The input for
21+
this phase is the unexpanded AST from phase one, and the output is an expanded
22+
version of the same AST. This phase will expand all macros & syntax
23+
extensions and will evaluate all `cfg` attributes, potentially removing some
24+
code. The resulting AST will not contain any macros or `macro_use` statements.
25+
26+
The code for these first two phases is in [`libsyntax`][libsyntax].
27+
28+
After this phase, the compiler allocates IDs to each node in the AST
29+
(technically not every node, but most of them). If we are writing out
30+
dependencies, that happens now.
31+
32+
The third phase is analysis. This is the most complex phase in the compiler,
33+
and makes up much of the code. This phase included name resolution, type
34+
checking, borrow checking, type & lifetime inference, trait selection, method
35+
selection, linting and so on. Most of the error detection in the compiler comes
36+
from this phase (with the exception of parse errors which arise during
37+
parsing). The "output" of this phase is a set of side tables containing
38+
semantic information about the source program. The analysis code is in
39+
[`librustc`][rustc] and some other crates with the `librustc_` prefix.
40+
41+
The fourth phase is translation. This phase translates the AST (and the side
42+
tables from the previous phase) into LLVM IR (intermediate representation).
43+
This is achieved by calling into the LLVM libraries rather than writing IR
44+
directly to a file. The code for this is in [`librustc_trans`][trans].
45+
46+
Phase five runs the LLVM backend. This runs LLVM's optimization passes on the
47+
generated IR and generates machine code resulting in object files. This phase
48+
is not really part of the Rust compiler, as LLVM carries out all the work.
49+
The interface between LLVM and Rust is in [`librustc_llvm`][llvm].
50+
51+
The final phase, phase six, links the object files into an executable. This is
52+
again outsourced to other tools and not performed by the Rust compiler
53+
directly. The interface is in [`librustc_back`][back] (which also contains some
54+
things used primarily during translation).
55+
56+
A module called the driver coordinates all these phases. It handles all the
57+
highest level coordination of compilation from parsing command line arguments
58+
all the way to invoking the linker to produce an executable.
59+
60+
The next section of the guide covers the driver & individual phases in more
61+
detail.
62+
63+
[libsyntax]: https://github.com/rust-lang/rust/tree/1.6.0/src/libsyntax/
64+
[trans]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc_trans/
65+
[llvm]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc_llvm/
66+
[back]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc_back/
67+
[rustc]: https://github.com/rust-lang/rust/tree/1.6.0/src/librustc/

0 commit comments

Comments
 (0)