-
Notifications
You must be signed in to change notification settings - Fork 12.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mark some target features as 'forbidden' so they cannot be (un)set with -Ctarget-feature #129884
base: master
Are you sure you want to change the base?
Conversation
rustbot has assigned @petrochenkov. Use |
f8424ee
to
191ef36
Compare
This comment has been minimized.
This comment has been minimized.
Some changes occurred in compiler/rustc_codegen_gcc |
This comment has been minimized.
This comment has been minimized.
df74d6b
to
a340e78
Compare
Some changes occurred in tests/ui/check-cfg cc @Urgau |
bbf47ab
to
319aafa
Compare
This comment was marked as outdated.
This comment was marked as outdated.
@@ -328,6 +355,7 @@ const X86_ALLOWED_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[ | |||
("sha512", Unstable(sym::sha512_sm_x86), &["avx2"]), | |||
("sm3", Unstable(sym::sha512_sm_x86), &["avx"]), | |||
("sm4", Unstable(sym::sha512_sm_x86), &["avx2"]), | |||
("soft-float", Forbidden, &[]), // changes float ABI |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ARM targets also have a soft-float
target feature. Aarch64 does not, though -- so we can't just add this for all targets, unfortunately.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Aarch64 has abi: "softfloat"
:
abi: "softfloat".into(), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That seems like it cannot be changed with -Ctarget-feature
, which is good news.
This comment was marked as resolved.
This comment was marked as resolved.
0ae9f0e
to
b67a656
Compare
How does this affect kernel / bare metal builds on x86 where you don't enable any floating point support whatsoever? I know the Linux kernel uses that. I'm not sure what the status for Redox, etc is. |
We have a |
b67a656
to
3e44287
Compare
The kernel currently has a script generating a target spec for x86: https://github.com/Rust-for-Linux/linux/blob/rust-next/scripts/generate_rust_target.rs Arm64, riscv and loongarch use builtin bare-metal targets though. |
Yeah anyone using custom targets can still set these target features in the target spec. I assume it is generally understood that code using different custom target specs cannot be linked together, so the same concerns do not apply there. |
This comment has been minimized.
This comment has been minimized.
In fact rustc already checks that the content of the target spec file matches for custom target specs ever since #98225. |
AFAICT, on x86(-64), |
3e44287
to
098469e
Compare
The problematic case is We could make it "forbidden to disable but not forbidden to enable", but if you're saying that enabling it is useless anyway then I suggest we go with "forbidden" now. :) |
/// This feature can not be set via `-Ctarget-feature` or `#[target_feature]`, it can only be set in the basic | ||
/// target definition. Used in particular for features that change the floating-point ABI. | ||
Forbidden, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's written that those target features cannot be set (-Ctarget-feature
or #[target_feature]
), but can they be conditional used (in #[cfg]
) ?
In llvm_util.rs
code has been added to not print them with --print target-features
, yet the check-cfg tests output now show that soft-float
, fpregs
and x87
as possible values for #[cfg(target_feature = "...")]
, which seems inconsistent.
If they are not supposed to be "used", the same filtering should be applied here.
rust/compiler/rustc_session/src/config/cfg.rs
Lines 373 to 376 in a460185
rustc_target::target_features::all_known_features() | |
.map(|(f, _sb)| f) | |
.chain(rustc_target::target_features::RUSTC_SPECIFIC_FEATURES.iter().cloned()) | |
.map(Symbol::intern), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's written that those target features cannot be set (-Ctarget-feature or #[target_feature]), but can they be conditional used (in #[cfg]) ?
That's a good question. The soft-float
feature actually does differ between soft-float and hard-float targets, so I guess it makes sense to have it available in cfg
?
I guess the question is whether --print target-features
should print what can be set with -Ctarget-feature
, or print what can be queried with cfg
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Being able to cfg on various features seems essential, to be able to conditionally use different algorithms (e.g. fixed point vs float) or even to determine if certain compiler intrinsics should be provided to implement soft float or if they are unneeded (especially on embedded).
(I have no opinion on the output of print, if it is made for human consumption rather than machine readable you could perhaps add a (read only, determined by target tuple)
after the entry?)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure that soft-float
should be exposed as #[cfg(target_feature = "soft-float")]
: it's the inverse of a normal target feature in that enabling it disables functionality (maybe Rust should have a hard-float
target feature that's the inverse of the soft-float
LLVM feature?).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm also fine with not exposing them in cfg
for now. That's the more conservative choice as it preserves the status quo.
Some changes occurred in cfg and check-cfg configuration cc @Urgau |
e4ead87
to
39c5410
Compare
Blocked on rust-lang/compiler-team#780. |
☔ The latest upstream changes (presumably #117465) made this pull request unmergeable. Please resolve the merge conflicts. |
39c5410
to
6da7b4c
Compare
62e2638
to
0a1bba2
Compare
This comment has been minimized.
This comment has been minimized.
.emit(); | ||
} | ||
Stability::Forbidden { reason } => { | ||
tcx.dcx().emit_err(errors::ForbiddenTargetFeature { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This code here is only used for #[target_features]
(the attribute, not the -C
flag), where unknown features are a hard error. Thus forbidden features should also be immediately a hard error here, this is not a breaking change.
…w a reason why it is forbidden
0a1bba2
to
691bcaa
Compare
☔ The latest upstream changes (presumably #130473) made this pull request unmergeable. Please resolve the merge conflicts. |
The context for this is #116344: some target features change the way floats are passed between functions. Changing those target features is unsound as code compiled for the same target may now use different ABIs.
So this introduces a new concept of "forbidden" target features (on top of the existing "stable " and "unstable" categories), and makes it a hard error to (un)set such a target feature. For now, the x86 features
soft-float
andx87
are on that list. We'll have to make some effort to collect similar features from other targets, but that can happen after the basic infrastructure for this landed.I've made this a warning for now to give people some time to speak up if this would break something.
MCP: rust-lang/compiler-team#780