summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Wu <XrXr@users.noreply.github.com>2020-10-19 09:47:39 -0400
committerAlan Wu <XrXr@users.noreply.github.com>2021-10-20 18:19:25 -0400
commit93f6ac39f20f64a879507db98a16177530e9f3d4 (patch)
treee637f031469ce2c2ed3697c3f43fed3956f2d372
parentba45aff16b1246a3c6b31e9cebb0096fb4e1fcae (diff)
MicroJIT: Don't compile trace instructions
-rw-r--r--iseq.c19
-rw-r--r--iseq.h2
-rw-r--r--ujit_compile.c2
3 files changed, 22 insertions, 1 deletions
diff --git a/iseq.c b/iseq.c
index 971f1c54c7..6b8f3d0e2c 100644
--- a/iseq.c
+++ b/iseq.c
@@ -3232,6 +3232,25 @@ rb_vm_insn_addr2insn(const void *addr)
rb_bug("rb_vm_insn_addr2insn: invalid insn address: %p", addr);
}
+// Unlike rb_vm_insn_addr2insn, this function can return trace opcode variants.
+int
+rb_vm_insn_addr2opcode(const void *addr)
+{
+ st_data_t key = (st_data_t)addr;
+ st_data_t val;
+
+ if (st_lookup(rb_encoded_insn_data, key, &val)) {
+ insn_data_t *e = (insn_data_t *)val;
+ int opcode = e->insn;
+ if (addr == e->trace_encoded_insn) {
+ opcode += VM_INSTRUCTION_SIZE/2;
+ }
+ return opcode;
+ }
+
+ rb_bug("rb_vm_insn_addr2opcode: invalid insn address: %p", addr);
+}
+
// Decode `iseq->body->iseq_encoded[i]` to an insn.
int
rb_vm_insn_decode(const VALUE encoded)
diff --git a/iseq.h b/iseq.h
index ace5a45ba3..9b5eb138ad 100644
--- a/iseq.h
+++ b/iseq.h
@@ -167,6 +167,8 @@ const rb_iseq_t *rb_iseq_load_iseq(VALUE fname);
unsigned int *rb_iseq_insns_info_decode_positions(const struct rb_iseq_constant_body *body);
#endif
+int rb_vm_insn_addr2opcode(const void *addr);
+
RUBY_SYMBOL_EXPORT_BEGIN
/* compile.c */
diff --git a/ujit_compile.c b/ujit_compile.c
index 1d349b5664..f922088bcc 100644
--- a/ujit_compile.c
+++ b/ujit_compile.c
@@ -74,7 +74,7 @@ opcode_at_pc(const rb_iseq_t *iseq, const VALUE *pc)
{
const VALUE at_pc = *pc;
if (FL_TEST_RAW((VALUE)iseq, ISEQ_TRANSLATED)) {
- return rb_vm_insn_addr2insn((const void *)at_pc);
+ return rb_vm_insn_addr2opcode((const void *)at_pc);
}
else {
return (int)at_pc;