-
Notifications
You must be signed in to change notification settings - Fork 13.4k
reject unsound toggling of RISCV target features #134337
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
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -590,9 +590,72 @@ const RISCV_FEATURES: &[(&str, StabilityUncomputed, ImpliedFeatures)] = &[ | |||||
// tidy-alphabetical-start | ||||||
("a", STABLE, &["zaamo", "zalrsc"]), | ||||||
("c", STABLE, &[]), | ||||||
("d", unstable(sym::riscv_target_feature), &["f"]), | ||||||
("e", unstable(sym::riscv_target_feature), &[]), | ||||||
("f", unstable(sym::riscv_target_feature), &[]), | ||||||
( | ||||||
"d", | ||||||
Stability::Unstable { | ||||||
nightly_feature: sym::riscv_target_feature, | ||||||
allow_toggle: |target, enable| match &*target.llvm_abiname { | ||||||
"ilp32d" | "lp64d" if !enable => { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Btw do you know why the 32bit ABIs start with "ilp" but the 64bit ABIs start with "lp"? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
(see also "Data models" section in https://en.cppreference.com/w/cpp/language/types) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So it should really be I32LP64 then... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, but a convention at some point developed that
names deeply fermented in tradition. |
||||||
// The ABI requires the `d` feature, so it cannot be disabled. | ||||||
Err("feature is required by ABI") | ||||||
} | ||||||
"ilp32e" if enable => { | ||||||
// The `d` feature apparently is incompatible with this ABI. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am confused: Rust lets you always define types that need >32bit alignment, so that can't be a problem in itself? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You are correct AFAIK that this isn't actually a problem, however the RISC-V ELF psABI for the ILP32E ABI states:
Correspondingly, LLVM emits an error when there is an attempt to use the D extension with the ILP32E ABI:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ack, I didn't mean to confuse. yeah, it's about the actual CPU-internal alignment requirements imposed by the way the hardware moves things around, as opposed to our language requirements. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. oh actually it's kinda weirder, sorry, here we go: There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Okay, makes sense. |
||||||
Err("feature is incompatible with ABI") | ||||||
} | ||||||
_ => Ok(()), | ||||||
}, | ||||||
}, | ||||||
&["f"], | ||||||
), | ||||||
( | ||||||
"e", | ||||||
Stability::Unstable { | ||||||
// Given that this is a negative feature, consider this before stabilizing: | ||||||
// does it really make sense to enable this feature in an individual | ||||||
// function with `#[target_feature]`? | ||||||
nightly_feature: sym::riscv_target_feature, | ||||||
Comment on lines
+615
to
+618
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. not really, but it does allow There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sounds like we may want to mark this feature as "forbidden", i.e., "must be fixed by target spec and cannot be queried by But anyway it's a nightly-only feature so that can be done in a future PR. |
||||||
allow_toggle: |target, enable| { | ||||||
match &*target.llvm_abiname { | ||||||
_ if !enable => { | ||||||
// This is a negative feature, *disabling* it is always okay. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. reason for explicit reasoning: "negative features" have a weird tendency to become "not" at some point (although there's reservations which suggest that shouldn't happen in this case), so having a clear justification for why is preferable in case we have to revisit it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Unfortunately now the comment has so much jargon that I don't understand it... |
||||||
Ok(()) | ||||||
} | ||||||
"ilp32e" | "lp64e" => { | ||||||
// Embedded ABIs should already have the feature anyway, it's fine to enable | ||||||
// it again from an ABI perspective. | ||||||
Ok(()) | ||||||
} | ||||||
_ => { | ||||||
// *Not* an embedded ABI. Enabling `e` is invalid. | ||||||
Err("feature is incompatible with ABI") | ||||||
} | ||||||
} | ||||||
}, | ||||||
}, | ||||||
&[], | ||||||
), | ||||||
( | ||||||
"f", | ||||||
Stability::Unstable { | ||||||
nightly_feature: sym::riscv_target_feature, | ||||||
allow_toggle: |target, enable| { | ||||||
match &*target.llvm_abiname { | ||||||
"ilp32f" | "ilp32d" | "lp64f" | "lp64d" if !enable => { | ||||||
// The ABI requires the `f` feature, so it cannot be disabled. | ||||||
Err("feature is required by ABI") | ||||||
} | ||||||
_ => Ok(()), | ||||||
} | ||||||
}, | ||||||
}, | ||||||
&[], | ||||||
), | ||||||
( | ||||||
"forced-atomics", | ||||||
Stability::Forbidden { reason: "unsound because it changes the ABI of atomic operations" }, | ||||||
&[], | ||||||
), | ||||||
("m", STABLE, &[]), | ||||||
("relax", unstable(sym::riscv_target_feature), &[]), | ||||||
("unaligned-scalar-mem", unstable(sym::riscv_target_feature), &[]), | ||||||
|
Uh oh!
There was an error while loading. Please reload this page.