Skip to content

Commit daf0681

Browse files
committed
ZJIT: Drop trace_zjit_* instructions
1 parent 3ec7bff commit daf0681

File tree

7 files changed

+285
-296
lines changed

7 files changed

+285
-296
lines changed

iseq.c

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3283,7 +3283,7 @@ iseq_data_to_ary(const rb_iseq_t *iseq)
32833283
VALUE exception = rb_ary_new(); /* [[....]] */
32843284
VALUE misc = rb_hash_new();
32853285

3286-
static ID insn_syms[VM_INSTRUCTION_SIZE/2]; /* w/o-trace only */
3286+
static ID insn_syms[VM_BARE_INSTRUCTION_SIZE]; /* w/o-trace only */
32873287
struct st_table *labels_table = st_init_numtable();
32883288
VALUE labels_wrapper = TypedData_Wrap_Struct(0, &label_wrapper, labels_table);
32893289

@@ -3745,17 +3745,19 @@ rb_iseq_defined_string(enum defined_type type)
37453745
return rb_fstring_cstr(estr);
37463746
}
37473747

3748-
/* A map from encoded_insn to insn_data: decoded insn number, its len,
3749-
* non-trace version of encoded insn, and trace version. */
3750-
3748+
// A map from encoded_insn to insn_data: decoded insn number, its len,
3749+
// decoded ZJIT insn number, non-trace version of encoded insn,
3750+
// trace version, and zjit version.
37513751
static st_table *encoded_insn_data;
37523752
typedef struct insn_data_struct {
37533753
int insn;
37543754
int insn_len;
3755+
int zjit_insn;
37553756
void *notrace_encoded_insn;
37563757
void *trace_encoded_insn;
3758+
void *zjit_encoded_insn;
37573759
} insn_data_t;
3758-
static insn_data_t insn_data[VM_INSTRUCTION_SIZE/2];
3760+
static insn_data_t insn_data[VM_BARE_INSTRUCTION_SIZE];
37593761

37603762
void
37613763
rb_free_encoded_insn_data(void)
@@ -3772,27 +3774,29 @@ rb_vm_encoded_insn_data_table_init(void)
37723774
#else
37733775
#define INSN_CODE(insn) (insn)
37743776
#endif
3775-
st_data_t insn;
3776-
encoded_insn_data = st_init_numtable_with_size(VM_INSTRUCTION_SIZE / 2);
3777-
3778-
for (insn = 0; insn < VM_INSTRUCTION_SIZE/2; insn++) {
3779-
st_data_t key1 = (st_data_t)INSN_CODE(insn);
3780-
st_data_t key2 = (st_data_t)INSN_CODE(insn + VM_INSTRUCTION_SIZE/2);
3777+
encoded_insn_data = st_init_numtable_with_size(VM_BARE_INSTRUCTION_SIZE);
37813778

3782-
insn_data[insn].insn = (int)insn;
3779+
for (int insn = 0; insn < VM_BARE_INSTRUCTION_SIZE; insn++) {
3780+
int zjit_insn = vm_bare_insn_to_zjit_insn(insn);
3781+
insn_data[insn].insn = insn;
37833782
insn_data[insn].insn_len = insn_len(insn);
3783+
insn_data[insn].zjit_insn = zjit_insn;
37843784

3785-
if (insn != BIN(opt_invokebuiltin_delegate_leave)) {
3786-
insn_data[insn].notrace_encoded_insn = (void *) key1;
3787-
insn_data[insn].trace_encoded_insn = (void *) key2;
3788-
}
3789-
else {
3790-
insn_data[insn].notrace_encoded_insn = (void *) INSN_CODE(BIN(opt_invokebuiltin_delegate));
3791-
insn_data[insn].trace_encoded_insn = (void *) INSN_CODE(BIN(opt_invokebuiltin_delegate) + VM_INSTRUCTION_SIZE/2);
3792-
}
3785+
// When tracing :return events, we convert opt_invokebuiltin_delegate_leave + leave into
3786+
// opt_invokebuiltin_delegate + trace_leave. https://github.com/ruby/ruby/pull/3256
3787+
int notrace_insn = (insn != BIN(opt_invokebuiltin_delegate_leave)) ? insn : BIN(opt_invokebuiltin_delegate);
3788+
insn_data[insn].notrace_encoded_insn = (void *)INSN_CODE(notrace_insn);
3789+
insn_data[insn].trace_encoded_insn = (void *)INSN_CODE(notrace_insn + VM_BARE_INSTRUCTION_SIZE);
3790+
insn_data[insn].zjit_encoded_insn = (insn != zjit_insn) ? (void *)INSN_CODE(zjit_insn) : 0;
37933791

3792+
st_data_t key1 = (st_data_t)INSN_CODE(insn);
3793+
st_data_t key2 = (st_data_t)INSN_CODE(insn + VM_BARE_INSTRUCTION_SIZE);
37943794
st_add_direct(encoded_insn_data, key1, (st_data_t)&insn_data[insn]);
37953795
st_add_direct(encoded_insn_data, key2, (st_data_t)&insn_data[insn]);
3796+
if (insn != zjit_insn) {
3797+
st_data_t key3 = (st_data_t)INSN_CODE(zjit_insn);
3798+
st_add_direct(encoded_insn_data, key3, (st_data_t)&insn_data[insn]);
3799+
}
37963800
}
37973801
}
37983802

@@ -3821,7 +3825,10 @@ rb_vm_insn_addr2opcode(const void *addr)
38213825
insn_data_t *e = (insn_data_t *)val;
38223826
int opcode = e->insn;
38233827
if (addr == e->trace_encoded_insn) {
3824-
opcode += VM_INSTRUCTION_SIZE/2;
3828+
opcode += VM_BARE_INSTRUCTION_SIZE;
3829+
}
3830+
else if (addr == e->zjit_encoded_insn) {
3831+
opcode = e->zjit_insn;
38253832
}
38263833
return opcode;
38273834
}

tool/ruby_vm/models/instructions.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
RubyVM::OperandsUnifications.to_a + \
1818
RubyVM::InstructionsUnifications.to_a
1919

20-
require_relative 'zjit_instructions'
2120
require_relative 'trace_instructions'
21+
require_relative 'zjit_instructions'
2222
RubyVM::Instructions.freeze

tool/ruby_vm/models/trace_instructions.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ def has_attribute? *;
5858
return false
5959
end
6060

61+
def zjit_profile?
62+
return false
63+
end
64+
6165
private
6266

6367
@instances = RubyVM::Instructions.map {|i| new i }

tool/ruby_vm/views/insns.inc.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ enum ruby_vminsn_type {
2525
VM_INSTRUCTION_SIZE
2626
};
2727

28+
#define VM_BARE_INSTRUCTION_SIZE <%= RubyVM::Instructions.count { |i| i.name !~ /\A(trace|zjit)_/ } %>
29+
2830
#define ASSERT_VM_INSTRUCTION_SIZE(array) \
2931
STATIC_ASSERT(numberof_##array, numberof(array) == VM_INSTRUCTION_SIZE)
3032

0 commit comments

Comments
 (0)