Skip to content

Commit

Permalink
Auto merge of #71323 - nnethercote:bitcode-in-rlib, r=alexcrichton
Browse files Browse the repository at this point in the history
Add `-Cbitcode-in-rlib`.

This is a cut-down version of #70458 that gets the compile-time wins.

r? @alexcrichton
  • Loading branch information
bors committed Apr 22, 2020
2 parents 2dc5b60 + a105c5c commit 4bfd62a
Show file tree
Hide file tree
Showing 12 changed files with 60 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/bootstrap/check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ impl Step for Std {
let compiler = builder.compiler(0, builder.config.build);

let mut cargo = builder.cargo(compiler, Mode::Std, target, cargo_subcommand(builder.kind));
std_cargo(builder, target, &mut cargo);
std_cargo(builder, target, compiler.stage, &mut cargo);

builder.info(&format!("Checking std artifacts ({} -> {})", &compiler.host, target));
run_cargo(
Expand Down
16 changes: 14 additions & 2 deletions src/bootstrap/compile.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ impl Step for Std {
target_deps.extend(copy_third_party_objects(builder, &compiler, target).into_iter());

let mut cargo = builder.cargo(compiler, Mode::Std, target, "build");
std_cargo(builder, target, &mut cargo);
std_cargo(builder, target, compiler.stage, &mut cargo);

builder.info(&format!(
"Building stage{} std artifacts ({} -> {})",
Expand Down Expand Up @@ -164,7 +164,7 @@ fn copy_third_party_objects(

/// Configure cargo to compile the standard library, adding appropriate env vars
/// and such.
pub fn std_cargo(builder: &Builder<'_>, target: Interned<String>, cargo: &mut Cargo) {
pub fn std_cargo(builder: &Builder<'_>, target: Interned<String>, stage: u32, cargo: &mut Cargo) {
if let Some(target) = env::var_os("MACOSX_STD_DEPLOYMENT_TARGET") {
cargo.env("MACOSX_DEPLOYMENT_TARGET", target);
}
Expand Down Expand Up @@ -231,6 +231,18 @@ pub fn std_cargo(builder: &Builder<'_>, target: Interned<String>, cargo: &mut Ca
}
}
}

// By default, rustc uses `-Cbitcode-in-rlib=yes`, and Cargo overrides that
// with `-Cbitcode-in-rlib=no` for non-LTO builds. However, libstd must be
// built with bitcode so that the produced rlibs can be used for both LTO
// builds (which use bitcode) and non-LTO builds (which use object code).
// So we override the override here!
//
// But we don't bother for the stage 0 compiler because it's never used
// with LTO.
if stage >= 1 {
cargo.rustflag("-Cbitcode-in-rlib=yes");
}
}

#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
Expand Down
2 changes: 1 addition & 1 deletion src/bootstrap/doc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,7 @@ impl Step for Std {

let run_cargo_rustdoc_for = |package: &str| {
let mut cargo = builder.cargo(compiler, Mode::Std, target, "rustdoc");
compile::std_cargo(builder, target, &mut cargo);
compile::std_cargo(builder, target, compiler.stage, &mut cargo);

// Keep a whitelist so we do not build internal stdlib crates, these will be
// build by the rustc step later if enabled.
Expand Down
2 changes: 1 addition & 1 deletion src/bootstrap/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1725,7 +1725,7 @@ impl Step for Crate {
let mut cargo = builder.cargo(compiler, mode, target, test_kind.subcommand());
match mode {
Mode::Std => {
compile::std_cargo(builder, target, &mut cargo);
compile::std_cargo(builder, target, compiler.stage, &mut cargo);
}
Mode::Rustc => {
builder.ensure(compile::Rustc { compiler, target });
Expand Down
20 changes: 20 additions & 0 deletions src/doc/rustc/src/codegen-options/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,26 @@ It takes one of the following values:
For example, for gcc flavor linkers, this issues the `-nodefaultlibs` flag to
the linker.

## bitcode-in-rlib

This flag controls whether or not the compiler puts compressed LLVM bitcode
into generated rlibs. It takes one of the following values:

* `y`, `yes`, `on`, or no value: put bitcode in rlibs (the default).
* `n`, `no`, or `off`: omit bitcode from rlibs.

LLVM bitcode is only needed when link-time optimization (LTO) is being
performed, but it is enabled by default for backwards compatibility reasons.

The use of `-C bitcode-in-rlib=no` can significantly improve compile times and
reduce generated file sizes. For these reasons, Cargo uses `-C
bitcode-in-rlib=no` whenever possible. Likewise, if you are building directly
with `rustc` we recommend using `-C bitcode-in-rlib=no` whenever you are not
using LTO.

If combined with `-C lto`, `-C bitcode-in-rlib=no` will cause `rustc` to abort
at start-up, because the combination is invalid.

[option-emit]: ../command-line-arguments.md#option-emit
[option-o-optimize]: ../command-line-arguments.md#option-o-optimize
[profile-guided optimization]: ../profile-guided-optimization.md
Expand Down
3 changes: 2 additions & 1 deletion src/librustc_codegen_ssa/back/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,8 @@ pub struct CompiledModules {
}

fn need_crate_bitcode_for_rlib(sess: &Session) -> bool {
sess.crate_types.borrow().contains(&config::CrateType::Rlib)
sess.opts.cg.bitcode_in_rlib
&& sess.crate_types.borrow().contains(&config::CrateType::Rlib)
&& sess.opts.output_types.contains_key(&OutputType::Exe)
}

Expand Down
4 changes: 4 additions & 0 deletions src/librustc_interface/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,10 @@ fn test_codegen_options_tracking_hash() {
opts = reference.clone();
opts.cg.linker_plugin_lto = LinkerPluginLto::LinkerPluginAuto;
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());

opts = reference.clone();
opts.cg.bitcode_in_rlib = false;
assert!(reference.dep_tracking_hash() != opts.dep_tracking_hash());
}

#[test]
Expand Down
1 change: 0 additions & 1 deletion src/librustc_middle/mir/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ impl Cache {
}

/// This will recompute the predecessors cache if it is not available
// njn: typedef?
fn predecessors(
&mut self,
body: &Body<'_>,
Expand Down
10 changes: 10 additions & 0 deletions src/librustc_session/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1685,6 +1685,16 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
);
}

if !cg.bitcode_in_rlib {
match cg.lto {
LtoCli::No | LtoCli::Unspecified => {}
LtoCli::Yes | LtoCli::NoParam | LtoCli::Thin | LtoCli::Fat => early_error(
error_format,
"options `-C bitcode-in-rlib=no` and `-C lto` are incompatible",
),
}
}

let prints = collect_print_requests(&mut cg, &mut debugging_opts, matches, error_format);

let cg = cg;
Expand Down
2 changes: 2 additions & 0 deletions src/librustc_session/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
"compile the program with profiling instrumentation"),
profile_use: Option<PathBuf> = (None, parse_opt_pathbuf, [TRACKED],
"use the given `.profdata` file for profile-guided optimization"),
bitcode_in_rlib: bool = (true, parse_bool, [TRACKED],
"emit bitcode in rlibs (default: yes)"),
}

options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
Expand Down
3 changes: 3 additions & 0 deletions src/test/ui/lto-and-no-bitcode-in-rlib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// compile-flags: -C lto -C bitcode-in-rlib=no

fn main() {}
2 changes: 2 additions & 0 deletions src/test/ui/lto-and-no-bitcode-in-rlib.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
error: options `-C bitcode-in-rlib=no` and `-C lto` are incompatible

0 comments on commit 4bfd62a

Please sign in to comment.