show supported register classes

in inline assembly, show the supported register classes when an invalid one is found
This commit is contained in:
Folkert de Vries 2025-01-29 11:57:37 +01:00
parent cf577f34c4
commit fbd30ea35f
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
7 changed files with 23 additions and 8 deletions

View file

@ -112,7 +112,8 @@ ast_lowering_invalid_register =
invalid register `{$reg}`: {$error} invalid register `{$reg}`: {$error}
ast_lowering_invalid_register_class = ast_lowering_invalid_register_class =
invalid register class `{$reg_class}`: {$error} invalid register class `{$reg_class}`: unknown register class
.note = the following register classes are supported on this target: {$supported_register_classes}
ast_lowering_match_arm_with_no_body = ast_lowering_match_arm_with_no_body =
`match` arm with no body `match` arm with no body

View file

@ -152,11 +152,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
InlineAsmRegOrRegClass::RegClass(reg_class) => { InlineAsmRegOrRegClass::RegClass(reg_class) => {
asm::InlineAsmRegOrRegClass::RegClass(if let Some(asm_arch) = asm_arch { asm::InlineAsmRegOrRegClass::RegClass(if let Some(asm_arch) = asm_arch {
asm::InlineAsmRegClass::parse(asm_arch, reg_class).unwrap_or_else( asm::InlineAsmRegClass::parse(asm_arch, reg_class).unwrap_or_else(
|error| { |supported_register_classes| {
let mut register_classes =
format!("`{}`", supported_register_classes[0]);
for m in &supported_register_classes[1..] {
let _ = write!(register_classes, ", `{m}`");
}
self.dcx().emit_err(InvalidRegisterClass { self.dcx().emit_err(InvalidRegisterClass {
op_span: *op_sp, op_span: *op_sp,
reg_class, reg_class,
error, supported_register_classes: register_classes,
}); });
asm::InlineAsmRegClass::Err asm::InlineAsmRegClass::Err
}, },

View file

@ -212,12 +212,13 @@ pub(crate) struct InvalidRegister<'a> {
} }
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[note]
#[diag(ast_lowering_invalid_register_class)] #[diag(ast_lowering_invalid_register_class)]
pub(crate) struct InvalidRegisterClass<'a> { pub(crate) struct InvalidRegisterClass {
#[primary_span] #[primary_span]
pub op_span: Span, pub op_span: Span,
pub reg_class: Symbol, pub reg_class: Symbol,
pub error: &'a str, pub supported_register_classes: String,
} }
#[derive(Diagnostic)] #[derive(Diagnostic)]

View file

@ -39,12 +39,12 @@ macro_rules! def_reg_class {
} }
} }
pub fn parse(name: rustc_span::Symbol) -> Result<Self, &'static str> { pub fn parse(name: rustc_span::Symbol) -> Result<Self, &'static [rustc_span::Symbol]> {
match name { match name {
$( $(
rustc_span::sym::$class => Ok(Self::$class), rustc_span::sym::$class => Ok(Self::$class),
)* )*
_ => Err("unknown register class"), _ => Err(&[$(rustc_span::sym::$class),*]),
} }
} }
} }
@ -635,7 +635,7 @@ impl InlineAsmRegClass {
} }
} }
pub fn parse(arch: InlineAsmArch, name: Symbol) -> Result<Self, &'static str> { pub fn parse(arch: InlineAsmArch, name: Symbol) -> Result<Self, &'static [rustc_span::Symbol]> {
Ok(match arch { Ok(match arch {
InlineAsmArch::X86 | InlineAsmArch::X86_64 => { InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
Self::X86(X86InlineAsmRegClass::parse(name)?) Self::X86(X86InlineAsmRegClass::parse(name)?)

View file

@ -3,6 +3,8 @@ error: invalid register class `foo`: unknown register class
| |
LL | asm!("{}", in(foo) foo); LL | asm!("{}", in(foo) foo);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
= note: the following register classes are supported on this target: `reg`, `vreg`, `vreg_low16`, `preg`
error: invalid register `foo`: unknown register error: invalid register `foo`: unknown register
--> $DIR/bad-reg.rs:14:18 --> $DIR/bad-reg.rs:14:18

View file

@ -3,6 +3,8 @@ error: invalid register class `foo`: unknown register class
| |
LL | asm!("{}", in(foo) foo); LL | asm!("{}", in(foo) foo);
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
= note: the following register classes are supported on this target: `reg`, `reg_abcd`, `reg_byte`, `xmm_reg`, `ymm_reg`, `zmm_reg`, `kreg`, `kreg0`, `mmx_reg`, `x87_reg`, `tmm_reg`
error: invalid register `foo`: unknown register error: invalid register `foo`: unknown register
--> $DIR/bad-reg.rs:14:18 --> $DIR/bad-reg.rs:14:18

View file

@ -3,12 +3,16 @@ error: invalid register class `vreg`: unknown register class
| |
LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") {
| ^^^^^^^^^^^ | ^^^^^^^^^^^
|
= note: the following register classes are supported on this target: `reg`, `reg_abcd`, `reg_byte`, `xmm_reg`, `ymm_reg`, `zmm_reg`, `kreg`, `kreg0`, `mmx_reg`, `x87_reg`, `tmm_reg`
error: invalid register class `vreg`: unknown register class error: invalid register class `vreg`: unknown register class
--> $DIR/issue-82869.rs:11:45 --> $DIR/issue-82869.rs:11:45
| |
LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") {
| ^^^^^^^^^^ | ^^^^^^^^^^
|
= note: the following register classes are supported on this target: `reg`, `reg_abcd`, `reg_byte`, `xmm_reg`, `ymm_reg`, `zmm_reg`, `kreg`, `kreg0`, `mmx_reg`, `x87_reg`, `tmm_reg`
error: invalid register `d0`: unknown register error: invalid register `d0`: unknown register
--> $DIR/issue-82869.rs:11:57 --> $DIR/issue-82869.rs:11:57