%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR subgraph compiler frontend --> backend end source --> frontend backend --> binary
pub fn add(a: u8, b: u8) -> u8 {
a.wrapping_add(b)
}
MIR
quite big
in C it's just a single file
LLVM is single-threaded
rustc: hi LLVM, look we are like a C file, now be fast
~1-256 depending on size and configuration
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR crate crate --> cgu1["Codegen-Unit 1"] crate --> cgu2["Codegen-Unit 2"] crate --> cgu3["Codegen-Unit 3"]
fn main() {}
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR mainmir["main (MIR)"] subgraph mycgu1[my CGU 1] mainll["main (LLVM IR)"] end mycgu1 --> |LLVM| mycgu1.rcgu.o mainmir --> mainll mycgu1.rcgu.o --> |link| my_binary std["std (and others)"] --> |link| my_binary
fn main() {}
mod foos {
fn foo1() {}
fn foo2() {}
}
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR mainmir["main (MIR)"] foo1mir["foo1 (MIR)"] foo2mir["foo2 (MIR)"] subgraph mycgu1[my CGU 1] mainll["main (LLVM IR)"] end subgraph mycgu2[my CGU 2] foo1ll["foo1 (LLVM IR)"] foo2ll["foo2 (LLVM IR)"] end mycgu1 --> mycgu1.rcgu.o mycgu2 --> mycgu2.rcgu.o mainmir --> mainll foo1mir --> foo1ll foo2mir --> foo2ll mycgu1.rcgu.o --> my_binary mycgu2.rcgu.o --> my_binary std["std (and others)"] --> my_binary
fn add() {}
fn main() { math::add() }
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR subgraph crate math addmir["add (MIR)"] subgraph mathcgu1[math CGU 1] addll["add (LLVM IR)"] end addmir --> addll mathcgu1 --> mathcgu1.rcgu.o mathcgu1.rcgu.o --> libmath.rlib end subgraph my crate mainmir["main (MIR)"] subgraph mycgu1[my CGU 1] mainll["main (LLVM IR)"] end mycgu1 --> mycgu1.rcgu.o mainmir --> mainll mycgu1.rcgu.o --> my_binary libmath.rlib --> my_binary std["std (and others)"] --> my_binary end style mainmir fill:purple style mycgu1 fill:purple style mainll fill:purple style addmir fill:darkgreen style mathcgu1 fill:darkgreen style addll fill:darkgreen style mathcgu1.rcgu.o fill:darkgreen style libmath.rlib fill:darkgreen
fn add<T: Add>(a: T, b: T) -> T::Output { a + b }
fn main() {
add(0_u16, 0_u16);
add(0_u32, 0_u32);
}
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR addmir["add (MIR)"] useitmir["main (MIR)"] subgraph mycgu1[my CGU 1] addu16ll["add_u16 (LLVM IR)"] addu32ll["add_u32 (LLVM IR)"] useitll["main (LLVM IR)"] end mycgu1 --> mycgu1.rcgu.o addmir -->|instantiate with T=u16| addu16ll addmir -->|instantiate with T=u32| addu32ll useitmir --> useitll mycgu1.rcgu.o --> my_binary std["std (and others)"] --> my_binary
pub fn add<T: Add>(a: T, b: T) -> T::Output {
a + b
}
fn main() {
math::add(0_u16, 0_u16);
math::add(0_u32, 0_u32);
}
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR subgraph crate math addmir["add (MIR)"] end subgraph my crate mainmir["main (MIR)"] end subgraph my crate subgraph mycgu1[my CGU 1] addu16ll["add_u16 (LLVM IR)"] addu32ll["add_u32 (LLVM IR)"] mainll["main (LLVM IR)"] end mainmir --> mainll addmir --> addu16ll addmir --> addu32ll mycgu1 --> mycgu1.rcgu.o mycgu1.rcgu.o --> my_binary std["std (and others)"] --> my_binary end style addmir fill:darkgreen style mainmir fill:purple style addu16ll fill:darkgreen style addu32ll fill:darkgreen style mainll fill:purple
#[inline]
pub fn add(a: u8, b: u8) -> u8 {
a + b
}
fn main() {
let x = math::add(1, 4);
println!("{x}");
}
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR subgraph crate math addmir["add (MIR)"] end subgraph my crate mainmir["main (MIR)"] end subgraph my crate subgraph mycgu1[my CGU 1] addll["add (LLVM IR)"] mainll["main (LLVM IR)"] end mainmir --> mainll addmir --> addll mycgu1 --> mycgu1.rcgu.o mycgu1.rcgu.o --> my_binary std["std (and others)"] --> my_binary end style addmir fill:purple style mainmir fill:darkgreen style addll fill:purple style mainll fill:darkgreen
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR subgraph crate math addmir["add (LLVM IR)"] end subgraph crate math2 submir["sub (LLVM IR)"] end subgraph my crate mainmir["main (LLVM IR)"] end subgraph my crate subgraph fatlto[fat LTO] addll["add (LLVM IR)"] subll["sub (LLVM IR)"] mainll["main (LLVM IR)"] end mainmir --> mainll addmir --> addll submir --> subll fatlto --> my_binary end style addmir fill:purple style addll fill:purple style submir fill:darkblue style subll fill:darkblue style mainmir fill:darkgreen style mainll fill:darkgreen
easily compiles 2-4x more slowly
%%{init: {'theme': 'dark', 'themeVariables': { 'darkMode': true, 'fontSize': '25px' }}}%% flowchart LR subgraph crate math addmir["add (LLVM IR)"] end subgraph crate math2 submir["sub (LLVM IR)"] end subgraph my crate mainmir["main (LLVM IR)"] end subgraph my crate subgraph thinltosummary[ThinLTO Index] end subgraph thinlto1[ThinLTO 1] addll["add (LLVM IR)"] end subgraph thinlto2[ThinLTO 2] subll["sub (LLVM IR)"] end subgraph thinlto3[ThinLTO 3] mainll["main (LLVM IR)"] end mainmir --> thinltosummary addmir --> thinltosummary submir --> thinltosummary thinltosummary --> mainll thinltosummary --> addll thinltosummary --> subll thinlto1 --> my_binary thinlto2 --> my_binary thinlto3 --> my_binary end style mainmir fill:purple style addmir fill:darkgreen style submir fill:darkblue style addll fill:darkgreen style subll fill:darkblue style mainll fill:purple
compiles ~1.1x-1.2x more slowly | ThinLTO Talk