#[non_exhaustive]pub enum EmitError {
Show 13 variants
Mir(MirError),
Frame(FrameError),
Moves(MoveError),
UnsupportedTarget,
VirtualRegister {
block: Block,
inst: Option<Inst>,
},
TiedMismatch {
inst: Inst,
},
ReservedWrite {
block: Block,
inst: Option<Inst>,
},
Unencodable {
inst: Option<Inst>,
},
Encode {
inst: Option<Inst>,
error: EncodeError,
},
Asm(AsmError),
UndefinedSymbol(String),
DuplicateSymbol(String),
ProbeScratch,
}Expand description
Why a function could not be emitted.
§Examples
use backend_lang::mir::{Function, Operand};
use backend_lang::x86_64::{op, EmitError, GPR, SYSV};
// Emission needs physical registers: run register allocation first.
let mut f = Function::new("f", &SYSV);
let b = f.block()?;
let v = f.vreg(GPR)?;
f.push(b, op::MOV64RI, &[v.into(), Operand::Imm(1)])?;
f.push(b, op::RET, &[])?;
let err = backend_lang::emit(&f).unwrap_err();
assert!(matches!(err, EmitError::VirtualRegister { .. }));Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Mir(MirError)
The function is malformed (Function::verify fails).
Frame(FrameError)
The frame cannot be laid out.
Moves(MoveError)
A parallel copy cannot be resolved.
UnsupportedTarget
The function’s target is not this crate’s x86-64 description (a
custom Target must reuse its register and
instruction tables to be emitted by this emitter).
VirtualRegister
A virtual register remains (in an instruction, or, with inst absent,
in a block parameter). Emission runs after register allocation.
TiedMismatch
A tied use is not the same register as its definition. The register allocator must give them one register (or insert a copy).
ReservedWrite
The body writes the stack pointer, or the frame pointer while it is
kept (in an instruction, or, with inst absent, as a block
parameter). The frame owns both.
Unencodable
The operation needs an instruction isa-lang 0.2 does not encode: a
move of a vector register, or a Win64 prologue saving one. (With
inst absent: a prologue, epilogue, or edge move.)
Encode
isa-lang refused an instruction (with inst absent: a prologue,
epilogue, or edge move).
Asm(AsmError)
The assembler failed (code beyond 2 GiB, or a label error).
UndefinedSymbol(String)
A function was called (or its address taken) but never emitted.
DuplicateSymbol(String)
Two functions with one name were emitted.
ProbeScratch
A frame large enough to need a probe loop takes its counter in r11
or r10, and the entry block receives values in both.
Trait Implementations§
impl Eq for EmitError
Source§impl Error for EmitError
impl Error for EmitError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()