website/slides/speaker-notes.md
2025-09-29 20:41:20 +02:00

2.5 KiB

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
    • CFG
    • 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
  • 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