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:
parent
b9f6dfef0b
commit
ae322ff651
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user