Skip to content

Commit b883697

Browse files
committed
ZJIT: Split UnhandledHIRInsn into per-insn exit reasons
1 parent 2529c36 commit b883697

4 files changed

Lines changed: 19 additions & 5 deletions

File tree

zjit/src/codegen.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,14 @@ fn gen_function(cb: &mut CodeBlock, iseq: IseqPtr, version: IseqVersionRef, func
451451
if let Err(last_snapshot) = gen_insn(cb, &mut jit, &mut asm, function, insn_id, &insn) {
452452
debug!("ZJIT: gen_function: Failed to compile insn: {insn_id} {insn}. Generating side-exit.");
453453
gen_incr_counter(&mut asm, exit_counter_for_unhandled_hir_insn(&insn));
454-
gen_side_exit(&mut jit, &mut asm, &SideExitReason::UnhandledHIRInsn(insn_id), &function.frame_state(last_snapshot));
454+
let reason = match insn {
455+
Insn::ArrayMax { .. } => SideExitReason::UnhandledHIRArrayMax,
456+
Insn::FixnumDiv { .. } => SideExitReason::UnhandledHIRFixnumDiv,
457+
Insn::Throw { .. } => SideExitReason::UnhandledHIRThrow,
458+
Insn::InvokeBuiltin { .. } => SideExitReason::UnhandledHIRInvokeBuiltin,
459+
_ => SideExitReason::UnhandledHIRUnknown(insn_id),
460+
};
461+
gen_side_exit(&mut jit, &mut asm, &reason, &function.frame_state(last_snapshot));
455462
// Don't bother generating code after a side-exit. We won't run it.
456463
// TODO(max): Generate ud2 or equivalent.
457464
break;

zjit/src/hir.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,11 @@ pub enum SideExitReason {
498498
UnhandledNewarraySend(vm_opt_newarray_send_type),
499499
UnhandledDuparraySend(u64),
500500
UnknownSpecialVariable(u64),
501-
UnhandledHIRInsn(InsnId),
501+
UnhandledHIRArrayMax,
502+
UnhandledHIRFixnumDiv,
503+
UnhandledHIRThrow,
504+
UnhandledHIRInvokeBuiltin,
505+
UnhandledHIRUnknown(InsnId),
502506
UnhandledYARVInsn(u32),
503507
UnhandledCallType(CallType),
504508
UnhandledBlockArg,

zjit/src/state.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -484,9 +484,8 @@ pub extern "C" fn rb_zjit_record_exit_stack(_exit_pc: *const VALUE, reason: *con
484484
)
485485
};
486486

487-
// Resolve each frame to a human-readable string
487+
// Resolve each frame to a human-readable string (top frame first)
488488
let frames: Vec<String> = (0..stack_length as usize)
489-
.rev()
490489
.map(|i| resolve_frame_label(frames_buffer[i]))
491490
.collect();
492491

zjit/src/stats.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -568,7 +568,11 @@ pub fn side_exit_counter(reason: crate::hir::SideExitReason) -> Counter {
568568
UnhandledCallType(Splat) => exit_unhandled_splat,
569569
UnhandledCallType(Kwarg) => exit_unhandled_kwarg,
570570
UnknownSpecialVariable(_) => exit_unknown_special_variable,
571-
UnhandledHIRInsn(_) => exit_unhandled_hir_insn,
571+
UnhandledHIRArrayMax => exit_unhandled_hir_insn,
572+
UnhandledHIRFixnumDiv => exit_unhandled_hir_insn,
573+
UnhandledHIRThrow => exit_unhandled_hir_insn,
574+
UnhandledHIRInvokeBuiltin => exit_unhandled_hir_insn,
575+
UnhandledHIRUnknown(_) => exit_unhandled_hir_insn,
572576
UnhandledYARVInsn(_) => exit_unhandled_yarv_insn,
573577
UnhandledBlockArg => exit_unhandled_block_arg,
574578
FixnumAddOverflow => exit_fixnum_add_overflow,

0 commit comments

Comments
 (0)