Skip to content

Commit 8bbcb75

Browse files
committed
YJIT: Read rb_num_t as usize early
This patch makes sure that we're not accidentally reading rb_num_t instruction arguments as VALUE and accidentally baking them into code and marking them. Some of these are simply moving the cast earlier, but some of these avoid potential problems for flag and ID arguments. Follow-up for 39f7edd.
1 parent c7754a4 commit 8bbcb75

File tree

1 file changed

+22
-25
lines changed

1 file changed

+22
-25
lines changed

yjit/src/codegen.rs

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -910,9 +910,7 @@ fn gen_dupn(
910910
asm: &mut Assembler,
911911
_ocb: &mut OutlinedCb,
912912
) -> CodegenStatus {
913-
914-
let nval: VALUE = jit_get_arg(jit, 0);
915-
let VALUE(n) = nval;
913+
let n = jit_get_arg(jit, 0).as_usize();
916914

917915
// In practice, seems to be only used for n==2
918916
if n != 2 {
@@ -1035,9 +1033,9 @@ fn gen_putspecialobject(
10351033
asm: &mut Assembler,
10361034
_ocb: &mut OutlinedCb,
10371035
) -> CodegenStatus {
1038-
let object_type = jit_get_arg(jit, 0);
1036+
let object_type = jit_get_arg(jit, 0).as_usize();
10391037

1040-
if object_type == VALUE(VM_SPECIAL_OBJECT_VMCORE.as_usize()) {
1038+
if object_type == VM_SPECIAL_OBJECT_VMCORE.as_usize() {
10411039
let stack_top = ctx.stack_push(Type::UnknownHeap);
10421040
let frozen_core = unsafe { rb_mRubyVMFrozenCore };
10431041
asm.mov(stack_top, frozen_core.into());
@@ -1056,17 +1054,17 @@ fn gen_setn(
10561054
asm: &mut Assembler,
10571055
_ocb: &mut OutlinedCb,
10581056
) -> CodegenStatus {
1059-
let n: VALUE = jit_get_arg(jit, 0);
1057+
let n = jit_get_arg(jit, 0).as_usize();
10601058

10611059
let top_val = ctx.stack_pop(0);
1062-
let dst_opnd = ctx.stack_opnd(n.into());
1060+
let dst_opnd = ctx.stack_opnd(n.try_into().unwrap());
10631061
asm.mov(
10641062
dst_opnd,
10651063
top_val
10661064
);
10671065

10681066
let mapping = ctx.get_opnd_mapping(StackOpnd(0));
1069-
ctx.set_opnd_mapping(StackOpnd(n.into()), mapping);
1067+
ctx.set_opnd_mapping(StackOpnd(n.try_into().unwrap()), mapping);
10701068

10711069
KeepCompiling
10721070
}
@@ -1078,10 +1076,10 @@ fn gen_topn(
10781076
asm: &mut Assembler,
10791077
_ocb: &mut OutlinedCb,
10801078
) -> CodegenStatus {
1081-
let nval = jit_get_arg(jit, 0);
1079+
let n = jit_get_arg(jit, 0).as_usize();
10821080

1083-
let top_n_val = ctx.stack_opnd(nval.into());
1084-
let mapping = ctx.get_opnd_mapping(StackOpnd(nval.into()));
1081+
let top_n_val = ctx.stack_opnd(n.try_into().unwrap());
1082+
let mapping = ctx.get_opnd_mapping(StackOpnd(n.try_into().unwrap()));
10851083
let loc0 = ctx.stack_push_mapping(mapping);
10861084
asm.mov(loc0, top_n_val);
10871085

@@ -1095,8 +1093,7 @@ fn gen_adjuststack(
10951093
_cb: &mut Assembler,
10961094
_ocb: &mut OutlinedCb,
10971095
) -> CodegenStatus {
1098-
let nval: VALUE = jit_get_arg(jit, 0);
1099-
let VALUE(n) = nval;
1096+
let n = jit_get_arg(jit, 0).as_usize();
11001097
ctx.stack_pop(n);
11011098
KeepCompiling
11021099
}
@@ -1237,7 +1234,7 @@ fn gen_splatarray(
12371234
asm: &mut Assembler,
12381235
_ocb: &mut OutlinedCb,
12391236
) -> CodegenStatus {
1240-
let flag = jit_get_arg(jit, 0);
1237+
let flag = jit_get_arg(jit, 0).as_usize();
12411238

12421239
// Save the PC and SP because the callee may allocate
12431240
// Note that this modifies REG_SP, which is why we do it first
@@ -1286,7 +1283,7 @@ fn gen_newrange(
12861283
asm: &mut Assembler,
12871284
_ocb: &mut OutlinedCb,
12881285
) -> CodegenStatus {
1289-
let flag = jit_get_arg(jit, 0);
1286+
let flag = jit_get_arg(jit, 0).as_usize();
12901287

12911288
// rb_range_new() allocates and can raise
12921289
jit_prepare_routine_call(jit, ctx, asm);
@@ -2149,7 +2146,7 @@ fn gen_setinstancevariable(
21492146
asm: &mut Assembler,
21502147
_ocb: &mut OutlinedCb,
21512148
) -> CodegenStatus {
2152-
let id = jit_get_arg(jit, 0);
2149+
let id = jit_get_arg(jit, 0).as_usize();
21532150
let ic = jit_get_arg(jit, 1).as_u64(); // type IVC
21542151

21552152
// Save the PC and SP because the callee may allocate
@@ -2165,7 +2162,7 @@ fn gen_setinstancevariable(
21652162
vec![
21662163
Opnd::const_ptr(jit.iseq as *const u8),
21672164
Opnd::mem(64, CFP, RUBY_OFFSET_CFP_SELF),
2168-
Opnd::UImm(id.into()),
2165+
id.into(),
21692166
val_opnd,
21702167
Opnd::const_ptr(ic as *const u8),
21712168
]
@@ -2273,20 +2270,20 @@ fn gen_concatstrings(
22732270
asm: &mut Assembler,
22742271
_ocb: &mut OutlinedCb,
22752272
) -> CodegenStatus {
2276-
let n = jit_get_arg(jit, 0);
2273+
let n = jit_get_arg(jit, 0).as_usize();
22772274

22782275
// Save the PC and SP because we are allocating
22792276
jit_prepare_routine_call(jit, ctx, asm);
22802277

2281-
let values_ptr = asm.lea(ctx.sp_opnd(-((SIZEOF_VALUE as isize) * n.as_isize())));
2278+
let values_ptr = asm.lea(ctx.sp_opnd(-((SIZEOF_VALUE as isize) * n as isize)));
22822279

2283-
// call rb_str_concat_literals(long n, const VALUE *strings);
2280+
// call rb_str_concat_literals(size_t n, const VALUE *strings);
22842281
let return_value = asm.ccall(
22852282
rb_str_concat_literals as *const u8,
2286-
vec![Opnd::UImm(n.into()), values_ptr]
2283+
vec![n.into(), values_ptr]
22872284
);
22882285

2289-
ctx.stack_pop(n.as_usize());
2286+
ctx.stack_pop(n);
22902287
let stack_ret = ctx.stack_push(Type::CString);
22912288
asm.mov(stack_ret, return_value);
22922289

@@ -5736,7 +5733,7 @@ fn gen_getglobal(
57365733
asm: &mut Assembler,
57375734
_ocb: &mut OutlinedCb,
57385735
) -> CodegenStatus {
5739-
let gid = jit_get_arg(jit, 0);
5736+
let gid = jit_get_arg(jit, 0).as_usize();
57405737

57415738
// Save the PC and SP because we might make a Ruby call for warning
57425739
jit_prepare_routine_call(jit, ctx, asm);
@@ -5758,7 +5755,7 @@ fn gen_setglobal(
57585755
asm: &mut Assembler,
57595756
_ocb: &mut OutlinedCb,
57605757
) -> CodegenStatus {
5761-
let gid = jit_get_arg(jit, 0);
5758+
let gid = jit_get_arg(jit, 0).as_usize();
57625759

57635760
// Save the PC and SP because we might make a Ruby call for
57645761
// Kernel#set_trace_var
@@ -5872,7 +5869,7 @@ fn gen_toregexp(
58725869
rb_ary_tmp_new_from_values as *const u8,
58735870
vec![
58745871
Opnd::Imm(0),
5875-
Opnd::UImm(jit_get_arg(jit, 1).as_u64()),
5872+
cnt.into(),
58765873
values_ptr,
58775874
]
58785875
);

0 commit comments

Comments
 (0)