# how rust compiles

- welcome to my talk about how rust compiles
    - we'll take a look at rusts compilation model
- before we get started
    - example of confusing behavior arising from the model
- me
- behind cargo build
    - we use cargo
    - one cargo many rustc per crate
    - use -v
- what does rustc do
- source example
    - add function that adds
- frontend and backend
- frontend in a single slide
    - parse into AST
    - resolve, typecheck
- MIR
    - intermediate representation
    - borrow checker
- LLVM IR
    - LLVM backend
    - clang, swift, julia
    - IR to assembly
    - optimizes
- Assembly
    - machine code
- it's not that simple
- backend orchestration
    - how, what, and when invoking LLVM
- codegen unit
    - LLVM module/object file
    - group of functions
    - linked together
- more codegen units
    - three functions into two codegen units
    - functions grouped into codegen units is complicated
- codegen units cross crate
    - a great add function
    - add into cgu in math crate
    - object file into rlibs
- generics
    - mono
- instantiating generics
    - MIR to LLVM IR
- generics cross crate
    - math crate only MIR
    - instantiated in our own crate
    - read MIR from rlib
- inlining
    - a function call
    - inefficient call
    - maybe just turn it into 5
- inlining
    - very good
    - everywhere, or very slow
- cross crate inlining catch
    - access to the body
- #[inline]
    - why?
- #[inline]
    - like a generic function
    - instantiated downstream
- #[inline]
    - non-generic
    - automatically for small
    - not for others
    - cross-crate-inline-threshold=always
    - dont always use it because its slow
    - dont forget about it
    - benchmark
    - todo
- if you dont want to worry about this as an application
- LTO
    - no cross-crate-inline-threshold
    - LTO
    - applies optimizations once for everything at the end
    - breaks crate boundaries
    - slow
- fat LTO
    - LLVM IR instead of machine code in libs
    - combines all LLVM IR
    - this CGU is huge, not parallel
    - see everything
    - not all optimizations for larger programs
- thin LTO
    - confusing name
    - try both
    - LLVM IR for libs
    - for generics, just in instantiating crate
    - combine for summary
    - summary of function (size and where to find it)
    - many different units in parallel
    - look at the summary for inlining
- linker plugin LTO
    - fat LTO or thin LTO
    - not by rustc, but by the linker
    - across languages
    - LLVM IR from Rust, LLVM IR from clang
    - annoying to set up
