Skip to content

Commit f2c4e12

Browse files
committed
deprecate -Csoft-float because it is unsound (and not fixable)
1 parent 9b82580 commit f2c4e12

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
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

+9
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,15 @@ session_embed_source_insufficient_dwarf_version = `-Zembed-source=y` requires at
1818
1919
session_embed_source_requires_debug_info = `-Zembed-source=y` requires debug information to be enabled
2020
21+
session_soft_float_deprecated =
22+
`-Csoft-float` is unsound and deprecated; use a corresponding *eabi target instead
23+
.note = it will be removed or ignored in a future version of Rust
24+
session_soft_float_deprecated_issue = see issue #129893 <https://github.com/rust-lang/rust/issues/129893> for more information
25+
26+
session_soft_float_ignored =
27+
`-Csoft-float` is ignored on this target; it only has an effect on *eabihf targets
28+
.note = this may become a hard error in a future version of Rust
29+
2130
session_expr_parentheses_needed = parentheses are required to parse this as an expression
2231
2332
session_failed_to_create_profiler = failed to create profiler: {$err}

compiler/rustc_session/src/errors.rs

+11
Original file line numberDiff line numberDiff line change
@@ -484,3 +484,14 @@ pub(crate) struct FunctionReturnThunkExternRequiresNonLargeCodeModel;
484484
pub(crate) struct FailedToCreateProfiler {
485485
pub(crate) err: String,
486486
}
487+
488+
#[derive(Diagnostic)]
489+
#[diag(session_soft_float_ignored)]
490+
#[note]
491+
pub(crate) struct SoftFloatIgnored;
492+
493+
#[derive(Diagnostic)]
494+
#[diag(session_soft_float_deprecated)]
495+
#[note]
496+
#[note(session_soft_float_deprecated_issue)]
497+
pub(crate) struct SoftFloatDeprecated;

compiler/rustc_session/src/session.rs

+10
Original file line numberDiff line numberDiff line change
@@ -1340,6 +1340,16 @@ fn validate_commandline_args_with_session_available(sess: &Session) {
13401340
}
13411341
}
13421342
}
1343+
1344+
if sess.opts.cg.soft_float {
1345+
if sess.target.arch == "arm" && sess.target.abi == "eabihf" {
1346+
sess.dcx().emit_warn(errors::SoftFloatDeprecated);
1347+
} else {
1348+
// All `use_softfp` does is the equivalent of `-mfloat-abi` in GCC/clang, which only exists on ARM targets.
1349+
// We document this flag to only affect `*eabihf` targets, so let's show a warning for all other targets.
1350+
sess.dcx().emit_warn(errors::SoftFloatIgnored);
1351+
}
1352+
}
13431353
}
13441354

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

0 commit comments

Comments
 (0)