diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2021-10-29 01:58:15 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-10-29 10:57:46 +0900 |
commit | c1228f833c5925c01b2aed1544d9c7fc2421e79b (patch) | |
tree | d9adab9bb139a36fa88407938c68a3d1bb6ec482 /vm_core.h | |
parent | 92ad520ad0372ad64ece6af6bbb6823e629c5d5b (diff) |
vm_core.h: Avoid unaligned access to ic_serial on 32-bit machine
This caused Bus error on 32 bit Solaris
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/5049
Diffstat (limited to 'vm_core.h')
-rw-r--r-- | vm_core.h | 41 |
1 files changed, 37 insertions, 4 deletions
@@ -219,21 +219,54 @@ struct rb_control_frame_struct; /* iseq data type */ typedef struct rb_compile_option_struct rb_compile_option_t; +union ic_serial_entry { + rb_serial_t raw; + VALUE data[2]; +}; + // imemo_constcache struct iseq_inline_constant_cache_entry { VALUE flags; VALUE value; // v0 - rb_serial_t ic_serial; // v1 -#if (SIZEOF_SERIAL_T < 2 * SIZEOF_VOIDP) - VALUE ic_padding; // v2 -#endif + union ic_serial_entry ic_serial; // v1, v2 const rb_cref_t *ic_cref; // v3 }; STATIC_ASSERT(sizeof_iseq_inline_constant_cache_entry, (offsetof(struct iseq_inline_constant_cache_entry, ic_cref) + sizeof(const rb_cref_t *)) <= sizeof(struct RObject)); +#if SIZEOF_SERIAL_T <= SIZEOF_VALUE + +#define GET_IC_SERIAL(ice) (ice)->ic_serial.raw +#define SET_IC_SERIAL(ice, v) (ice)->ic_serial.raw = (v) + +#else + +static inline rb_serial_t +get_ic_serial(const struct iseq_inline_constant_cache_entry *ice) +{ + union ic_serial_entry tmp; + tmp.data[0] = ice->ic_serial.data[0]; + tmp.data[1] = ice->ic_serial.data[1]; + return tmp.raw; +} + +#define GET_IC_SERIAL(ice) get_ic_serial(ice) + +static inline void +set_ic_serial(struct iseq_inline_constant_cache_entry *ice, rb_serial_t v) +{ + union ic_serial_entry tmp; + tmp.raw = v; + ice->ic_serial.data[0] = tmp.data[0]; + ice->ic_serial.data[1] = tmp.data[1]; +} + +#define SET_IC_SERIAL(ice, v) set_ic_serial((ice), (v)) + +#endif + struct iseq_inline_constant_cache { struct iseq_inline_constant_cache_entry *entry; // For YJIT: the index to the opt_getinlinecache instruction in the same iseq. |