Mention Register Size in #[warn(asm_sub_register)]

Fixes #121593
This commit is contained in:
Veera 2024-03-03 09:34:26 -05:00
parent d561a84d48
commit 9aac0c9ae3
19 changed files with 100 additions and 92 deletions

View File

@ -6,7 +6,9 @@
use rustc_span::def_id::LocalDefId; use rustc_span::def_id::LocalDefId;
use rustc_span::Symbol; use rustc_span::Symbol;
use rustc_target::abi::FieldIdx; use rustc_target::abi::FieldIdx;
use rustc_target::asm::{InlineAsmReg, InlineAsmRegClass, InlineAsmRegOrRegClass, InlineAsmType}; use rustc_target::asm::{
InlineAsmReg, InlineAsmRegClass, InlineAsmRegOrRegClass, InlineAsmType, ModifierInfo,
};
pub struct InlineAsmCtxt<'a, 'tcx> { pub struct InlineAsmCtxt<'a, 'tcx> {
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
@ -253,8 +255,11 @@ fn check_asm_operand_type(
} }
// Check whether a modifier is suggested for using this type. // Check whether a modifier is suggested for using this type.
if let Some((suggested_modifier, suggested_result)) = if let Some(ModifierInfo {
reg_class.suggest_modifier(asm_arch, asm_ty) modifier: suggested_modifier,
result: suggested_result,
size: suggested_size,
}) = reg_class.suggest_modifier(asm_arch, asm_ty)
{ {
// Search for any use of this operand without a modifier and emit // Search for any use of this operand without a modifier and emit
// the suggestion for them. // the suggestion for them.
@ -268,8 +273,11 @@ fn check_asm_operand_type(
} }
} }
if !spans.is_empty() { if !spans.is_empty() {
let (default_modifier, default_result) = let ModifierInfo {
reg_class.default_modifier(asm_arch).unwrap(); modifier: default_modifier,
result: default_result,
size: default_size,
} = reg_class.default_modifier(asm_arch).unwrap();
self.tcx.node_span_lint( self.tcx.node_span_lint(
lint::builtin::ASM_SUB_REGISTER, lint::builtin::ASM_SUB_REGISTER,
expr.hir_id, expr.hir_id,
@ -278,10 +286,10 @@ fn check_asm_operand_type(
|lint| { |lint| {
lint.span_label(expr.span, "for this argument"); lint.span_label(expr.span, "for this argument");
lint.help(format!( lint.help(format!(
"use `{{{idx}:{suggested_modifier}}}` to have the register formatted as `{suggested_result}`", "use `{{{idx}:{suggested_modifier}}}` to have the register formatted as `{suggested_result}` (for {suggested_size}-bit values)",
)); ));
lint.help(format!( lint.help(format!(
"or use `{{{idx}:{default_modifier}}}` to keep the default formatting of `{default_result}`", "or use `{{{idx}:{default_modifier}}}` to keep the default formatting of `{default_result}` (for {default_size}-bit values)",
)); ));
}, },
); );

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use crate::spec::{RelocModel, Target}; use crate::spec::{RelocModel, Target};
use rustc_data_structures::fx::FxIndexSet; use rustc_data_structures::fx::FxIndexSet;
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
@ -27,32 +27,28 @@ pub fn suggest_class(self, _arch: InlineAsmArch, _ty: InlineAsmType) -> Option<S
None None
} }
pub fn suggest_modifier( pub fn suggest_modifier(self, _arch: InlineAsmArch, ty: InlineAsmType) -> Option<ModifierInfo> {
self,
_arch: InlineAsmArch,
ty: InlineAsmType,
) -> Option<(char, &'static str)> {
match self { match self {
Self::reg => match ty.size().bits() { Self::reg => match ty.size().bits() {
64 => None, 64 => None,
_ => Some(('w', "w0")), _ => Some(('w', "w0", 32).into()),
}, },
Self::vreg | Self::vreg_low16 => match ty.size().bits() { Self::vreg | Self::vreg_low16 => match ty.size().bits() {
8 => Some(('b', "b0")), 8 => Some(('b', "b0", 8).into()),
16 => Some(('h', "h0")), 16 => Some(('h', "h0", 16).into()),
32 => Some(('s', "s0")), 32 => Some(('s', "s0", 32).into()),
64 => Some(('d', "d0")), 64 => Some(('d', "d0", 64).into()),
128 => Some(('q', "q0")), 128 => Some(('q', "q0", 128).into()),
_ => None, _ => None,
}, },
Self::preg => None, Self::preg => None,
} }
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
match self { match self {
Self::reg => Some(('x', "x0")), Self::reg => Some(('x', "x0", 64).into()),
Self::vreg | Self::vreg_low16 => Some(('v', "v0")), Self::vreg | Self::vreg_low16 => Some(('v', "v0", 128).into()),
Self::preg => None, Self::preg => None,
} }
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use crate::spec::{RelocModel, Target}; use crate::spec::{RelocModel, Target};
use rustc_data_structures::fx::FxIndexSet; use rustc_data_structures::fx::FxIndexSet;
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
@ -35,11 +35,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -29,11 +29,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -23,11 +23,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -23,11 +23,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -22,11 +22,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -23,11 +23,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -24,11 +24,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -23,11 +23,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -6,6 +6,18 @@
use std::fmt; use std::fmt;
use std::str::FromStr; use std::str::FromStr;
pub struct ModifierInfo {
pub modifier: char,
pub result: &'static str,
pub size: u64,
}
impl From<(char, &'static str, u64)> for ModifierInfo {
fn from(value: (char, &'static str, u64)) -> Self {
Self { modifier: value.0, result: value.1, size: value.2 }
}
}
macro_rules! def_reg_class { macro_rules! def_reg_class {
($arch:ident $arch_regclass:ident { ($arch:ident $arch_regclass:ident {
$( $(
@ -512,11 +524,7 @@ pub fn suggest_class(self, arch: InlineAsmArch, ty: InlineAsmType) -> Option<Sel
/// Such suggestions are useful if a type smaller than the full register /// Such suggestions are useful if a type smaller than the full register
/// size is used and a modifier can be used to point to the subregister of /// size is used and a modifier can be used to point to the subregister of
/// the correct size. /// the correct size.
pub fn suggest_modifier( pub fn suggest_modifier(self, arch: InlineAsmArch, ty: InlineAsmType) -> Option<ModifierInfo> {
self,
arch: InlineAsmArch,
ty: InlineAsmType,
) -> Option<(char, &'static str)> {
match self { match self {
Self::X86(r) => r.suggest_modifier(arch, ty), Self::X86(r) => r.suggest_modifier(arch, ty),
Self::Arm(r) => r.suggest_modifier(arch, ty), Self::Arm(r) => r.suggest_modifier(arch, ty),
@ -545,7 +553,7 @@ pub fn suggest_modifier(
/// This is only needed when the register class can suggest a modifier, so /// This is only needed when the register class can suggest a modifier, so
/// that the user can be shown how to get the default behavior without a /// that the user can be shown how to get the default behavior without a
/// warning. /// warning.
pub fn default_modifier(self, arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, arch: InlineAsmArch) -> Option<ModifierInfo> {
match self { match self {
Self::X86(r) => r.default_modifier(arch), Self::X86(r) => r.default_modifier(arch),
Self::Arm(r) => r.default_modifier(arch), Self::Arm(r) => r.default_modifier(arch),

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -22,11 +22,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
@ -23,11 +23,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -26,11 +26,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use crate::spec::{RelocModel, Target}; use crate::spec::{RelocModel, Target};
use rustc_data_structures::fx::FxIndexSet; use rustc_data_structures::fx::FxIndexSet;
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
@ -26,11 +26,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
use std::fmt; use std::fmt;
@ -24,11 +24,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
@ -21,11 +21,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
use rustc_span::Symbol; use rustc_span::Symbol;
@ -21,11 +21,11 @@ pub fn suggest_modifier(
self, self,
_arch: InlineAsmArch, _arch: InlineAsmArch,
_ty: InlineAsmType, _ty: InlineAsmType,
) -> Option<(char, &'static str)> { ) -> Option<ModifierInfo> {
None None
} }
pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, _arch: InlineAsmArch) -> Option<ModifierInfo> {
None None
} }

View File

@ -1,4 +1,4 @@
use super::{InlineAsmArch, InlineAsmType}; use super::{InlineAsmArch, InlineAsmType, ModifierInfo};
use crate::spec::{RelocModel, Target}; use crate::spec::{RelocModel, Target};
use rustc_data_structures::fx::FxIndexSet; use rustc_data_structures::fx::FxIndexSet;
use rustc_macros::HashStable_Generic; use rustc_macros::HashStable_Generic;
@ -53,32 +53,28 @@ pub fn suggest_class(self, _arch: InlineAsmArch, ty: InlineAsmType) -> Option<Se
} }
} }
pub fn suggest_modifier( pub fn suggest_modifier(self, arch: InlineAsmArch, ty: InlineAsmType) -> Option<ModifierInfo> {
self,
arch: InlineAsmArch,
ty: InlineAsmType,
) -> Option<(char, &'static str)> {
match self { match self {
Self::reg => match ty.size().bits() { Self::reg => match ty.size().bits() {
16 => Some(('x', "ax")), 16 => Some(('x', "ax", 16).into()),
32 if arch == InlineAsmArch::X86_64 => Some(('e', "eax")), 32 if arch == InlineAsmArch::X86_64 => Some(('e', "eax", 32).into()),
_ => None, _ => None,
}, },
Self::reg_abcd => match ty.size().bits() { Self::reg_abcd => match ty.size().bits() {
16 => Some(('x', "ax")), 16 => Some(('x', "ax", 16).into()),
32 if arch == InlineAsmArch::X86_64 => Some(('e', "eax")), 32 if arch == InlineAsmArch::X86_64 => Some(('e', "eax", 32).into()),
_ => None, _ => None,
}, },
Self::reg_byte => None, Self::reg_byte => None,
Self::xmm_reg => None, Self::xmm_reg => None,
Self::ymm_reg => match ty.size().bits() { Self::ymm_reg => match ty.size().bits() {
256 => None, 256 => None,
_ => Some(('x', "xmm0")), _ => Some(('x', "xmm0", 128).into()),
}, },
Self::zmm_reg => match ty.size().bits() { Self::zmm_reg => match ty.size().bits() {
512 => None, 512 => None,
256 => Some(('y', "ymm0")), 256 => Some(('y', "ymm0", 256).into()),
_ => Some(('x', "xmm0")), _ => Some(('x', "xmm0", 128).into()),
}, },
Self::kreg | Self::kreg0 => None, Self::kreg | Self::kreg0 => None,
Self::mmx_reg | Self::x87_reg => None, Self::mmx_reg | Self::x87_reg => None,
@ -86,19 +82,19 @@ pub fn suggest_modifier(
} }
} }
pub fn default_modifier(self, arch: InlineAsmArch) -> Option<(char, &'static str)> { pub fn default_modifier(self, arch: InlineAsmArch) -> Option<ModifierInfo> {
match self { match self {
Self::reg | Self::reg_abcd => { Self::reg | Self::reg_abcd => {
if arch == InlineAsmArch::X86_64 { if arch == InlineAsmArch::X86_64 {
Some(('r', "rax")) Some(('r', "rax", 64).into())
} else { } else {
Some(('e', "eax")) Some(('e', "eax", 32).into())
} }
} }
Self::reg_byte => None, Self::reg_byte => None,
Self::xmm_reg => Some(('x', "xmm0")), Self::xmm_reg => Some(('x', "xmm0", 128).into()),
Self::ymm_reg => Some(('y', "ymm0")), Self::ymm_reg => Some(('y', "ymm0", 256).into()),
Self::zmm_reg => Some(('z', "zmm0")), Self::zmm_reg => Some(('z', "zmm0", 512).into()),
Self::kreg | Self::kreg0 => None, Self::kreg | Self::kreg0 => None,
Self::mmx_reg | Self::x87_reg => None, Self::mmx_reg | Self::x87_reg => None,
Self::tmm_reg => None, Self::tmm_reg => None,