Add a new option -Cbitcode-in-rlib.

It defaults to true, but Cargo will set this to false whenever it can to
reduce compile times.
This commit is contained in:
Nicholas Nethercote 2020-04-19 20:48:43 +10:00
parent b9f6dfef0b
commit ae322ff651
5 changed files with 38 additions and 1 deletions

View File

@ -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

View File

@ -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)
}

View File

@ -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]

View File

@ -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;

View File

@ -703,6 +703,8 @@ fn parse_src_file_hash(slot: &mut Option<SourceFileHashAlgorithm>, v: Option<&st
"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,