show supported register classes
in inline assembly, show the supported register classes when an invalid one is found
This commit is contained in:
parent
cf577f34c4
commit
fbd30ea35f
7 changed files with 23 additions and 8 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
},
|
},
|
||||||
|
|
|
@ -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)]
|
||||||
|
|
|
@ -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)?)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue