Skip to content

Conversation

@tamird
Copy link
Contributor

@tamird tamird commented Nov 5, 2025

Improve type safety by using an enum rather than strings.

I'm not really sure this is better since only a few vendors have special semantics. r? @nnethercote

@rustbot
Copy link
Collaborator

rustbot commented Nov 5, 2025

Some changes occurred in compiler/rustc_codegen_cranelift

cc @bjorn3

These commits modify compiler targets.
(See the Target Tier Policy.)

Some changes occurred in compiler/rustc_codegen_ssa

cc @WaffleLapkin

Some changes occurred in cfg and check-cfg configuration

cc @Urgau

The Miri subtree was changed

cc @rust-lang/miri

@rustbot rustbot added O-apple Operating system: Apple (macOS, iOS, tvOS, visionOS, watchOS) S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Nov 5, 2025
@RalfJung
Copy link
Member

RalfJung commented Nov 5, 2025

FWIW for a related change recently we had quite a bit of discussion: rust-lang/compiler-team#926.

@tamird tamird force-pushed the vendor-enum branch 2 times, most recently from e47f7c3 to 013077b Compare November 6, 2025 03:08
@rustbot rustbot added A-attributes Area: Attributes (`#[…]`, `#![…]`) A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. labels Nov 6, 2025
@rustbot

This comment has been minimized.

@tamird tamird changed the title rustc_target: introduce Vendor rustc_target: introduce Vendor, Abi, Env, Os Nov 6, 2025
@tamird tamird changed the title rustc_target: introduce Vendor, Abi, Env, Os rustc_target: introduce Vendor, ABI, Env, OS Nov 6, 2025
@rust-log-analyzer

This comment has been minimized.

Copy link
Contributor

@nnethercote nnethercote left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have a bunch of nits but this generally looks good. Linker is another candidate for enum-ification, if you aren't yet bored of this stuff :)

View changes since this review

Unikraft = "unikraft",
Uwp = "uwp",
Vex = "vex",
Win7 = "win7",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any idea what "win7" is? Makes me think of Windows 7, which is a weird name for a vendor.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dates back to #118150 which explains:

I went with naming the target x86_64-win7-windows-msvc, inserting the win7 in the vendor field (usually set to to pc). This is done to avoid ecosystem churn, as quite a few crates have cfg(target_os = "windows") or cfg(target_env = "msvc"), but nearly no cfg(target_vendor = "pc"). Since my goal is to be able to seamlessly swap to the win7 target, I figured it'd be easier this way.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ugh, ok. Thanks for the info!

@rustbot rustbot added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels Nov 7, 2025
@nnethercote
Copy link
Contributor

FWIW for a related change recently we had quite a bit of discussion: rust-lang/compiler-team#926.

IMO these changes are so similar to the change in that MCP that additional discussion isn't needed.

Copy link
Contributor Author

@tamird tamird left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed all but one comment and left things unsquashed to (somewhat) ease review. I do plan to squash once you're happy with it.

View changes since this review

Unikraft = "unikraft",
Uwp = "uwp",
Vex = "vex",
Win7 = "win7",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dates back to #118150 which explains:

I went with naming the target x86_64-win7-windows-msvc, inserting the win7 in the vendor field (usually set to to pc). This is done to avoid ecosystem churn, as quite a few crates have cfg(target_os = "windows") or cfg(target_env = "msvc"), but nearly no cfg(target_vendor = "pc"). Since my goal is to be able to seamlessly swap to the win7 target, I figured it'd be easier this way.

@tamird tamird changed the title rustc_target: introduce Vendor, ABI, Env, OS rustc_target: introduce Vendor, Abi, Env, Os Nov 7, 2025
@nnethercote
Copy link
Contributor

r=me with the commits squashed, thanks!

@bors delegate=tamird

@bors
Copy link
Collaborator

bors commented Nov 7, 2025

✌️ @tamird, you can now approve this pull request!

If @nnethercote told you to "r=me" after making some further change, please make that change, then do @bors r=@nnethercote

@rustbot

This comment has been minimized.

@tamird
Copy link
Contributor Author

tamird commented Nov 7, 2025

range-diff is ~empty, which is what I expected!

@bors r=@nnethercote

@bors
Copy link
Collaborator

bors commented Nov 7, 2025

📌 Commit cd47df7 has been approved by nnethercote

It is now in the queue for this repository.

}

crate::target_spec_enum! {
pub enum Vendor {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I'm semi against making target_vendor an enum - it's not like the other ones, in that it's not supposed to carry any meaning (at least not after rust-lang/lang-team#102).

I'd prefer to keep it as just a String.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That sounds nice, but it is just not the case. There are many places where the vendor is consulted, especially to check if it's Apple.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checking for apple should be done through is_like_darwin.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

% git grep -E '[^:] Vendor::' -- ':!compiler/rustc_target/src/spec/targets/' ':!compiler/rustc_target/src/spec/base'
compiler/rustc_codegen_cranelift/src/abi/mod.rs:            (Arch::X86_64, _) | (Arch::AArch64, Vendor::Apple) => match (ty, is_signed) {
compiler/rustc_codegen_cranelift/src/codegen_f16_f128.rs:        if fx.tcx.sess.target.vendor == Vendor::Apple && fx.tcx.sess.target.arch == Arch::X86_64 {
compiler/rustc_codegen_cranelift/src/codegen_f16_f128.rs:        if fx.tcx.sess.target.vendor == Vendor::Apple && fx.tcx.sess.target.arch == Arch::X86_64 {
compiler/rustc_codegen_cranelift/src/codegen_f16_f128.rs:        if fx.tcx.sess.target.vendor == Vendor::Apple && fx.tcx.sess.target.arch == Arch::X86_64 {
compiler/rustc_codegen_ssa/src/back/link.rs:                        && sess.target.vendor != Vendor::Uwp
compiler/rustc_codegen_ssa/src/back/linker.rs:    if matches!(flavor, LinkerFlavor::Msvc(..)) && t.vendor == Vendor::Uwp {
compiler/rustc_codegen_ssa/src/back/linker.rs:    assert!(cmd.get_args().is_empty() || sess.target.vendor == Vendor::Uwp);
compiler/rustc_codegen_ssa/src/common.rs:    target.vendor == Vendor::Pc
compiler/rustc_metadata/src/native_libs.rs:    if sess.target.vendor == Vendor::Fortanix
compiler/rustc_target/src/spec/mod.rs:            self.vendor == Vendor::Apple,
compiler/rustc_target/src/spec/mod.rs:        if let Vendor::Other(s) = &self.vendor {
compiler/rustc_target/src/spec/mod.rs:            || (self.env == Env::Sgx && self.vendor == Vendor::Fortanix)
src/tools/miri/src/machine.rs:                    if target.options.vendor == Vendor::Apple {

It's not just Apple, either.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For UWP it can probably check target.abi instead. is_mingw_gnu_toolchain doesn't need to check the vendor at all. It already checks OS and environment. And IMO we should change x86_64-fortanix-unknown-sgx to x86_64-unknown-fortanix-sgx. Fortanix effectively operates as an OS for SGX enclaves. I believe that covers everything currently checking the vendor field.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These sound like good improvements to me. How would you prevent backsliding?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The vendor field coule be marked with #[rustc_lint_opt_deny_field_access] if you mark the TargetOptions struct with #[rustc_lint_opt_ty].

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

x86_64-fortanix-unknown-sgx is a tier 2 platform. Surely we can't just go and change it? Other than that, I have a branch with this change that I'll PR in a moment.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avoid duplicating this comment in preparation for adding more enums.
Prepare for additional enums like Vendor and Os which have true
`Unknown` variants. We want to use the same name for the escape hatch
for all of these, thus rename this one.
Improve type safety by using an enum rather than strings.
Improve type safety by using an enum rather than strings.
Improve type safety by using an enum rather than strings.
Improve type safety by using an enum rather than strings.
@tamird
Copy link
Contributor Author

tamird commented Nov 9, 2025

@bors r=@nnethercote

@bors
Copy link
Collaborator

bors commented Nov 9, 2025

📌 Commit 6b87b87 has been approved by nnethercote

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. labels Nov 9, 2025
Sony = "sony",
Sun = "sun",
Unikraft = "unikraft",
Unknown = "unknown",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be placed under Other IMO. Matching on Vendor::Unknown never makes sense under any circumstance. It is a catch-all for when there is no known vendor value, which is also what the Other variant is for.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please see prior discussion here

@madsmtm
Copy link
Contributor

madsmtm commented Nov 9, 2025

I'm gonna unmark this as accepted, since I'd like to see the Vendor changes reverted, and that we go with the plan discussed in #148531 (comment) instead (preferably making those changes in a separate PR).
@bors r-

(Do correct me if this is bad form).

We should bump the priority next time it's scheduled for merging, to avoid further merge conflicts.

@bors bors added S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. and removed S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. labels Nov 9, 2025
@nnethercote
Copy link
Contributor

@tamird: looks like you are planning to merge #148760 before this, and then adjust this accordingly? I give you a gold star for flexibility. It's annoying to do a nice refactoring cleanup that follows the contours of the existing code and then be told that the existing code shouldn't exist. ⭐

@tamird
Copy link
Contributor Author

tamird commented Nov 9, 2025

@tamird: looks like you are planning to merge #148760 before this, and then adjust this accordingly? I give you a gold star for flexibility. It's annoying to do a nice refactoring cleanup that follows the contours of the existing code and then be told that the existing code shouldn't exist. ⭐

Annoying is a crucial part of doing OSS :)

@madsmtm
Copy link
Contributor

madsmtm commented Nov 9, 2025

Yeah, I didn't mean anything rude by it, I do appreciate the work you're doing here!

Zalathar added a commit to Zalathar/rust that referenced this pull request Nov 10, 2025
rustc_target: hide TargetOptions::vendor

Discussed in rust-lang#148531 (comment).

r? `@bjorn3`
Zalathar added a commit to Zalathar/rust that referenced this pull request Nov 10, 2025
rustc_target: hide TargetOptions::vendor

Discussed in rust-lang#148531 (comment).

r? ``@bjorn3``
ChrisDenton added a commit to ChrisDenton/rust that referenced this pull request Nov 10, 2025
rustc_target: hide TargetOptions::vendor

Discussed in rust-lang#148531 (comment).

r? ``@bjorn3``
ChrisDenton added a commit to ChrisDenton/rust that referenced this pull request Nov 10, 2025
rustc_target: hide TargetOptions::vendor

Discussed in rust-lang#148531 (comment).

r? ```@bjorn3```
Zalathar added a commit to Zalathar/rust that referenced this pull request Nov 11, 2025
rustc_target: hide TargetOptions::vendor

Discussed in rust-lang#148531 (comment).

r? ````@bjorn3````
Zalathar added a commit to Zalathar/rust that referenced this pull request Nov 11, 2025
rustc_target: hide TargetOptions::vendor

Discussed in rust-lang#148531 (comment).

r? `````@bjorn3`````
rust-timer added a commit that referenced this pull request Nov 11, 2025
Rollup merge of #148760 - tamird:avoid-vendor-logic, r=madsmtm

rustc_target: hide TargetOptions::vendor

Discussed in #148531 (comment).

r? `````@bjorn3`````
@bors
Copy link
Collaborator

bors commented Nov 11, 2025

☔ The latest upstream changes (presumably #148818) made this pull request unmergeable. Please resolve the merge conflicts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-attributes Area: Attributes (`#[…]`, `#![…]`) A-LLVM Area: Code generation parts specific to LLVM. Both correctness bugs and optimization-related issues. O-apple Operating system: Apple (macOS, iOS, tvOS, visionOS, watchOS) S-waiting-on-author Status: This is awaiting some action (such as code changes or more information) from the author. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants