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}
|
||||
|
||||
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 =
|
||||
`match` arm with no body
|
||||
|
|
|
@ -152,11 +152,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
|
|||
InlineAsmRegOrRegClass::RegClass(reg_class) => {
|
||||
asm::InlineAsmRegOrRegClass::RegClass(if let Some(asm_arch) = asm_arch {
|
||||
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 {
|
||||
op_span: *op_sp,
|
||||
reg_class,
|
||||
error,
|
||||
supported_register_classes: register_classes,
|
||||
});
|
||||
asm::InlineAsmRegClass::Err
|
||||
},
|
||||
|
|
|
@ -212,12 +212,13 @@ pub(crate) struct InvalidRegister<'a> {
|
|||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[note]
|
||||
#[diag(ast_lowering_invalid_register_class)]
|
||||
pub(crate) struct InvalidRegisterClass<'a> {
|
||||
pub(crate) struct InvalidRegisterClass {
|
||||
#[primary_span]
|
||||
pub op_span: Span,
|
||||
pub reg_class: Symbol,
|
||||
pub error: &'a str,
|
||||
pub supported_register_classes: String,
|
||||
}
|
||||
|
||||
#[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 {
|
||||
$(
|
||||
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 {
|
||||
InlineAsmArch::X86 | InlineAsmArch::X86_64 => {
|
||||
Self::X86(X86InlineAsmRegClass::parse(name)?)
|
||||
|
|
|
@ -3,6 +3,8 @@ error: invalid register class `foo`: unknown register class
|
|||
|
|
||||
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
|
||||
--> $DIR/bad-reg.rs:14:18
|
||||
|
|
|
@ -3,6 +3,8 @@ error: invalid register class `foo`: unknown register class
|
|||
|
|
||||
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
|
||||
--> $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") {
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= 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
|
||||
--> $DIR/issue-82869.rs:11:45
|
||||
|
|
||||
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
|
||||
--> $DIR/issue-82869.rs:11:57
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue