feat(hints): support minimum optimization levels - #17368
Conversation
b532a3f to
2b19c48
Compare
There was a problem hiding this comment.
🔢 Self-check (PR reviewed by myself and ready for feedback)
-
Code compiles successfully
-
Unit tests added
-
No AI-generated elegant nonsense in PR.
-
Comments added where necessary
-
PR title and description updated
-
Documentation updated
-
PR size is reasonable
| via `profile`, which takes precedence, and which can only be specified in the | ||
| top-level crate being built. | ||
|
|
||
| ## Package `min-opt-level` hint |
There was a problem hiding this comment.
Can you have a subsection that is written as-if it was the end-user documentation?
There was a problem hiding this comment.
Could you give an example of the kind of end-user documentation you expect? What should it include? I thought the current document already covered the basic usage and examples.
| The hint accepts the numeric optimization levels 0, 1, 2, and 3. Other values | ||
| produce a warning and are ignored. If the selected [profile](profiles.md) has a |
There was a problem hiding this comment.
Why do they produce a warning instead of error?
There was a problem hiding this comment.
If we proceed with errors, does that mean that introducing a new optimization level in the future, which is accepted by the new Cargo, would cause an error with older versions of Cargo? Would this be considered a backward compatibility issue? But I guess introducing a new optimization level might be impossible, especially a numeric optimization level?
| let pkg_hint_min_opt_level = match parse_min_opt_level_hint(hints.min_opt_level.as_ref()) { | ||
| Ok(level) => level, | ||
| Err(MinOptLevelHintError::OutOfRange(level)) => { | ||
| unit_capped_warn(&format!( | ||
| "ignoring unsupported value ({level}) for 'hints.min-opt-level', which only supports integers from 0 to 3" | ||
| ))?; | ||
| None | ||
| } | ||
| Err(MinOptLevelHintError::WrongType(value_type)) => { | ||
| unit_capped_warn(&format!( | ||
| "ignoring unsupported value type ({value_type}) for 'hints.min-opt-level', which expects an integer" | ||
| ))?; | ||
| None | ||
| } | ||
| }; | ||
| if matches!(pkg_hint_min_opt_level, Some(1..=3)) && !bcx.gctx.cli_unstable().hint_min_opt_level | ||
| { | ||
| unit_capped_warn( | ||
| "ignoring 'hints.min-opt-level', pass `-Zhint-min-opt-level` to enable it", | ||
| )?; | ||
| } |
There was a problem hiding this comment.
Why is this check placed here?
There was a problem hiding this comment.
I simply followed the mostly-unused placement and tried to group them together. However, after reconsidering, this may not make sense because this case differs from it: this hint does not directly change the cmd here. The per-compilation-unit check also does not apply to the min-opt-level hint. I will try to find the right place to perform this check.
| let mut profile = maker.get_profile( | ||
| Some(pkg_id), | ||
| is_member, | ||
| unit_for.is_for_host(), | ||
| min_opt_level, | ||
| ); |
There was a problem hiding this comment.
Why do we pass it into get_profile, rather than overriding it here?
There was a problem hiding this comment.
Because the hint takes precedence within ProfileMaker::get_profile, applying it afterward would override explicit settings such as:
[profile.dev.package.foo]
opt-level = 0
This comment has been minimized.
This comment has been minimized.
14ab0ce to
415812c
Compare
This comment has been minimized.
This comment has been minimized.
415812c to
aaf6533
Compare
18f313e to
ff1b273
Compare
This comment has been minimized.
This comment has been minimized.
Record the current ignored-hint behavior across the RFC precedence, scope, validation, and boundary cases. Signed-off-by: 0xPoe <poe.liu@pm.me>
RFC 3924 lets a package request a numeric optimization floor without overriding an application's profile choices. Apply the hint after profile and built-in host defaults but before explicit package and build overrides, while leaving the unordered size levels unchanged. Signed-off-by: 0xPoe <poe.liu@pm.me>
Document the unstable gate, accepted range, profile precedence, non-recursive scope, and the narrow cases where packages should request optimization. Include an explicit debugging override so top-level users retain control. Signed-off-by: 0xPoe <poe.liu@pm.me>
ff1b273 to
b9ea4de
Compare
|
This PR was rebased onto a different master commit. Here's a range-diff highlighting what actually changed. Rebasing is a normal part of keeping PRs up to date, so no action is needed—this note is just to help reviewers. |
View all comments
What does this PR try to resolve?
ref #17334
This PR would allow Rust library to provide a simple hint about the minimum opt-level to build them with via the
hint.min-opt-levelsetting in the manifest.How to test and review this PR?
Check the unit tests and review it commit by commit.
r?@ghost