#[non_exhaustive]pub enum EmitError {
Show 15 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,
Constraint {
inst: Inst,
},
ExternalConflict(String),
}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.
Constraint
An operand constraint the instruction relies on does not hold: a table branch’s temporary is its index register, or a tail call’s register target is one the epilogue restores.
ExternalConflict(String)
A function was declared external and also emitted, or a name was declared external twice in conflicting ways.
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()