| # High-level overview of the compiler source | 
 |  | 
 | Now that we have [seen what the compiler does][orgch], | 
 | let's take a look at the structure of the [`rust-lang/rust`] repository, | 
 | where the rustc source code lives. | 
 |  | 
 | [`rust-lang/rust`]: https://github.com/rust-lang/rust | 
 |  | 
 | > You may find it helpful to read the ["Overview of the compiler"][orgch] | 
 | > chapter, which introduces how the compiler works, before this one. | 
 |  | 
 | [orgch]: ./overview.md | 
 |  | 
 | ## Workspace structure | 
 |  | 
 | The [`rust-lang/rust`] repository consists of a single large cargo workspace | 
 | containing the compiler, the standard libraries ([`core`], [`alloc`], [`std`], | 
 | [`proc_macro`], [`etc`]), and [`rustdoc`], along with the build system and a | 
 | bunch of tools and submodules for building a full Rust distribution. | 
 |  | 
 | The repository consists of three main directories: | 
 |  | 
 | - [`compiler/`] contains the source code for `rustc`. It consists of many crates | 
 |   that together make up the compiler. | 
 |    | 
 | - [`library/`] contains the standard libraries ([`core`], [`alloc`], [`std`], | 
 |   [`proc_macro`], [`test`]), as well as the Rust runtime ([`backtrace`], [`rtstartup`], | 
 |   [`lang_start`]). | 
 |    | 
 | - [`tests/`] contains the compiler tests. | 
 |    | 
 | - [`src/`] contains the source code for [`rustdoc`], [`clippy`], [`cargo`], the build system, | 
 |   language docs, etc. | 
 |  | 
 | [`alloc`]: https://github.com/rust-lang/rust/tree/master/library/alloc | 
 | [`backtrace`]: https://github.com/rust-lang/backtrace-rs/ | 
 | [`cargo`]: https://github.com/rust-lang/cargo | 
 | [`clippy`]: https://github.com/rust-lang/rust/tree/master/src/tools/clippy | 
 | [`compiler/`]: https://github.com/rust-lang/rust/tree/master/compiler | 
 | [`core`]: https://github.com/rust-lang/rust/tree/master/library/core | 
 | [`etc`]: https://github.com/rust-lang/rust/tree/master/src/etc | 
 | [`lang_start`]: https://github.com/rust-lang/rust/blob/master/library/std/src/rt.rs | 
 | [`library/`]: https://github.com/rust-lang/rust/tree/master/library | 
 | [`proc_macro`]: https://github.com/rust-lang/rust/tree/master/library/proc_macro | 
 | [`rtstartup`]: https://github.com/rust-lang/rust/tree/master/library/rtstartup | 
 | [`rust-lang/rust`]: https://github.com/rust-lang/rust | 
 | [`rustdoc`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc | 
 | [`src/`]: https://github.com/rust-lang/rust/tree/master/src | 
 | [`std`]: https://github.com/rust-lang/rust/tree/master/library/std | 
 | [`test`]: https://github.com/rust-lang/rust/tree/master/library/test | 
 | [`tests/`]: https://github.com/rust-lang/rust/tree/master/tests | 
 |  | 
 | ## Compiler | 
 |  | 
 | The compiler is implemented in the various [`compiler/`] crates. | 
 | The [`compiler/`] crates all have names starting with `rustc_*`. These are a | 
 | collection of around 50 interdependent crates ranging in size from tiny to | 
 | huge. There is also the `rustc` crate which is the actual binary (i.e. the | 
 | `main` function); it doesn't actually do anything besides calling the | 
 | [`rustc_driver`] crate, which drives the various parts of compilation in other | 
 | crates. | 
 |  | 
 | The dependency order of these crates is complex, but roughly it is | 
 | something like this: | 
 |  | 
 | 1. `rustc` (the binary) calls [`rustc_driver::main`][main]. | 
 | 1. [`rustc_driver`] depends on a lot of other crates, but the main one is | 
 |    [`rustc_interface`]. | 
 | 1. [`rustc_interface`] depends on most of the other compiler crates. It is a | 
 |    fairly generic interface for driving the whole compilation. | 
 | 1. Most of the other `rustc_*` crates depend on [`rustc_middle`], which defines | 
 |    a lot of central data structures in the compiler. | 
 | 1. [`rustc_middle`] and most of the other crates depend on a handful of crates | 
 |    representing the early parts of the compiler (e.g. the parser), fundamental | 
 |    data structures (e.g. [`Span`]), or error reporting: | 
 |    [`rustc_data_structures`], [`rustc_span`], [`rustc_errors`], etc. | 
 |  | 
 | [`rustc_data_structures`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/index.html | 
 | [`rustc_driver`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/index.html | 
 | [`rustc_errors`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/index.html | 
 | [`rustc_interface`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/index.html | 
 | [`rustc_middle`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/index.html | 
 | [`rustc_span`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/index.html | 
 | [`Span`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html | 
 | [main]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/fn.main.html | 
 |  | 
 | You can see the exact dependencies by running `cargo tree`, | 
 | just like you would for any other Rust package: | 
 |  | 
 | ```console | 
 | cargo tree --package rustc_driver | 
 | ``` | 
 |  | 
 | One final thing: [`src/llvm-project`] is a submodule for our fork of LLVM. | 
 | During bootstrapping, LLVM is built and the [`compiler/rustc_llvm`] crate | 
 | contains Rust wrappers around LLVM (which is written in C++), so that the | 
 | compiler can interface with it. | 
 |  | 
 | Most of this book is about the compiler, so we won't have any further | 
 | explanation of these crates here. | 
 |  | 
 | [`compiler/rustc_llvm`]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_llvm | 
 | [`src/llvm-project`]: https://github.com/rust-lang/rust/tree/master/src/ | 
 | [`Cargo.toml`]: https://github.com/rust-lang/rust/blob/master/Cargo.toml | 
 |  | 
 | ### Big picture | 
 |  | 
 | The dependency structure of the compiler is influenced by two main factors: | 
 |  | 
 | 1. Organization. The compiler is a _huge_ codebase; it would be an impossibly | 
 |    large crate. In part, the dependency structure reflects the code structure | 
 |    of the compiler. | 
 | 2. Compile-time. By breaking the compiler into multiple crates, we can take | 
 |    better advantage of incremental/parallel compilation using cargo. In | 
 |    particular, we try to have as few dependencies between crates as possible so | 
 |    that we don't have to rebuild as many crates if you change one. | 
 |  | 
 | At the very bottom of the dependency tree are a handful of crates that are used | 
 | by the whole compiler (e.g. [`rustc_span`]). The very early parts of the | 
 | compilation process (e.g. [parsing and the Abstract Syntax Tree (`AST`)][parser])  | 
 | depend on only these. | 
 |  | 
 | After the [`AST`][parser] is constructed and other early analysis is done, the | 
 | compiler's [query system][query] gets set up. The query system is set up in a | 
 | clever way using function pointers. This allows us to break dependencies | 
 | between crates, allowing more parallel compilation. The query system is defined | 
 | in [`rustc_middle`], so nearly all subsequent parts of the compiler depend on | 
 | this crate. It is a really large crate, leading to long compile times. Some | 
 | efforts have been made to move stuff out of it with varying success. Another | 
 | side-effect is that sometimes related functionality gets scattered across | 
 | different crates. For example, linting functionality is found across earlier | 
 | parts of the crate, [`rustc_lint`], [`rustc_middle`], and other places. | 
 |  | 
 | Ideally there would be fewer, more cohesive crates, with incremental and | 
 | parallel compilation making sure compile times stay reasonable. However, | 
 | incremental and parallel compilation haven't gotten good enough for that yet, | 
 | so breaking things into separate crates has been our solution so far. | 
 |  | 
 | At the top of the dependency tree is [`rustc_driver`] and [`rustc_interface`] | 
 | which is an unstable wrapper around the query system helping drive various | 
 | stages of compilation. Other consumers of the compiler may use this interface | 
 | in different ways (e.g. [`rustdoc`] or maybe eventually `rust-analyzer`). The | 
 | [`rustc_driver`] crate first parses command line arguments and then uses | 
 | [`rustc_interface`] to drive the compilation to completion. | 
 |  | 
 | [parser]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html | 
 | [`rustc_lint`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/index.html | 
 | [query]: ./query.md | 
 |  | 
 | ## rustdoc | 
 |  | 
 | The bulk of [`rustdoc`] is in [`librustdoc`]. However, the [`rustdoc`] binary | 
 | itself is [`src/tools/rustdoc`], which does nothing except call [`rustdoc::main`]. | 
 |  | 
 | There is also `JavaScript` and `CSS` for the docs in [`src/tools/rustdoc-js`] | 
 | and [`src/tools/rustdoc-themes`]. | 
 |  | 
 | You can read more about [`rustdoc`] in [this chapter][rustdoc-chapter]. | 
 |  | 
 | [`librustdoc`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/index.html | 
 | [`rustdoc::main`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/fn.main.html | 
 | [`src/tools/rustdoc-js`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc-js | 
 | [`src/tools/rustdoc-themes`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc-themes | 
 | [`src/tools/rustdoc`]:  https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc | 
 | [rustdoc-chapter]: ./rustdoc.md | 
 |  | 
 | ## Tests | 
 |  | 
 | The test suite for all of the above is in [`tests/`]. You can read more | 
 | about the test suite [in this chapter][testsch]. | 
 |  | 
 | The test harness is in [`src/tools/compiletest/`][`compiletest/`]. | 
 |  | 
 | [`tests/`]: https://github.com/rust-lang/rust/tree/master/tests | 
 | [testsch]: ./tests/intro.md | 
 |  | 
 | ## Build System | 
 |  | 
 | There are a number of tools in the repository just for building the compiler, | 
 | standard library, [`rustdoc`], etc, along with testing, building a full Rust | 
 | distribution, etc. | 
 |  | 
 | One of the primary tools is [`src/bootstrap/`]. You can read more about | 
 | bootstrapping [in this chapter][bootstch]. The process may also use other tools | 
 | from [`src/tools/`], such as [`tidy/`] or [`compiletest/`]. | 
 |  | 
 | [`compiletest/`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest | 
 | [`src/bootstrap/`]: https://github.com/rust-lang/rust/tree/master/src/bootstrap | 
 | [`src/tools/`]: https://github.com/rust-lang/rust/tree/master/src/tools | 
 | [`tidy/`]: https://github.com/rust-lang/rust/tree/master/src/tools/tidy | 
 | [bootstch]: ./building/bootstrapping/intro.md | 
 |  | 
 | ## Standard library | 
 |  | 
 | This code is fairly similar to most other Rust crates except that it must be | 
 | built in a special way because it can use unstable ([`nightly`]) features. | 
 | The standard library is sometimes referred to as [`libstd or the "standard facade"`]. | 
 |  | 
 | [`libstd or the "standard facade"`]: https://rust-lang.github.io/rfcs/0040-libstd-facade.html | 
 | [`nightly`]: https://doc.rust-lang.org/nightly/nightly-rustc/ | 
 |  | 
 | ## Other | 
 |  | 
 | There are a lot of other things in the `rust-lang/rust` repo that are related | 
 | to building a full Rust distribution. Most of the time you don't need to worry about them. | 
 |  | 
 | These include: | 
 | - [`src/ci`]: The CI configuration. This actually quite extensive because we | 
 |   run a lot of tests on a lot of platforms. | 
 | - [`src/doc`]: Various documentation, including submodules for a few books. | 
 | - [`src/etc`]: Miscellaneous utilities. | 
 | - And more... | 
 |  | 
 | [`src/ci`]: https://github.com/rust-lang/rust/tree/master/src/ci | 
 | [`src/doc`]: https://github.com/rust-lang/rust/tree/master/src/doc | 
 | [`src/etc`]: https://github.com/rust-lang/rust/tree/master/src/etc |