Skip to content

Commit 3df97f9

Browse files
authored
Rollup merge of rust-lang#59401 - japaric:compiler-builtins-stack-sizes, r=alexcrichton
bootstrap: build crates under libtest with -Z emit-stack-sizes Please see the comment in the diff for the rationale. This change adds a `.stack_sizes` linker section to `libcompiler_builtins.rlib` but this section is discarded by the linker by default so it won't affect the binary size of most programs. It will, however, negatively affect the binary size of programs that link to a recent release of the `cortex-m-rt` crate because of the linker script that crate provides, but I have proposed a PR (rust-embedded/cortex-m-rt#186) to solve the problem (which I originally introduced :-)). This change does increase the size of the `libcompiler_builtins.rlib` artifact we distribute but the increase is in the order of (a few) KBs. r? @alexcrichton
2 parents f9262af + 7d365cf commit 3df97f9

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

src/bootstrap/bin/rustc.rs

+27
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,33 @@ fn main() {
181181
cmd.arg("-C").arg(format!("debug-assertions={}", debug_assertions));
182182
}
183183

184+
// Build all crates in the `std` facade with `-Z emit-stack-sizes` to add stack usage
185+
// information.
186+
//
187+
// When you use this `-Z` flag with Cargo you get stack usage information on all crates
188+
// compiled from source, and when you are using LTO you also get information on pre-compiled
189+
// crates like `core` and `std`, even if they were not compiled with `-Z emit-stack-sizes`.
190+
// However, there's an exception: `compiler_builtins`. This crate is special and doesn't
191+
// participate in LTO because it's always linked as a separate object file. For this reason
192+
// it's impossible to get stack usage information about `compiler-builtins` using
193+
// `RUSTFLAGS` + Cargo, or `cargo rustc`.
194+
//
195+
// To make the stack usage information of all crates under the `std` facade available to
196+
// Cargo based stack usage analysis tools, in both LTO and non-LTO mode, we compile them
197+
// with the `-Z emit-stack-sizes` flag. The `RUSTC_EMIT_STACK_SIZES` var helps us apply this
198+
// flag only to the crates in the `std` facade. The `-Z` flag is known to currently work
199+
// with targets that produce ELF files so we limit its use flag to those targets.
200+
//
201+
// NOTE(japaric) if this ever causes problem with an LLVM upgrade or any PR feel free to
202+
// remove it or comment it out
203+
if env::var_os("RUSTC_EMIT_STACK_SIZES").is_some()
204+
&& (target.contains("-linux-")
205+
|| target.contains("-none-eabi")
206+
|| target.ends_with("-none-elf"))
207+
{
208+
cmd.arg("-Zemit-stack-sizes");
209+
}
210+
184211
if let Ok(s) = env::var("RUSTC_CODEGEN_UNITS") {
185212
cmd.arg("-C").arg(format!("codegen-units={}", s));
186213
}

src/bootstrap/compile.rs

+4
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ impl Step for Std {
9797
let _folder = builder.fold_output(|| format!("stage{}-std", compiler.stage));
9898
builder.info(&format!("Building stage{} std artifacts ({} -> {})", compiler.stage,
9999
&compiler.host, target));
100+
// compile with `-Z emit-stack-sizes`; see bootstrap/src/rustc.rs for more details
101+
cargo.env("RUSTC_EMIT_STACK_SIZES", "1");
100102
run_cargo(builder,
101103
&mut cargo,
102104
&libstd_stamp(builder, compiler, target),
@@ -382,6 +384,8 @@ impl Step for Test {
382384
let _folder = builder.fold_output(|| format!("stage{}-test", compiler.stage));
383385
builder.info(&format!("Building stage{} test artifacts ({} -> {})", compiler.stage,
384386
&compiler.host, target));
387+
// compile with `-Z emit-stack-sizes`; see bootstrap/src/rustc.rs for more details
388+
cargo.env("RUSTC_EMIT_STACK_SIZES", "1");
385389
run_cargo(builder,
386390
&mut cargo,
387391
&libtest_stamp(builder, compiler, target),

0 commit comments

Comments
 (0)