From e7642d8095d7f597c322ed26797d649aec7edbd9 Mon Sep 17 00:00:00 2001 From: Jemma Issroff Date: Mon, 5 Dec 2022 16:20:11 -0500 Subject: [PATCH] YJIT: Extract SHAPE_ID_NUM_BITS into a constant (#6863) --- shape.c | 8 +------- yjit/bindgen/src/main.rs | 2 +- yjit/src/codegen.rs | 9 +++------ yjit/src/cruby_bindings.inc.rs | 4 +--- 4 files changed, 6 insertions(+), 17 deletions(-) diff --git a/shape.c b/shape.c index 2a8318398fad69..097458b5ebcd69 100644 --- a/shape.c +++ b/shape.c @@ -300,16 +300,10 @@ rb_shape_set_shape(VALUE obj, rb_shape_t* shape) rb_shape_set_shape_id(obj, rb_shape_id(shape)); } -uint8_t -rb_shape_id_num_bits(void) -{ - return SHAPE_ID_NUM_BITS; -} - int32_t rb_shape_id_offset(void) { - return 8 - rb_shape_id_num_bits() / 8; + return sizeof(uintptr_t) - SHAPE_ID_NUM_BITS / sizeof(uintptr_t); } rb_shape_t * diff --git a/yjit/bindgen/src/main.rs b/yjit/bindgen/src/main.rs index e0d9de000ae96f..99974d65cdf307 100644 --- a/yjit/bindgen/src/main.rs +++ b/yjit/bindgen/src/main.rs @@ -85,12 +85,12 @@ fn main() { // From shape.h .allowlist_function("rb_shape_get_shape_id") .allowlist_function("rb_shape_get_shape_by_id") - .allowlist_function("rb_shape_id_num_bits") .allowlist_function("rb_shape_id_offset") .allowlist_function("rb_shape_get_iv_index") .allowlist_function("rb_shape_get_next") .allowlist_function("rb_shape_id") .allowlist_function("rb_shape_transition_shape_capa") + .allowlist_var("SHAPE_ID_NUM_BITS") // From ruby/internal/intern/object.h .allowlist_function("rb_obj_is_kind_of") diff --git a/yjit/src/codegen.rs b/yjit/src/codegen.rs index f904c7e0e17f7d..97768eb5fec938 100644 --- a/yjit/src/codegen.rs +++ b/yjit/src/codegen.rs @@ -2045,9 +2045,8 @@ fn gen_get_ivar( let embed_test_result = unsafe { FL_TEST_RAW(comptime_receiver, VALUE(ROBJECT_EMBED.as_usize())) != VALUE(0) }; let expected_shape = unsafe { rb_shape_get_shape_id(comptime_receiver) }; - let shape_bit_size = unsafe { rb_shape_id_num_bits() }; // either 16 or 32 depending on RUBY_DEBUG let shape_id_offset = unsafe { rb_shape_id_offset() }; - let shape_opnd = Opnd::mem(shape_bit_size, recv, shape_id_offset); + let shape_opnd = Opnd::mem(SHAPE_ID_NUM_BITS as u8, recv, shape_id_offset); asm.comment("guard shape"); asm.cmp(shape_opnd, Opnd::UImm(expected_shape as u64)); @@ -2269,9 +2268,8 @@ fn gen_setinstancevariable( } let expected_shape = unsafe { rb_shape_get_shape_id(comptime_receiver) }; - let shape_bit_size = unsafe { rb_shape_id_num_bits() }; // either 16 or 32 depending on RUBY_DEBUG let shape_id_offset = unsafe { rb_shape_id_offset() }; - let shape_opnd = Opnd::mem(shape_bit_size, recv, shape_id_offset); + let shape_opnd = Opnd::mem(SHAPE_ID_NUM_BITS as u8, recv, shape_id_offset); asm.comment("guard shape"); asm.cmp(shape_opnd, Opnd::UImm(expected_shape as u64)); @@ -2334,9 +2332,8 @@ fn gen_setinstancevariable( asm.comment("write shape"); - let shape_bit_size = unsafe { rb_shape_id_num_bits() }; // either 16 or 32 depending on RUBY_DEBUG let shape_id_offset = unsafe { rb_shape_id_offset() }; - let shape_opnd = Opnd::mem(shape_bit_size, recv, shape_id_offset); + let shape_opnd = Opnd::mem(SHAPE_ID_NUM_BITS as u8, recv, shape_id_offset); // Store the new shape asm.store(shape_opnd, Opnd::UImm(new_shape_id as u64)); diff --git a/yjit/src/cruby_bindings.inc.rs b/yjit/src/cruby_bindings.inc.rs index 28a195287898f3..ec41de6eb50b04 100644 --- a/yjit/src/cruby_bindings.inc.rs +++ b/yjit/src/cruby_bindings.inc.rs @@ -123,6 +123,7 @@ impl ::std::cmp::PartialEq for __BindgenUnionField { } } impl ::std::cmp::Eq for __BindgenUnionField {} +pub const SHAPE_ID_NUM_BITS: u32 = 32; pub const INTEGER_REDEFINED_OP_FLAG: u32 = 1; pub const FLOAT_REDEFINED_OP_FLAG: u32 = 2; pub const STRING_REDEFINED_OP_FLAG: u32 = 4; @@ -443,9 +444,6 @@ pub struct rb_shape { pub parent_id: shape_id_t, } pub type rb_shape_t = rb_shape; -extern "C" { - pub fn rb_shape_id_num_bits() -> u8; -} extern "C" { pub fn rb_shape_id_offset() -> i32; }