Allow use of -Clto=thin
with -Ccodegen-units=1
in general
The current logic to ignore ThinLTO when `-Ccodegen-units=1` makes sense for local ThinLTO but even in this scenario, a user may still want (non-local) ThinLTO for the purpose of optimizing dependencies into the final crate which is being compiled with 1 CGU. The previous behavior was even more confusing because if you were generating a binary (`--emit=link`), then you would get ThinLTO but if you asked for LLVM IR or bytecode, then it would silently change to using regular LTO. With this change, we only override the defaults for local ThinLTO if you ask for a single output such as LLVM IR or bytecode and in all other cases honor the requested LTO setting.
This commit is contained in:
parent
9b0a099dfc
commit
7c6345d175
3 changed files with 11 additions and 14 deletions
|
@ -738,7 +738,7 @@ impl Default for Options {
|
|||
actually_rustdoc: false,
|
||||
trimmed_def_paths: TrimmedDefPaths::default(),
|
||||
cli_forced_codegen_units: None,
|
||||
cli_forced_thinlto_off: false,
|
||||
cli_forced_local_thinlto_off: false,
|
||||
remap_path_prefix: Vec::new(),
|
||||
real_rust_source_base_dir: None,
|
||||
edition: DEFAULT_EDITION,
|
||||
|
@ -1720,7 +1720,7 @@ fn should_override_cgus_and_disable_thinlto(
|
|||
error_format: ErrorOutputType,
|
||||
mut codegen_units: Option<usize>,
|
||||
) -> (bool, Option<usize>) {
|
||||
let mut disable_thinlto = false;
|
||||
let mut disable_local_thinlto = false;
|
||||
// Issue #30063: if user requests LLVM-related output to one
|
||||
// particular path, disable codegen-units.
|
||||
let incompatible: Vec<_> = output_types
|
||||
|
@ -1745,12 +1745,12 @@ fn should_override_cgus_and_disable_thinlto(
|
|||
}
|
||||
early_warn(error_format, "resetting to default -C codegen-units=1");
|
||||
codegen_units = Some(1);
|
||||
disable_thinlto = true;
|
||||
disable_local_thinlto = true;
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
codegen_units = Some(1);
|
||||
disable_thinlto = true;
|
||||
disable_local_thinlto = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1759,7 +1759,7 @@ fn should_override_cgus_and_disable_thinlto(
|
|||
early_error(error_format, "value for codegen units must be a positive non-zero integer");
|
||||
}
|
||||
|
||||
(disable_thinlto, codegen_units)
|
||||
(disable_local_thinlto, codegen_units)
|
||||
}
|
||||
|
||||
fn check_thread_count(unstable_opts: &UnstableOptions, error_format: ErrorOutputType) {
|
||||
|
@ -2249,7 +2249,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
|||
let output_types = parse_output_types(&unstable_opts, matches, error_format);
|
||||
|
||||
let mut cg = CodegenOptions::build(matches, error_format);
|
||||
let (disable_thinlto, mut codegen_units) = should_override_cgus_and_disable_thinlto(
|
||||
let (disable_local_thinlto, mut codegen_units) = should_override_cgus_and_disable_thinlto(
|
||||
&output_types,
|
||||
matches,
|
||||
error_format,
|
||||
|
@ -2492,7 +2492,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
|
|||
actually_rustdoc: false,
|
||||
trimmed_def_paths: TrimmedDefPaths::default(),
|
||||
cli_forced_codegen_units: codegen_units,
|
||||
cli_forced_thinlto_off: disable_thinlto,
|
||||
cli_forced_local_thinlto_off: disable_local_thinlto,
|
||||
remap_path_prefix,
|
||||
real_rust_source_base_dir,
|
||||
edition,
|
||||
|
|
|
@ -181,7 +181,7 @@ top_level_options!(
|
|||
#[rustc_lint_opt_deny_field_access("use `Session::codegen_units` instead of this field")]
|
||||
cli_forced_codegen_units: Option<usize> [UNTRACKED],
|
||||
#[rustc_lint_opt_deny_field_access("use `Session::lto` instead of this field")]
|
||||
cli_forced_thinlto_off: bool [UNTRACKED],
|
||||
cli_forced_local_thinlto_off: bool [UNTRACKED],
|
||||
|
||||
/// Remap source path prefixes in all output (messages, object files, debug, etc.).
|
||||
remap_path_prefix: Vec<(PathBuf, PathBuf)> [TRACKED_NO_CRATE_HASH],
|
||||
|
|
|
@ -991,11 +991,8 @@ impl Session {
|
|||
return config::Lto::Fat;
|
||||
}
|
||||
config::LtoCli::Thin => {
|
||||
return if self.opts.cli_forced_thinlto_off {
|
||||
config::Lto::Fat
|
||||
} else {
|
||||
config::Lto::Thin
|
||||
};
|
||||
// The user explicitly asked for ThinLTO
|
||||
return config::Lto::Thin;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1007,7 +1004,7 @@ impl Session {
|
|||
|
||||
// If processing command line options determined that we're incompatible
|
||||
// with ThinLTO (e.g., `-C lto --emit llvm-ir`) then return that option.
|
||||
if self.opts.cli_forced_thinlto_off {
|
||||
if self.opts.cli_forced_local_thinlto_off {
|
||||
return config::Lto::No;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue