diff options
author | Alan Wu <[email protected]> | 2025-02-06 12:10:43 -0500 |
---|---|---|
committer | Takashi Kokubun <[email protected]> | 2025-04-18 21:52:56 +0900 |
commit | 1d95139bf6bee795fb5dc47da9d0ae663bc69c8c (patch) | |
tree | 6d13993fb0133e5ee0439ee7aa1482ba0c471626 | |
parent | 0f9557e9a7992c91c4aba9d8cf88c0695445e611 (diff) |
`miniruby --zjit -e nil` runs through iseq_to_ssa
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/13131
-rw-r--r-- | vm.c | 3 | ||||
-rw-r--r-- | zjit.c | 28 | ||||
-rw-r--r-- | zjit/src/ir.rs | 7 | ||||
-rw-r--r-- | zjit/src/lib.rs | 4 |
4 files changed, 37 insertions, 5 deletions
@@ -496,6 +496,9 @@ jit_compile_exception(rb_execution_context_t *ec) if (body->jit_exception_calls == rb_yjit_call_threshold) { rb_yjit_compile_iseq(iseq, ec, true); } + + + } return body->jit_exception; } @@ -134,3 +134,31 @@ rb_zjit_compile_iseq(const rb_iseq_t *iseq, rb_execution_context_t *ec, bool jit RB_VM_LOCK_LEAVE(); } + +unsigned int +rb_iseq_encoded_size(const rb_iseq_t *iseq) +{ + return iseq->body->iseq_size; +} + +// Get the opcode given a program counter. Can return trace opcode variants. +int +rb_iseq_opcode_at_pc(const rb_iseq_t *iseq, const VALUE *pc) +{ + // YJIT should only use iseqs after AST to bytecode compilation + RUBY_ASSERT_ALWAYS(FL_TEST_RAW((VALUE)iseq, ISEQ_TRANSLATED)); + + const VALUE at_pc = *pc; + return rb_vm_insn_addr2opcode((const void *)at_pc); +} + +// Get the PC for a given index in an iseq +VALUE * +rb_iseq_pc_at_idx(const rb_iseq_t *iseq, uint32_t insn_idx) +{ + RUBY_ASSERT_ALWAYS(IMEMO_TYPE_P(iseq, imemo_iseq)); + RUBY_ASSERT_ALWAYS(insn_idx < iseq->body->iseq_size); + VALUE *encoded = iseq->body->iseq_encoded; + VALUE *pc = &encoded[insn_idx]; + return pc; +} diff --git a/zjit/src/ir.rs b/zjit/src/ir.rs index 278a1767b7..ea5647e8af 100644 --- a/zjit/src/ir.rs +++ b/zjit/src/ir.rs @@ -158,7 +158,7 @@ fn to_ssa(opcodes: &Vec<RubyOpcode>) -> Function { result } -fn iseq_to_ssa(iseq: *const rb_iseq_t) -> Function { +pub fn iseq_to_ssa(iseq: *const rb_iseq_t) { let mut result = Function::new(); let mut state = FrameState::new(); let block = result.entry_block; @@ -206,13 +206,14 @@ fn iseq_to_ssa(iseq: *const rb_iseq_t) -> Function { YARVINSN_leave => { result.push_insn(block, Insn::Return { val: state.pop() }); } - _ => todo!(), + _ => eprintln!("zjit: unknown opcode {opcode}"), } // Move to the next instruction to compile insn_idx += insn_len(opcode as usize); } - return result; + dbg!(result); + return; fn get_arg(pc: *const VALUE, arg_idx: isize) -> VALUE { unsafe { *(pc.offset(arg_idx + 1)) } diff --git a/zjit/src/lib.rs b/zjit/src/lib.rs index dd036a1ee4..6a4cda6ee3 100644 --- a/zjit/src/lib.rs +++ b/zjit/src/lib.rs @@ -25,7 +25,7 @@ pub extern "C" fn rb_zjit_parse_option() -> bool { } #[no_mangle] -pub extern "C" fn rb_zjit_iseq_gen_entry_point(_iseq: IseqPtr, _ec: EcPtr) -> *const u8 { - println!("compiling zjit"); +pub extern "C" fn rb_zjit_iseq_gen_entry_point(iseq: IseqPtr, _ec: EcPtr) -> *const u8 { + ir::iseq_to_ssa(iseq); std::ptr::null() } |