Skip to content

Commit 0daa636

Browse files
authored
Rollup merge of rust-lang#129897 - RalfJung:soft-float-ignored, r=Urgau
deprecate -Csoft-float because it is unsound (and not fixable) See rust-lang#129893 for details. The general sentiment there seems to be that this flag has no use and sound alternatives exist, so let's add this warning and see if anyone out there disagrees. Also show a different warning on targets where it does nothing (as documented since rust-lang#36261): it seems to correspond to `-mfloat-abi` in GCC/clang, which is an ARM-specific option. To be really sure it does nothing, only forward the flag to LLVM for eabihf targets. This should not change behavior but makes me sleep better ;)
2 parents 8c2c9a9 + 914d8f4 commit 0daa636

File tree

5 files changed

+42
-2
lines changed

5 files changed

+42
-2
lines changed

compiler/rustc_codegen_llvm/src/back/write.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,13 @@ pub(crate) fn target_machine_factory(
185185
let reloc_model = to_llvm_relocation_model(sess.relocation_model());
186186

187187
let (opt_level, _) = to_llvm_opt_settings(optlvl);
188-
let use_softfp = sess.opts.cg.soft_float;
188+
let use_softfp = if sess.target.arch == "arm" && sess.target.abi == "eabihf" {
189+
sess.opts.cg.soft_float
190+
} else {
191+
// `validate_commandline_args_with_session_available` has already warned about this being ignored.
192+
// Let's make sure LLVM doesn't suddenly start using this flag on more targets.
193+
false
194+
};
189195

190196
let ffunction_sections =
191197
sess.opts.unstable_opts.function_sections.unwrap_or(sess.target.function_sections);

compiler/rustc_session/messages.ftl

+10
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,16 @@ session_sanitizer_not_supported = {$us} sanitizer is not supported for this targ
107107
session_sanitizers_not_supported = {$us} sanitizers are not supported for this target
108108
109109
session_skipping_const_checks = skipping const checks
110+
111+
session_soft_float_deprecated =
112+
`-Csoft-float` is unsound and deprecated; use a corresponding *eabi target instead
113+
.note = it will be removed or ignored in a future version of Rust
114+
session_soft_float_deprecated_issue = see issue #129893 <https://github.com/rust-lang/rust/issues/129893> for more information
115+
116+
session_soft_float_ignored =
117+
`-Csoft-float` is ignored on this target; it only has an effect on *eabihf targets
118+
.note = this may become a hard error in a future version of Rust
119+
110120
session_split_debuginfo_unstable_platform = `-Csplit-debuginfo={$debuginfo}` is unstable on this platform
111121
112122
session_split_lto_unit_requires_lto = `-Zsplit-lto-unit` requires `-Clto`, `-Clto=thin`, or `-Clinker-plugin-lto`

compiler/rustc_session/src/errors.rs

+11
Original file line numberDiff line numberDiff line change
@@ -490,3 +490,14 @@ pub(crate) struct FunctionReturnThunkExternRequiresNonLargeCodeModel;
490490
pub(crate) struct FailedToCreateProfiler {
491491
pub(crate) err: String,
492492
}
493+
494+
#[derive(Diagnostic)]
495+
#[diag(session_soft_float_ignored)]
496+
#[note]
497+
pub(crate) struct SoftFloatIgnored;
498+
499+
#[derive(Diagnostic)]
500+
#[diag(session_soft_float_deprecated)]
501+
#[note]
502+
#[note(session_soft_float_deprecated_issue)]
503+
pub(crate) struct SoftFloatDeprecated;

compiler/rustc_session/src/options.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,7 @@ options! {
15151515
// - src/doc/rustc/src/codegen-options/index.md
15161516

15171517
// tidy-alphabetical-start
1518+
#[rustc_lint_opt_deny_field_access("documented to do nothing")]
15181519
ar: String = (String::new(), parse_string, [UNTRACKED],
15191520
"this option is deprecated and does nothing"),
15201521
#[rustc_lint_opt_deny_field_access("use `Session::code_model` instead of this field")]
@@ -1547,6 +1548,7 @@ options! {
15471548
"force use of unwind tables"),
15481549
incremental: Option<String> = (None, parse_opt_string, [UNTRACKED],
15491550
"enable incremental compilation"),
1551+
#[rustc_lint_opt_deny_field_access("documented to do nothing")]
15501552
inline_threshold: Option<u32> = (None, parse_opt_number, [TRACKED],
15511553
"this option is deprecated and does nothing \
15521554
(consider using `-Cllvm-args=--inline-threshold=...`)"),
@@ -1583,6 +1585,7 @@ options! {
15831585
"give an empty list of passes to the pass manager"),
15841586
no_redzone: Option<bool> = (None, parse_opt_bool, [TRACKED],
15851587
"disable the use of the redzone"),
1588+
#[rustc_lint_opt_deny_field_access("documented to do nothing")]
15861589
no_stack_check: bool = (false, parse_no_flag, [UNTRACKED],
15871590
"this option is deprecated and does nothing"),
15881591
no_vectorize_loops: bool = (false, parse_no_flag, [TRACKED],
@@ -1619,7 +1622,7 @@ options! {
16191622
save_temps: bool = (false, parse_bool, [UNTRACKED],
16201623
"save all temporary output files during compilation (default: no)"),
16211624
soft_float: bool = (false, parse_bool, [TRACKED],
1622-
"use soft float ABI (*eabihf targets only) (default: no)"),
1625+
"deprecated option: use soft float ABI (*eabihf targets only) (default: no)"),
16231626
#[rustc_lint_opt_deny_field_access("use `Session::split_debuginfo` instead of this field")]
16241627
split_debuginfo: Option<SplitDebuginfo> = (None, parse_split_debuginfo, [TRACKED],
16251628
"how to handle split-debuginfo, a platform-specific option"),

compiler/rustc_session/src/session.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,16 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
13481348
}
13491349
}
13501350
}
1351+
1352+
if sess.opts.cg.soft_float {
1353+
if sess.target.arch == "arm" && sess.target.abi == "eabihf" {
1354+
sess.dcx().emit_warn(errors::SoftFloatDeprecated);
1355+
} else {
1356+
// All `use_softfp` does is the equivalent of `-mfloat-abi` in GCC/clang, which only exists on ARM targets.
1357+
// We document this flag to only affect `*eabihf` targets, so let's show a warning for all other targets.
1358+
sess.dcx().emit_warn(errors::SoftFloatIgnored);
1359+
}
1360+
}
13511361
}
13521362

13531363
/// Holds data on the current incremental compilation session, if there is one.

0 commit comments

Comments
 (0)