From 98a8b2b14b92afb34422be3b3cb66404f3c01cf4 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 18 Nov 2025 09:03:16 +1100 Subject: [PATCH 1/2] Use `&'static str` instead of `String` for target features. It's a more precise type -- these are static values. Also it avoids unnecessary allocations. --- crates/nvvm/src/lib.rs | 68 ++++++++++++++-------------- crates/rustc_codegen_nvvm/src/lib.rs | 6 ++- 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/crates/nvvm/src/lib.rs b/crates/nvvm/src/lib.rs index 0ff7a017..bb771f19 100644 --- a/crates/nvvm/src/lib.rs +++ b/crates/nvvm/src/lib.rs @@ -396,40 +396,40 @@ impl NvvmArch { } /// Get the target feature string (e.g., "compute_35" for Compute35, "compute_90a" for Compute90a) - pub fn target_feature(&self) -> String { + pub fn target_feature(&self) -> &'static str { match self { - Self::Compute35 => "compute_35".to_string(), - Self::Compute37 => "compute_37".to_string(), - Self::Compute50 => "compute_50".to_string(), - Self::Compute52 => "compute_52".to_string(), - Self::Compute53 => "compute_53".to_string(), - Self::Compute60 => "compute_60".to_string(), - Self::Compute61 => "compute_61".to_string(), - Self::Compute62 => "compute_62".to_string(), - Self::Compute70 => "compute_70".to_string(), - Self::Compute72 => "compute_72".to_string(), - Self::Compute75 => "compute_75".to_string(), - Self::Compute80 => "compute_80".to_string(), - Self::Compute86 => "compute_86".to_string(), - Self::Compute87 => "compute_87".to_string(), - Self::Compute89 => "compute_89".to_string(), - Self::Compute90 => "compute_90".to_string(), - Self::Compute90a => "compute_90a".to_string(), - Self::Compute100 => "compute_100".to_string(), - Self::Compute100f => "compute_100f".to_string(), - Self::Compute100a => "compute_100a".to_string(), - Self::Compute101 => "compute_101".to_string(), - Self::Compute101f => "compute_101f".to_string(), - Self::Compute101a => "compute_101a".to_string(), - Self::Compute103 => "compute_103".to_string(), - Self::Compute103f => "compute_103f".to_string(), - Self::Compute103a => "compute_103a".to_string(), - Self::Compute120 => "compute_120".to_string(), - Self::Compute120f => "compute_120f".to_string(), - Self::Compute120a => "compute_120a".to_string(), - Self::Compute121 => "compute_121".to_string(), - Self::Compute121f => "compute_121f".to_string(), - Self::Compute121a => "compute_121a".to_string(), + Self::Compute35 => "compute_35", + Self::Compute37 => "compute_37", + Self::Compute50 => "compute_50", + Self::Compute52 => "compute_52", + Self::Compute53 => "compute_53", + Self::Compute60 => "compute_60", + Self::Compute61 => "compute_61", + Self::Compute62 => "compute_62", + Self::Compute70 => "compute_70", + Self::Compute72 => "compute_72", + Self::Compute75 => "compute_75", + Self::Compute80 => "compute_80", + Self::Compute86 => "compute_86", + Self::Compute87 => "compute_87", + Self::Compute89 => "compute_89", + Self::Compute90 => "compute_90", + Self::Compute90a => "compute_90a", + Self::Compute100 => "compute_100", + Self::Compute100f => "compute_100f", + Self::Compute100a => "compute_100a", + Self::Compute101 => "compute_101", + Self::Compute101f => "compute_101f", + Self::Compute101a => "compute_101a", + Self::Compute103 => "compute_103", + Self::Compute103f => "compute_103f", + Self::Compute103a => "compute_103a", + Self::Compute120 => "compute_120", + Self::Compute120f => "compute_120f", + Self::Compute120a => "compute_120a", + Self::Compute121 => "compute_121", + Self::Compute121f => "compute_121f", + Self::Compute121a => "compute_121a", } } @@ -451,7 +451,7 @@ impl NvvmArch { /// /// For more details on family and architecture-specific features, see: /// - pub fn all_target_features(&self) -> Vec { + pub fn all_target_features(&self) -> Vec<&'static str> { // All lower-or-equal baseline features are included. let included_baseline = |arch: &NvvmArch| { arch.is_base_variant() && arch.capability_value() <= self.capability_value() diff --git a/crates/rustc_codegen_nvvm/src/lib.rs b/crates/rustc_codegen_nvvm/src/lib.rs index dc2665d7..5d13b21b 100644 --- a/crates/rustc_codegen_nvvm/src/lib.rs +++ b/crates/rustc_codegen_nvvm/src/lib.rs @@ -146,7 +146,11 @@ impl CodegenBackend for NvvmCodegenBackend { for opt in &args.nvvm_options { if let ::nvvm::NvvmOption::Arch(arch) = opt { // Add all features up to and including the current architecture - features.extend(arch.all_target_features()); + features.extend( + arch.all_target_features() + .into_iter() + .map(|s| s.to_string()), + ); break; } } From 9d922146876c486d5e5e92603acb092ad522b067 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 18 Nov 2025 09:09:11 +1100 Subject: [PATCH 2/2] Simplify `NvvmArch::fmt`. --- crates/nvvm/src/lib.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/crates/nvvm/src/lib.rs b/crates/nvvm/src/lib.rs index bb771f19..043cba83 100644 --- a/crates/nvvm/src/lib.rs +++ b/crates/nvvm/src/lib.rs @@ -328,15 +328,7 @@ pub enum NvvmArch { impl Display for NvvmArch { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let raw = format!("{self:?}").to_ascii_lowercase(); - // Handle architectures with suffixes (e.g., Compute90a -> compute_90a) - if let Some(pos) = raw.find(|c: char| c.is_ascii_digit()) { - let (prefix, rest) = raw.split_at(pos); - write!(f, "{prefix}_{rest}") - } else { - // Fallback for unexpected format - f.write_str(&raw) - } + f.write_str(self.target_feature()) } }