summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Wu <[email protected]>2025-02-06 12:10:43 -0500
committerTakashi Kokubun <[email protected]>2025-04-18 21:52:56 +0900
commit1d95139bf6bee795fb5dc47da9d0ae663bc69c8c (patch)
tree6d13993fb0133e5ee0439ee7aa1482ba0c471626
parent0f9557e9a7992c91c4aba9d8cf88c0695445e611 (diff)
`miniruby --zjit -e nil` runs through iseq_to_ssa
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/13131
-rw-r--r--vm.c3
-rw-r--r--zjit.c28
-rw-r--r--zjit/src/ir.rs7
-rw-r--r--zjit/src/lib.rs4
4 files changed, 37 insertions, 5 deletions
diff --git a/vm.c b/vm.c
index d43deb43cd..e2cdfda0cb 100644
--- a/vm.c
+++ b/vm.c
@@ -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;
}
diff --git a/zjit.c b/zjit.c
index adf224d446..69b8fc6b67 100644
--- a/zjit.c
+++ b/zjit.c
@@ -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()
}