зеркало из https://github.com/github/ruby.git
Use bindgen to import CRuby constants for YARV instruction bytecodes
This commit is contained in:
Родитель
bd472ef36f
Коммит
ba88787087
|
@ -56,6 +56,9 @@ fn main() {
|
|||
// Prune these types since they are system dependant and we don't use them
|
||||
.blocklist_type("__.*")
|
||||
|
||||
// Import YARV bytecode instruction constants
|
||||
.allowlist_type("ruby_vminsn_type")
|
||||
|
||||
// From include/ruby/internal/intern/string.h
|
||||
.allowlist_function("rb_utf8_str_new")
|
||||
.allowlist_function("rb_str_append")
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
// We use the YARV bytecode constants which have a CRuby-style name
|
||||
#![allow(non_upper_case_globals)]
|
||||
|
||||
use crate::asm::x86_64::*;
|
||||
use crate::asm::*;
|
||||
use crate::core::*;
|
||||
|
@ -728,7 +731,7 @@ pub fn gen_single_block(
|
|||
|
||||
// opt_getinlinecache wants to be in a block all on its own. Cut the block short
|
||||
// if we run into it. See gen_opt_getinlinecache() for details.
|
||||
if opcode == OP_OPT_GETINLINECACHE && insn_idx > starting_insn_idx {
|
||||
if opcode == YARVINSN_opt_getinlinecache.as_usize() && insn_idx > starting_insn_idx {
|
||||
jump_to_next_insn(&mut jit, &ctx, cb, ocb);
|
||||
break;
|
||||
}
|
||||
|
@ -988,7 +991,7 @@ fn gen_putobject_int2fix(
|
|||
_ocb: &mut OutlinedCb,
|
||||
) -> CodegenStatus {
|
||||
let opcode = jit.opcode;
|
||||
let cst_val: usize = if opcode == OP_PUTOBJECT_INT2FIX_0_ {
|
||||
let cst_val: usize = if opcode == YARVINSN_putobject_INT2FIX_0_.as_usize() {
|
||||
0
|
||||
} else {
|
||||
1
|
||||
|
@ -5811,95 +5814,96 @@ fn gen_opt_invokebuiltin_delegate(
|
|||
/// Maps a YARV opcode to a code generation function (if supported)
|
||||
fn get_gen_fn(opcode: VALUE) -> Option<InsnGenFn> {
|
||||
let VALUE(opcode) = opcode;
|
||||
let opcode = opcode as ruby_vminsn_type;
|
||||
assert!(opcode < VM_INSTRUCTION_SIZE);
|
||||
|
||||
match opcode {
|
||||
OP_NOP => Some(gen_nop),
|
||||
OP_POP => Some(gen_pop),
|
||||
OP_DUP => Some(gen_dup),
|
||||
OP_DUPN => Some(gen_dupn),
|
||||
OP_SWAP => Some(gen_swap),
|
||||
OP_PUTNIL => Some(gen_putnil),
|
||||
OP_PUTOBJECT => Some(gen_putobject),
|
||||
OP_PUTOBJECT_INT2FIX_0_ => Some(gen_putobject_int2fix),
|
||||
OP_PUTOBJECT_INT2FIX_1_ => Some(gen_putobject_int2fix),
|
||||
OP_PUTSELF => Some(gen_putself),
|
||||
OP_PUTSPECIALOBJECT => Some(gen_putspecialobject),
|
||||
OP_SETN => Some(gen_setn),
|
||||
OP_TOPN => Some(gen_topn),
|
||||
OP_ADJUSTSTACK => Some(gen_adjuststack),
|
||||
OP_GETLOCAL => Some(gen_getlocal),
|
||||
OP_GETLOCAL_WC_0 => Some(gen_getlocal_wc0),
|
||||
OP_GETLOCAL_WC_1 => Some(gen_getlocal_wc1),
|
||||
OP_SETLOCAL => Some(gen_setlocal),
|
||||
OP_SETLOCAL_WC_0 => Some(gen_setlocal_wc0),
|
||||
OP_SETLOCAL_WC_1 => Some(gen_setlocal_wc1),
|
||||
OP_OPT_PLUS => Some(gen_opt_plus),
|
||||
OP_OPT_MINUS => Some(gen_opt_minus),
|
||||
OP_OPT_AND => Some(gen_opt_and),
|
||||
OP_OPT_OR => Some(gen_opt_or),
|
||||
OP_NEWHASH => Some(gen_newhash),
|
||||
OP_DUPHASH => Some(gen_duphash),
|
||||
OP_NEWARRAY => Some(gen_newarray),
|
||||
OP_DUPARRAY => Some(gen_duparray),
|
||||
OP_CHECKTYPE => Some(gen_checktype),
|
||||
OP_OPT_LT => Some(gen_opt_lt),
|
||||
OP_OPT_LE => Some(gen_opt_le),
|
||||
OP_OPT_GT => Some(gen_opt_gt),
|
||||
OP_OPT_GE => Some(gen_opt_ge),
|
||||
OP_OPT_MOD => Some(gen_opt_mod),
|
||||
OP_OPT_STR_FREEZE => Some(gen_opt_str_freeze),
|
||||
OP_OPT_STR_UMINUS => Some(gen_opt_str_uminus),
|
||||
OP_SPLATARRAY => Some(gen_splatarray),
|
||||
OP_NEWRANGE => Some(gen_newrange),
|
||||
OP_PUTSTRING => Some(gen_putstring),
|
||||
OP_EXPANDARRAY => Some(gen_expandarray),
|
||||
OP_DEFINED => Some(gen_defined),
|
||||
OP_CHECKKEYWORD => Some(gen_checkkeyword),
|
||||
OP_CONCATSTRINGS => Some(gen_concatstrings),
|
||||
OP_GETINSTANCEVARIABLE => Some(gen_getinstancevariable),
|
||||
OP_SETINSTANCEVARIABLE => Some(gen_setinstancevariable),
|
||||
YARVINSN_nop => Some(gen_nop),
|
||||
YARVINSN_pop => Some(gen_pop),
|
||||
YARVINSN_dup => Some(gen_dup),
|
||||
YARVINSN_dupn => Some(gen_dupn),
|
||||
YARVINSN_swap => Some(gen_swap),
|
||||
YARVINSN_putnil => Some(gen_putnil),
|
||||
YARVINSN_putobject => Some(gen_putobject),
|
||||
YARVINSN_putobject_INT2FIX_0_ => Some(gen_putobject_int2fix),
|
||||
YARVINSN_putobject_INT2FIX_1_ => Some(gen_putobject_int2fix),
|
||||
YARVINSN_putself => Some(gen_putself),
|
||||
YARVINSN_putspecialobject => Some(gen_putspecialobject),
|
||||
YARVINSN_setn => Some(gen_setn),
|
||||
YARVINSN_topn => Some(gen_topn),
|
||||
YARVINSN_adjuststack => Some(gen_adjuststack),
|
||||
YARVINSN_getlocal => Some(gen_getlocal),
|
||||
YARVINSN_getlocal_WC_0 => Some(gen_getlocal_wc0),
|
||||
YARVINSN_getlocal_WC_1 => Some(gen_getlocal_wc1),
|
||||
YARVINSN_setlocal => Some(gen_setlocal),
|
||||
YARVINSN_setlocal_WC_0 => Some(gen_setlocal_wc0),
|
||||
YARVINSN_setlocal_WC_1 => Some(gen_setlocal_wc1),
|
||||
YARVINSN_opt_plus => Some(gen_opt_plus),
|
||||
YARVINSN_opt_minus => Some(gen_opt_minus),
|
||||
YARVINSN_opt_and => Some(gen_opt_and),
|
||||
YARVINSN_opt_or => Some(gen_opt_or),
|
||||
YARVINSN_newhash => Some(gen_newhash),
|
||||
YARVINSN_duphash => Some(gen_duphash),
|
||||
YARVINSN_newarray => Some(gen_newarray),
|
||||
YARVINSN_duparray => Some(gen_duparray),
|
||||
YARVINSN_checktype => Some(gen_checktype),
|
||||
YARVINSN_opt_lt => Some(gen_opt_lt),
|
||||
YARVINSN_opt_le => Some(gen_opt_le),
|
||||
YARVINSN_opt_gt => Some(gen_opt_gt),
|
||||
YARVINSN_opt_ge => Some(gen_opt_ge),
|
||||
YARVINSN_opt_mod => Some(gen_opt_mod),
|
||||
YARVINSN_opt_str_freeze => Some(gen_opt_str_freeze),
|
||||
YARVINSN_opt_str_uminus => Some(gen_opt_str_uminus),
|
||||
YARVINSN_splatarray => Some(gen_splatarray),
|
||||
YARVINSN_newrange => Some(gen_newrange),
|
||||
YARVINSN_putstring => Some(gen_putstring),
|
||||
YARVINSN_expandarray => Some(gen_expandarray),
|
||||
YARVINSN_defined => Some(gen_defined),
|
||||
YARVINSN_checkkeyword => Some(gen_checkkeyword),
|
||||
YARVINSN_concatstrings => Some(gen_concatstrings),
|
||||
YARVINSN_getinstancevariable => Some(gen_getinstancevariable),
|
||||
YARVINSN_setinstancevariable => Some(gen_setinstancevariable),
|
||||
|
||||
OP_OPT_EQ => Some(gen_opt_eq),
|
||||
OP_OPT_NEQ => Some(gen_opt_neq),
|
||||
OP_OPT_AREF => Some(gen_opt_aref),
|
||||
OP_OPT_ASET => Some(gen_opt_aset),
|
||||
OP_OPT_MULT => Some(gen_opt_mult),
|
||||
OP_OPT_DIV => Some(gen_opt_div),
|
||||
OP_OPT_LTLT => Some(gen_opt_ltlt),
|
||||
OP_OPT_NIL_P => Some(gen_opt_nil_p),
|
||||
OP_OPT_EMPTY_P => Some(gen_opt_empty_p),
|
||||
OP_OPT_SUCC => Some(gen_opt_succ),
|
||||
OP_OPT_NOT => Some(gen_opt_not),
|
||||
OP_OPT_SIZE => Some(gen_opt_size),
|
||||
OP_OPT_LENGTH => Some(gen_opt_length),
|
||||
OP_OPT_REGEXPMATCH2 => Some(gen_opt_regexpmatch2),
|
||||
OP_OPT_GETINLINECACHE => Some(gen_opt_getinlinecache),
|
||||
OP_INVOKEBUILTIN => Some(gen_invokebuiltin),
|
||||
OP_OPT_INVOKEBUILTIN_DELEGATE => Some(gen_opt_invokebuiltin_delegate),
|
||||
OP_OPT_INVOKEBUILTIN_DELEGATE_LEAVE => Some(gen_opt_invokebuiltin_delegate),
|
||||
OP_OPT_CASE_DISPATCH => Some(gen_opt_case_dispatch),
|
||||
OP_BRANCHIF => Some(gen_branchif),
|
||||
OP_BRANCHUNLESS => Some(gen_branchunless),
|
||||
OP_BRANCHNIL => Some(gen_branchnil),
|
||||
OP_JUMP => Some(gen_jump),
|
||||
YARVINSN_opt_eq => Some(gen_opt_eq),
|
||||
YARVINSN_opt_neq => Some(gen_opt_neq),
|
||||
YARVINSN_opt_aref => Some(gen_opt_aref),
|
||||
YARVINSN_opt_aset => Some(gen_opt_aset),
|
||||
YARVINSN_opt_mult => Some(gen_opt_mult),
|
||||
YARVINSN_opt_div => Some(gen_opt_div),
|
||||
YARVINSN_opt_ltlt => Some(gen_opt_ltlt),
|
||||
YARVINSN_opt_nil_p => Some(gen_opt_nil_p),
|
||||
YARVINSN_opt_empty_p => Some(gen_opt_empty_p),
|
||||
YARVINSN_opt_succ => Some(gen_opt_succ),
|
||||
YARVINSN_opt_not => Some(gen_opt_not),
|
||||
YARVINSN_opt_size => Some(gen_opt_size),
|
||||
YARVINSN_opt_length => Some(gen_opt_length),
|
||||
YARVINSN_opt_regexpmatch2 => Some(gen_opt_regexpmatch2),
|
||||
YARVINSN_opt_getinlinecache => Some(gen_opt_getinlinecache),
|
||||
YARVINSN_invokebuiltin => Some(gen_invokebuiltin),
|
||||
YARVINSN_opt_invokebuiltin_delegate => Some(gen_opt_invokebuiltin_delegate),
|
||||
YARVINSN_opt_invokebuiltin_delegate_leave => Some(gen_opt_invokebuiltin_delegate),
|
||||
YARVINSN_opt_case_dispatch => Some(gen_opt_case_dispatch),
|
||||
YARVINSN_branchif => Some(gen_branchif),
|
||||
YARVINSN_branchunless => Some(gen_branchunless),
|
||||
YARVINSN_branchnil => Some(gen_branchnil),
|
||||
YARVINSN_jump => Some(gen_jump),
|
||||
|
||||
OP_GETBLOCKPARAMPROXY => Some(gen_getblockparamproxy),
|
||||
OP_GETBLOCKPARAM => Some(gen_getblockparam),
|
||||
OP_OPT_SEND_WITHOUT_BLOCK => Some(gen_opt_send_without_block),
|
||||
OP_SEND => Some(gen_send),
|
||||
OP_INVOKESUPER => Some(gen_invokesuper),
|
||||
OP_LEAVE => Some(gen_leave),
|
||||
YARVINSN_getblockparamproxy => Some(gen_getblockparamproxy),
|
||||
YARVINSN_getblockparam => Some(gen_getblockparam),
|
||||
YARVINSN_opt_send_without_block => Some(gen_opt_send_without_block),
|
||||
YARVINSN_send => Some(gen_send),
|
||||
YARVINSN_invokesuper => Some(gen_invokesuper),
|
||||
YARVINSN_leave => Some(gen_leave),
|
||||
|
||||
OP_GETGLOBAL => Some(gen_getglobal),
|
||||
OP_SETGLOBAL => Some(gen_setglobal),
|
||||
OP_ANYTOSTRING => Some(gen_anytostring),
|
||||
OP_OBJTOSTRING => Some(gen_objtostring),
|
||||
OP_INTERN => Some(gen_intern),
|
||||
OP_TOREGEXP => Some(gen_toregexp),
|
||||
OP_GETSPECIAL => Some(gen_getspecial),
|
||||
OP_GETCLASSVARIABLE => Some(gen_getclassvariable),
|
||||
OP_SETCLASSVARIABLE => Some(gen_setclassvariable),
|
||||
YARVINSN_getglobal => Some(gen_getglobal),
|
||||
YARVINSN_setglobal => Some(gen_setglobal),
|
||||
YARVINSN_anytostring => Some(gen_anytostring),
|
||||
YARVINSN_objtostring => Some(gen_objtostring),
|
||||
YARVINSN_intern => Some(gen_intern),
|
||||
YARVINSN_toregexp => Some(gen_toregexp),
|
||||
YARVINSN_getspecial => Some(gen_getspecial),
|
||||
YARVINSN_getclassvariable => Some(gen_getclassvariable),
|
||||
YARVINSN_setclassvariable => Some(gen_setclassvariable),
|
||||
|
||||
// Unimplemented opcode, YJIT won't generate code for this yet
|
||||
_ => None,
|
||||
|
@ -6311,7 +6315,7 @@ mod tests {
|
|||
#[test]
|
||||
fn test_int2fix() {
|
||||
let (mut jit, mut context, mut cb, mut ocb) = setup_codegen();
|
||||
jit.opcode = OP_PUTOBJECT_INT2FIX_0_;
|
||||
jit.opcode = YARVINSN_putobject_INT2FIX_0_.as_usize();
|
||||
let status = gen_putobject_int2fix(&mut jit, &mut context, &mut cb, &mut ocb);
|
||||
|
||||
let (_, tmp_type_top) = context.get_opnd_mapping(StackOpnd(0));
|
||||
|
|
|
@ -815,113 +815,3 @@ mod manual_defs {
|
|||
pub const RUBY_OFFSET_ICE_VALUE: i32 = 8;
|
||||
}
|
||||
pub use manual_defs::*;
|
||||
|
||||
#[allow(unused)]
|
||||
mod vm_opcodes {
|
||||
// TODO: need to dynamically autogenerate constants for all the YARV opcodes from insns.def
|
||||
// TODO: typing of these adds unnecessary casting
|
||||
pub const OP_NOP: usize = 0;
|
||||
pub const OP_GETLOCAL: usize = 1;
|
||||
pub const OP_SETLOCAL: usize = 2;
|
||||
pub const OP_GETBLOCKPARAM: usize = 3;
|
||||
pub const OP_SETBLOCKPARAM: usize = 4;
|
||||
pub const OP_GETBLOCKPARAMPROXY: usize = 5;
|
||||
pub const OP_GETSPECIAL: usize = 6;
|
||||
pub const OP_SETSPECIAL: usize = 7;
|
||||
pub const OP_GETINSTANCEVARIABLE: usize = 8;
|
||||
pub const OP_SETINSTANCEVARIABLE: usize = 9;
|
||||
pub const OP_GETCLASSVARIABLE: usize = 10;
|
||||
pub const OP_SETCLASSVARIABLE: usize = 11;
|
||||
pub const OP_GETCONSTANT: usize = 12;
|
||||
pub const OP_SETCONSTANT: usize = 13;
|
||||
pub const OP_GETGLOBAL: usize = 14;
|
||||
pub const OP_SETGLOBAL: usize = 15;
|
||||
pub const OP_PUTNIL: usize = 16;
|
||||
pub const OP_PUTSELF: usize = 17;
|
||||
pub const OP_PUTOBJECT: usize = 18;
|
||||
pub const OP_PUTSPECIALOBJECT: usize = 19;
|
||||
pub const OP_PUTSTRING: usize = 20;
|
||||
pub const OP_CONCATSTRINGS: usize = 21;
|
||||
pub const OP_ANYTOSTRING: usize = 22;
|
||||
pub const OP_TOREGEXP: usize = 23;
|
||||
pub const OP_INTERN: usize = 24;
|
||||
pub const OP_NEWARRAY: usize = 25;
|
||||
pub const OP_NEWARRAYKWSPLAT: usize = 26;
|
||||
pub const OP_DUPARRAY: usize = 27;
|
||||
pub const OP_DUPHASH: usize = 28;
|
||||
pub const OP_EXPANDARRAY: usize = 29;
|
||||
pub const OP_CONCATARRAY: usize = 30;
|
||||
pub const OP_SPLATARRAY: usize = 31;
|
||||
pub const OP_NEWHASH: usize = 32;
|
||||
pub const OP_NEWRANGE: usize = 33;
|
||||
pub const OP_POP: usize = 34;
|
||||
pub const OP_DUP: usize = 35;
|
||||
pub const OP_DUPN: usize = 36;
|
||||
pub const OP_SWAP: usize = 37;
|
||||
pub const OP_TOPN: usize = 38;
|
||||
pub const OP_SETN: usize = 39;
|
||||
pub const OP_ADJUSTSTACK: usize = 40;
|
||||
pub const OP_DEFINED: usize = 41;
|
||||
pub const OP_CHECKMATCH: usize = 42;
|
||||
pub const OP_CHECKKEYWORD: usize = 43;
|
||||
pub const OP_CHECKTYPE: usize = 44;
|
||||
pub const OP_DEFINECLASS: usize = 45;
|
||||
pub const OP_DEFINEMETHOD: usize = 46;
|
||||
pub const OP_DEFINESMETHOD: usize = 47;
|
||||
pub const OP_SEND: usize = 48;
|
||||
pub const OP_OPT_SEND_WITHOUT_BLOCK: usize = 49;
|
||||
pub const OP_OBJTOSTRING: usize = 50;
|
||||
pub const OP_OPT_STR_FREEZE: usize = 51;
|
||||
pub const OP_OPT_NIL_P: usize = 52;
|
||||
pub const OP_OPT_STR_UMINUS: usize = 53;
|
||||
pub const OP_OPT_NEWARRAY_MAX: usize = 54;
|
||||
pub const OP_OPT_NEWARRAY_MIN: usize = 55;
|
||||
pub const OP_INVOKESUPER: usize = 56;
|
||||
pub const OP_INVOKEBLOCK: usize = 57;
|
||||
pub const OP_LEAVE: usize = 58;
|
||||
pub const OP_THROW: usize = 59;
|
||||
pub const OP_JUMP: usize = 60;
|
||||
pub const OP_BRANCHIF: usize = 61;
|
||||
pub const OP_BRANCHUNLESS: usize = 62;
|
||||
pub const OP_BRANCHNIL: usize = 63;
|
||||
pub const OP_OPT_GETINLINECACHE: usize = 64;
|
||||
pub const OP_OPT_SETINLINECACHE: usize = 65;
|
||||
pub const OP_ONCE: usize = 66;
|
||||
pub const OP_OPT_CASE_DISPATCH: usize = 67;
|
||||
pub const OP_OPT_PLUS: usize = 68;
|
||||
pub const OP_OPT_MINUS: usize = 69;
|
||||
pub const OP_OPT_MULT: usize = 70;
|
||||
pub const OP_OPT_DIV: usize = 71;
|
||||
pub const OP_OPT_MOD: usize = 72;
|
||||
pub const OP_OPT_EQ: usize = 73;
|
||||
pub const OP_OPT_NEQ: usize = 74;
|
||||
pub const OP_OPT_LT: usize = 75;
|
||||
pub const OP_OPT_LE: usize = 76;
|
||||
pub const OP_OPT_GT: usize = 77;
|
||||
pub const OP_OPT_GE: usize = 78;
|
||||
pub const OP_OPT_LTLT: usize = 79;
|
||||
pub const OP_OPT_AND: usize = 80;
|
||||
pub const OP_OPT_OR: usize = 81;
|
||||
pub const OP_OPT_AREF: usize = 82;
|
||||
pub const OP_OPT_ASET: usize = 83;
|
||||
pub const OP_OPT_ASET_WITH: usize = 84;
|
||||
pub const OP_OPT_AREF_WITH: usize = 85;
|
||||
pub const OP_OPT_LENGTH: usize = 86;
|
||||
pub const OP_OPT_SIZE: usize = 87;
|
||||
pub const OP_OPT_EMPTY_P: usize = 88;
|
||||
pub const OP_OPT_SUCC: usize = 89;
|
||||
pub const OP_OPT_NOT: usize = 90;
|
||||
pub const OP_OPT_REGEXPMATCH2: usize = 91;
|
||||
pub const OP_INVOKEBUILTIN: usize = 92;
|
||||
pub const OP_OPT_INVOKEBUILTIN_DELEGATE: usize = 93;
|
||||
pub const OP_OPT_INVOKEBUILTIN_DELEGATE_LEAVE: usize = 94;
|
||||
pub const OP_GETLOCAL_WC_0: usize = 95;
|
||||
pub const OP_GETLOCAL_WC_1: usize = 96;
|
||||
pub const OP_SETLOCAL_WC_0: usize = 97;
|
||||
pub const OP_SETLOCAL_WC_1: usize = 98;
|
||||
pub const OP_PUTOBJECT_INT2FIX_0_: usize = 99;
|
||||
pub const OP_PUTOBJECT_INT2FIX_1_: usize = 100;
|
||||
|
||||
pub const VM_INSTRUCTION_SIZE: usize = 202;
|
||||
}
|
||||
pub use vm_opcodes::*;
|
||||
|
|
|
@ -680,6 +680,210 @@ pub struct rb_builtin_function {
|
|||
),
|
||||
>,
|
||||
}
|
||||
pub const YARVINSN_nop: ruby_vminsn_type = 0;
|
||||
pub const YARVINSN_getlocal: ruby_vminsn_type = 1;
|
||||
pub const YARVINSN_setlocal: ruby_vminsn_type = 2;
|
||||
pub const YARVINSN_getblockparam: ruby_vminsn_type = 3;
|
||||
pub const YARVINSN_setblockparam: ruby_vminsn_type = 4;
|
||||
pub const YARVINSN_getblockparamproxy: ruby_vminsn_type = 5;
|
||||
pub const YARVINSN_getspecial: ruby_vminsn_type = 6;
|
||||
pub const YARVINSN_setspecial: ruby_vminsn_type = 7;
|
||||
pub const YARVINSN_getinstancevariable: ruby_vminsn_type = 8;
|
||||
pub const YARVINSN_setinstancevariable: ruby_vminsn_type = 9;
|
||||
pub const YARVINSN_getclassvariable: ruby_vminsn_type = 10;
|
||||
pub const YARVINSN_setclassvariable: ruby_vminsn_type = 11;
|
||||
pub const YARVINSN_getconstant: ruby_vminsn_type = 12;
|
||||
pub const YARVINSN_setconstant: ruby_vminsn_type = 13;
|
||||
pub const YARVINSN_getglobal: ruby_vminsn_type = 14;
|
||||
pub const YARVINSN_setglobal: ruby_vminsn_type = 15;
|
||||
pub const YARVINSN_putnil: ruby_vminsn_type = 16;
|
||||
pub const YARVINSN_putself: ruby_vminsn_type = 17;
|
||||
pub const YARVINSN_putobject: ruby_vminsn_type = 18;
|
||||
pub const YARVINSN_putspecialobject: ruby_vminsn_type = 19;
|
||||
pub const YARVINSN_putstring: ruby_vminsn_type = 20;
|
||||
pub const YARVINSN_concatstrings: ruby_vminsn_type = 21;
|
||||
pub const YARVINSN_anytostring: ruby_vminsn_type = 22;
|
||||
pub const YARVINSN_toregexp: ruby_vminsn_type = 23;
|
||||
pub const YARVINSN_intern: ruby_vminsn_type = 24;
|
||||
pub const YARVINSN_newarray: ruby_vminsn_type = 25;
|
||||
pub const YARVINSN_newarraykwsplat: ruby_vminsn_type = 26;
|
||||
pub const YARVINSN_duparray: ruby_vminsn_type = 27;
|
||||
pub const YARVINSN_duphash: ruby_vminsn_type = 28;
|
||||
pub const YARVINSN_expandarray: ruby_vminsn_type = 29;
|
||||
pub const YARVINSN_concatarray: ruby_vminsn_type = 30;
|
||||
pub const YARVINSN_splatarray: ruby_vminsn_type = 31;
|
||||
pub const YARVINSN_newhash: ruby_vminsn_type = 32;
|
||||
pub const YARVINSN_newrange: ruby_vminsn_type = 33;
|
||||
pub const YARVINSN_pop: ruby_vminsn_type = 34;
|
||||
pub const YARVINSN_dup: ruby_vminsn_type = 35;
|
||||
pub const YARVINSN_dupn: ruby_vminsn_type = 36;
|
||||
pub const YARVINSN_swap: ruby_vminsn_type = 37;
|
||||
pub const YARVINSN_topn: ruby_vminsn_type = 38;
|
||||
pub const YARVINSN_setn: ruby_vminsn_type = 39;
|
||||
pub const YARVINSN_adjuststack: ruby_vminsn_type = 40;
|
||||
pub const YARVINSN_defined: ruby_vminsn_type = 41;
|
||||
pub const YARVINSN_checkmatch: ruby_vminsn_type = 42;
|
||||
pub const YARVINSN_checkkeyword: ruby_vminsn_type = 43;
|
||||
pub const YARVINSN_checktype: ruby_vminsn_type = 44;
|
||||
pub const YARVINSN_defineclass: ruby_vminsn_type = 45;
|
||||
pub const YARVINSN_definemethod: ruby_vminsn_type = 46;
|
||||
pub const YARVINSN_definesmethod: ruby_vminsn_type = 47;
|
||||
pub const YARVINSN_send: ruby_vminsn_type = 48;
|
||||
pub const YARVINSN_opt_send_without_block: ruby_vminsn_type = 49;
|
||||
pub const YARVINSN_objtostring: ruby_vminsn_type = 50;
|
||||
pub const YARVINSN_opt_str_freeze: ruby_vminsn_type = 51;
|
||||
pub const YARVINSN_opt_nil_p: ruby_vminsn_type = 52;
|
||||
pub const YARVINSN_opt_str_uminus: ruby_vminsn_type = 53;
|
||||
pub const YARVINSN_opt_newarray_max: ruby_vminsn_type = 54;
|
||||
pub const YARVINSN_opt_newarray_min: ruby_vminsn_type = 55;
|
||||
pub const YARVINSN_invokesuper: ruby_vminsn_type = 56;
|
||||
pub const YARVINSN_invokeblock: ruby_vminsn_type = 57;
|
||||
pub const YARVINSN_leave: ruby_vminsn_type = 58;
|
||||
pub const YARVINSN_throw: ruby_vminsn_type = 59;
|
||||
pub const YARVINSN_jump: ruby_vminsn_type = 60;
|
||||
pub const YARVINSN_branchif: ruby_vminsn_type = 61;
|
||||
pub const YARVINSN_branchunless: ruby_vminsn_type = 62;
|
||||
pub const YARVINSN_branchnil: ruby_vminsn_type = 63;
|
||||
pub const YARVINSN_opt_getinlinecache: ruby_vminsn_type = 64;
|
||||
pub const YARVINSN_opt_setinlinecache: ruby_vminsn_type = 65;
|
||||
pub const YARVINSN_once: ruby_vminsn_type = 66;
|
||||
pub const YARVINSN_opt_case_dispatch: ruby_vminsn_type = 67;
|
||||
pub const YARVINSN_opt_plus: ruby_vminsn_type = 68;
|
||||
pub const YARVINSN_opt_minus: ruby_vminsn_type = 69;
|
||||
pub const YARVINSN_opt_mult: ruby_vminsn_type = 70;
|
||||
pub const YARVINSN_opt_div: ruby_vminsn_type = 71;
|
||||
pub const YARVINSN_opt_mod: ruby_vminsn_type = 72;
|
||||
pub const YARVINSN_opt_eq: ruby_vminsn_type = 73;
|
||||
pub const YARVINSN_opt_neq: ruby_vminsn_type = 74;
|
||||
pub const YARVINSN_opt_lt: ruby_vminsn_type = 75;
|
||||
pub const YARVINSN_opt_le: ruby_vminsn_type = 76;
|
||||
pub const YARVINSN_opt_gt: ruby_vminsn_type = 77;
|
||||
pub const YARVINSN_opt_ge: ruby_vminsn_type = 78;
|
||||
pub const YARVINSN_opt_ltlt: ruby_vminsn_type = 79;
|
||||
pub const YARVINSN_opt_and: ruby_vminsn_type = 80;
|
||||
pub const YARVINSN_opt_or: ruby_vminsn_type = 81;
|
||||
pub const YARVINSN_opt_aref: ruby_vminsn_type = 82;
|
||||
pub const YARVINSN_opt_aset: ruby_vminsn_type = 83;
|
||||
pub const YARVINSN_opt_aset_with: ruby_vminsn_type = 84;
|
||||
pub const YARVINSN_opt_aref_with: ruby_vminsn_type = 85;
|
||||
pub const YARVINSN_opt_length: ruby_vminsn_type = 86;
|
||||
pub const YARVINSN_opt_size: ruby_vminsn_type = 87;
|
||||
pub const YARVINSN_opt_empty_p: ruby_vminsn_type = 88;
|
||||
pub const YARVINSN_opt_succ: ruby_vminsn_type = 89;
|
||||
pub const YARVINSN_opt_not: ruby_vminsn_type = 90;
|
||||
pub const YARVINSN_opt_regexpmatch2: ruby_vminsn_type = 91;
|
||||
pub const YARVINSN_invokebuiltin: ruby_vminsn_type = 92;
|
||||
pub const YARVINSN_opt_invokebuiltin_delegate: ruby_vminsn_type = 93;
|
||||
pub const YARVINSN_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 94;
|
||||
pub const YARVINSN_getlocal_WC_0: ruby_vminsn_type = 95;
|
||||
pub const YARVINSN_getlocal_WC_1: ruby_vminsn_type = 96;
|
||||
pub const YARVINSN_setlocal_WC_0: ruby_vminsn_type = 97;
|
||||
pub const YARVINSN_setlocal_WC_1: ruby_vminsn_type = 98;
|
||||
pub const YARVINSN_putobject_INT2FIX_0_: ruby_vminsn_type = 99;
|
||||
pub const YARVINSN_putobject_INT2FIX_1_: ruby_vminsn_type = 100;
|
||||
pub const YARVINSN_trace_nop: ruby_vminsn_type = 101;
|
||||
pub const YARVINSN_trace_getlocal: ruby_vminsn_type = 102;
|
||||
pub const YARVINSN_trace_setlocal: ruby_vminsn_type = 103;
|
||||
pub const YARVINSN_trace_getblockparam: ruby_vminsn_type = 104;
|
||||
pub const YARVINSN_trace_setblockparam: ruby_vminsn_type = 105;
|
||||
pub const YARVINSN_trace_getblockparamproxy: ruby_vminsn_type = 106;
|
||||
pub const YARVINSN_trace_getspecial: ruby_vminsn_type = 107;
|
||||
pub const YARVINSN_trace_setspecial: ruby_vminsn_type = 108;
|
||||
pub const YARVINSN_trace_getinstancevariable: ruby_vminsn_type = 109;
|
||||
pub const YARVINSN_trace_setinstancevariable: ruby_vminsn_type = 110;
|
||||
pub const YARVINSN_trace_getclassvariable: ruby_vminsn_type = 111;
|
||||
pub const YARVINSN_trace_setclassvariable: ruby_vminsn_type = 112;
|
||||
pub const YARVINSN_trace_getconstant: ruby_vminsn_type = 113;
|
||||
pub const YARVINSN_trace_setconstant: ruby_vminsn_type = 114;
|
||||
pub const YARVINSN_trace_getglobal: ruby_vminsn_type = 115;
|
||||
pub const YARVINSN_trace_setglobal: ruby_vminsn_type = 116;
|
||||
pub const YARVINSN_trace_putnil: ruby_vminsn_type = 117;
|
||||
pub const YARVINSN_trace_putself: ruby_vminsn_type = 118;
|
||||
pub const YARVINSN_trace_putobject: ruby_vminsn_type = 119;
|
||||
pub const YARVINSN_trace_putspecialobject: ruby_vminsn_type = 120;
|
||||
pub const YARVINSN_trace_putstring: ruby_vminsn_type = 121;
|
||||
pub const YARVINSN_trace_concatstrings: ruby_vminsn_type = 122;
|
||||
pub const YARVINSN_trace_anytostring: ruby_vminsn_type = 123;
|
||||
pub const YARVINSN_trace_toregexp: ruby_vminsn_type = 124;
|
||||
pub const YARVINSN_trace_intern: ruby_vminsn_type = 125;
|
||||
pub const YARVINSN_trace_newarray: ruby_vminsn_type = 126;
|
||||
pub const YARVINSN_trace_newarraykwsplat: ruby_vminsn_type = 127;
|
||||
pub const YARVINSN_trace_duparray: ruby_vminsn_type = 128;
|
||||
pub const YARVINSN_trace_duphash: ruby_vminsn_type = 129;
|
||||
pub const YARVINSN_trace_expandarray: ruby_vminsn_type = 130;
|
||||
pub const YARVINSN_trace_concatarray: ruby_vminsn_type = 131;
|
||||
pub const YARVINSN_trace_splatarray: ruby_vminsn_type = 132;
|
||||
pub const YARVINSN_trace_newhash: ruby_vminsn_type = 133;
|
||||
pub const YARVINSN_trace_newrange: ruby_vminsn_type = 134;
|
||||
pub const YARVINSN_trace_pop: ruby_vminsn_type = 135;
|
||||
pub const YARVINSN_trace_dup: ruby_vminsn_type = 136;
|
||||
pub const YARVINSN_trace_dupn: ruby_vminsn_type = 137;
|
||||
pub const YARVINSN_trace_swap: ruby_vminsn_type = 138;
|
||||
pub const YARVINSN_trace_topn: ruby_vminsn_type = 139;
|
||||
pub const YARVINSN_trace_setn: ruby_vminsn_type = 140;
|
||||
pub const YARVINSN_trace_adjuststack: ruby_vminsn_type = 141;
|
||||
pub const YARVINSN_trace_defined: ruby_vminsn_type = 142;
|
||||
pub const YARVINSN_trace_checkmatch: ruby_vminsn_type = 143;
|
||||
pub const YARVINSN_trace_checkkeyword: ruby_vminsn_type = 144;
|
||||
pub const YARVINSN_trace_checktype: ruby_vminsn_type = 145;
|
||||
pub const YARVINSN_trace_defineclass: ruby_vminsn_type = 146;
|
||||
pub const YARVINSN_trace_definemethod: ruby_vminsn_type = 147;
|
||||
pub const YARVINSN_trace_definesmethod: ruby_vminsn_type = 148;
|
||||
pub const YARVINSN_trace_send: ruby_vminsn_type = 149;
|
||||
pub const YARVINSN_trace_opt_send_without_block: ruby_vminsn_type = 150;
|
||||
pub const YARVINSN_trace_objtostring: ruby_vminsn_type = 151;
|
||||
pub const YARVINSN_trace_opt_str_freeze: ruby_vminsn_type = 152;
|
||||
pub const YARVINSN_trace_opt_nil_p: ruby_vminsn_type = 153;
|
||||
pub const YARVINSN_trace_opt_str_uminus: ruby_vminsn_type = 154;
|
||||
pub const YARVINSN_trace_opt_newarray_max: ruby_vminsn_type = 155;
|
||||
pub const YARVINSN_trace_opt_newarray_min: ruby_vminsn_type = 156;
|
||||
pub const YARVINSN_trace_invokesuper: ruby_vminsn_type = 157;
|
||||
pub const YARVINSN_trace_invokeblock: ruby_vminsn_type = 158;
|
||||
pub const YARVINSN_trace_leave: ruby_vminsn_type = 159;
|
||||
pub const YARVINSN_trace_throw: ruby_vminsn_type = 160;
|
||||
pub const YARVINSN_trace_jump: ruby_vminsn_type = 161;
|
||||
pub const YARVINSN_trace_branchif: ruby_vminsn_type = 162;
|
||||
pub const YARVINSN_trace_branchunless: ruby_vminsn_type = 163;
|
||||
pub const YARVINSN_trace_branchnil: ruby_vminsn_type = 164;
|
||||
pub const YARVINSN_trace_opt_getinlinecache: ruby_vminsn_type = 165;
|
||||
pub const YARVINSN_trace_opt_setinlinecache: ruby_vminsn_type = 166;
|
||||
pub const YARVINSN_trace_once: ruby_vminsn_type = 167;
|
||||
pub const YARVINSN_trace_opt_case_dispatch: ruby_vminsn_type = 168;
|
||||
pub const YARVINSN_trace_opt_plus: ruby_vminsn_type = 169;
|
||||
pub const YARVINSN_trace_opt_minus: ruby_vminsn_type = 170;
|
||||
pub const YARVINSN_trace_opt_mult: ruby_vminsn_type = 171;
|
||||
pub const YARVINSN_trace_opt_div: ruby_vminsn_type = 172;
|
||||
pub const YARVINSN_trace_opt_mod: ruby_vminsn_type = 173;
|
||||
pub const YARVINSN_trace_opt_eq: ruby_vminsn_type = 174;
|
||||
pub const YARVINSN_trace_opt_neq: ruby_vminsn_type = 175;
|
||||
pub const YARVINSN_trace_opt_lt: ruby_vminsn_type = 176;
|
||||
pub const YARVINSN_trace_opt_le: ruby_vminsn_type = 177;
|
||||
pub const YARVINSN_trace_opt_gt: ruby_vminsn_type = 178;
|
||||
pub const YARVINSN_trace_opt_ge: ruby_vminsn_type = 179;
|
||||
pub const YARVINSN_trace_opt_ltlt: ruby_vminsn_type = 180;
|
||||
pub const YARVINSN_trace_opt_and: ruby_vminsn_type = 181;
|
||||
pub const YARVINSN_trace_opt_or: ruby_vminsn_type = 182;
|
||||
pub const YARVINSN_trace_opt_aref: ruby_vminsn_type = 183;
|
||||
pub const YARVINSN_trace_opt_aset: ruby_vminsn_type = 184;
|
||||
pub const YARVINSN_trace_opt_aset_with: ruby_vminsn_type = 185;
|
||||
pub const YARVINSN_trace_opt_aref_with: ruby_vminsn_type = 186;
|
||||
pub const YARVINSN_trace_opt_length: ruby_vminsn_type = 187;
|
||||
pub const YARVINSN_trace_opt_size: ruby_vminsn_type = 188;
|
||||
pub const YARVINSN_trace_opt_empty_p: ruby_vminsn_type = 189;
|
||||
pub const YARVINSN_trace_opt_succ: ruby_vminsn_type = 190;
|
||||
pub const YARVINSN_trace_opt_not: ruby_vminsn_type = 191;
|
||||
pub const YARVINSN_trace_opt_regexpmatch2: ruby_vminsn_type = 192;
|
||||
pub const YARVINSN_trace_invokebuiltin: ruby_vminsn_type = 193;
|
||||
pub const YARVINSN_trace_opt_invokebuiltin_delegate: ruby_vminsn_type = 194;
|
||||
pub const YARVINSN_trace_opt_invokebuiltin_delegate_leave: ruby_vminsn_type = 195;
|
||||
pub const YARVINSN_trace_getlocal_WC_0: ruby_vminsn_type = 196;
|
||||
pub const YARVINSN_trace_getlocal_WC_1: ruby_vminsn_type = 197;
|
||||
pub const YARVINSN_trace_setlocal_WC_0: ruby_vminsn_type = 198;
|
||||
pub const YARVINSN_trace_setlocal_WC_1: ruby_vminsn_type = 199;
|
||||
pub const YARVINSN_trace_putobject_INT2FIX_0_: ruby_vminsn_type = 200;
|
||||
pub const YARVINSN_trace_putobject_INT2FIX_1_: ruby_vminsn_type = 201;
|
||||
pub const VM_INSTRUCTION_SIZE: ruby_vminsn_type = 202;
|
||||
pub type ruby_vminsn_type = u32;
|
||||
extern "C" {
|
||||
pub fn rb_vm_insn_addr2opcode(addr: *const ::std::os::raw::c_void) -> ::std::os::raw::c_int;
|
||||
}
|
||||
|
|
|
@ -182,11 +182,11 @@ pub fn assume_stable_constant_names(jit: &mut JITState, ocb: &mut OutlinedCb) {
|
|||
index: u64,
|
||||
data: *mut c_void,
|
||||
) -> bool {
|
||||
if insn.as_usize() == OP_OPT_SETINLINECACHE {
|
||||
if insn.as_u32() == YARVINSN_opt_setinlinecache {
|
||||
return false;
|
||||
}
|
||||
|
||||
if insn.as_usize() == OP_GETCONSTANT {
|
||||
if insn.as_u32() == YARVINSN_getconstant {
|
||||
let jit = &mut *(data as *mut JITState);
|
||||
|
||||
// The first operand to GETCONSTANT is always the ID associated with
|
||||
|
@ -474,7 +474,7 @@ pub extern "C" fn rb_yjit_constant_ic_update(iseq: *const rb_iseq_t, ic: IC) {
|
|||
let translated_opcode: VALUE = opcode_pc.read();
|
||||
rb_vm_insn_decode(translated_opcode)
|
||||
},
|
||||
OP_OPT_GETINLINECACHE.try_into().unwrap()
|
||||
YARVINSN_opt_getinlinecache.try_into().unwrap()
|
||||
);
|
||||
|
||||
// Find the matching opt_getinlinecache and invalidate all the blocks there
|
||||
|
|
|
@ -9,7 +9,8 @@ use crate::options::*;
|
|||
use crate::yjit::yjit_enabled_p;
|
||||
|
||||
// YJIT exit counts for each instruction type
|
||||
static mut EXIT_OP_COUNT: [u64; VM_INSTRUCTION_SIZE] = [0; VM_INSTRUCTION_SIZE];
|
||||
const VM_INSTRUCTION_SIZE_USIZE:usize = VM_INSTRUCTION_SIZE as usize;
|
||||
static mut EXIT_OP_COUNT: [u64; VM_INSTRUCTION_SIZE_USIZE] = [0; VM_INSTRUCTION_SIZE_USIZE];
|
||||
|
||||
// Macro to declare the stat counters
|
||||
macro_rules! make_counters {
|
||||
|
@ -218,7 +219,7 @@ fn rb_yjit_gen_stats_dict() -> VALUE {
|
|||
|
||||
// For each entry in exit_op_count, add a stats entry with key "exit_INSTRUCTION_NAME"
|
||||
// and the value is the count of side exits for that instruction.
|
||||
for op_idx in 0..VM_INSTRUCTION_SIZE {
|
||||
for op_idx in 0..VM_INSTRUCTION_SIZE_USIZE {
|
||||
let op_name = insn_name(op_idx);
|
||||
let key_string = "exit_".to_owned() + &op_name;
|
||||
let key = rust_str_to_sym(&key_string);
|
||||
|
@ -234,7 +235,7 @@ fn rb_yjit_gen_stats_dict() -> VALUE {
|
|||
#[no_mangle]
|
||||
pub extern "C" fn rb_yjit_reset_stats_bang(_ec: EcPtr, _ruby_self: VALUE) -> VALUE {
|
||||
unsafe {
|
||||
EXIT_OP_COUNT = [0; VM_INSTRUCTION_SIZE];
|
||||
EXIT_OP_COUNT = [0; VM_INSTRUCTION_SIZE_USIZE];
|
||||
COUNTERS = Counters::default();
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче