use crate::enums::ir_block_kind::IrBlockKind;
use crate::enums::ir_op_kind::IrOpKind;
use crate::functions::emit_abort::emit_abort;
use crate::functions::vm_exit_op::vm_exit_op;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::records::ir_lowering_a_64::IrLoweringA64;
use crate::records::ir_op::IrOp;
use crate::records::label::Label;
use luaur_common::FFlag;
impl IrLoweringA64 {
pub fn ir_lowering_a_64_finalize_target_label(
&mut self,
op: IrOp,
index: u32,
fresh: &mut Label,
) {
if op.kind() == IrOpKind::Undef {
unsafe {
emit_abort(&mut *self.build, fresh);
}
} else if FFlag::LuauCodegenVmExitSync.get()
&& op.kind() == IrOpKind::Block
&& self.ir_lowering_a_64_block_op(op).kind == IrBlockKind::ExitSync
{
if self.exit_sync_inst_idx == index {
CODEGEN_ASSERT!(self.exit_sync_alloc_token == self.regs.get_alloc_token());
}
let sync_info = unsafe { (*self.function).vm_exit_info.find(&index) };
CODEGEN_ASSERT!(sync_info.is_some());
let sync_info = sync_info.unwrap();
for arg_op in &sync_info.arg_ops {
let inst_op = unsafe { (*self.function).inst_op(*arg_op) };
self.regs
.record_and_free_last_use(op.index(), inst_op, index);
}
} else if op.kind() == IrOpKind::VmExit && fresh.id != 0 {
let exit_handler_idx = self.exit_handlers.len() as u32;
self.exit_handler_map
.try_insert(vm_exit_op(op), exit_handler_idx);
self.exit_handlers
.push(crate::records::exit_handler_ir_lowering_a_64::ExitHandler {
self_: *fresh,
pcpos: vm_exit_op(op),
});
}
}
}