Skip to content

Commit 786a0d4

Browse files
Add a guard to the first branch of YARVINSN_setlocal_WC_0 and update tests. This fixes SIGABRTs.
Co-authored-by: John Hawthorn <john@hawthorn.email>
1 parent d0c93c4 commit 786a0d4

2 files changed

Lines changed: 57 additions & 39 deletions

File tree

zjit/src/hir.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6757,6 +6757,9 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
67576757
let val = state.stack_pop()?;
67586758
if ep_escaped || has_blockiseq { // TODO: figure out how to drop has_blockiseq here
67596759
// Write the local using EP
6760+
let exit_id = fun.push_insn(block, Insn::Snapshot { state: exit_state.without_locals() }); // skip spilling locals
6761+
let flags = fun.push_insn(block, Insn::LoadField { recv: ep, id: ID!(_env_data_index_flags), offset: SIZEOF_VALUE_I32 * (VM_ENV_DATA_INDEX_FLAGS as i32), return_type: types::CInt64 });
6762+
fun.push_insn(block, Insn::GuardNoBitsSet { val: flags, mask: Const::CUInt64(VM_ENV_FLAG_WB_REQUIRED.into()), reason: SideExitReason::WriteBarrierRequired, state: exit_id });
67606763
fun.push_insn(block, Insn::SetLocal { val, ep, ep_offset, level });
67616764
} else if local_inval {
67626765
// If there has been any non-leaf call since JIT entry or the last patch point,

zjit/src/hir/opt_tests.rs

Lines changed: 54 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2941,15 +2941,18 @@ mod hir_opt_tests {
29412941
Jump bb2(v5, v6)
29422942
bb2(v8:BasicObject, v9:NilClass):
29432943
v13:Fixnum[1] = Const Value(1)
2944+
v15:CPtr = GetEP 0
2945+
v17:CInt64 = LoadField v15, :_env_data_index_flags@0x1000
2946+
v18:CInt64 = GuardNoBitsSet v17, CUInt64(8)
29442947
SetLocal :a, l0, EP@3, v13
2945-
PatchPoint NoSingletonClass(Object@0x1000)
2946-
PatchPoint MethodRedefined(Object@0x1000, foo@0x1008, cme:0x1010)
2947-
v31:HeapObject[class_exact*:Object@VALUE(0x1000)] = GuardType v8, HeapObject[class_exact*:Object@VALUE(0x1000)]
2948+
PatchPoint NoSingletonClass(Object@0x1008)
2949+
PatchPoint MethodRedefined(Object@0x1008, foo@0x1010, cme:0x1018)
2950+
v35:HeapObject[class_exact*:Object@VALUE(0x1008)] = GuardType v8, HeapObject[class_exact*:Object@VALUE(0x1008)]
29482951
IncrCounter inline_iseq_optimized_send_count
2949-
v20:BasicObject = GetLocal :a, l0, EP@3
29502952
v24:BasicObject = GetLocal :a, l0, EP@3
2953+
v28:BasicObject = GetLocal :a, l0, EP@3
29512954
CheckInterrupts
2952-
Return v24
2955+
Return v28
29532956
");
29542957
}
29552958

@@ -3430,15 +3433,18 @@ mod hir_opt_tests {
34303433
Jump bb2(v6, v7, v8)
34313434
bb2(v10:BasicObject, v11:BasicObject, v12:NilClass):
34323435
v16:ArrayExact = NewArray
3436+
v18:CPtr = GetEP 0
3437+
v20:CInt64 = LoadField v18, :_env_data_index_flags@0x1000
3438+
v21:CInt64 = GuardNoBitsSet v20, CUInt64(8)
34333439
SetLocal :a, l0, EP@3, v16
3434-
v22:TrueClass = Const Value(true)
3440+
v26:TrueClass = Const Value(true)
34353441
IncrCounter complex_arg_pass_caller_kwarg
3436-
v24:BasicObject = Send v11, 0x1000, :each_line, v22 # SendFallbackReason: Complex argument passing
3437-
v25:BasicObject = GetLocal :s, l0, EP@4
3438-
v26:BasicObject = GetLocal :a, l0, EP@3
3442+
v28:BasicObject = Send v11, 0x1008, :each_line, v26 # SendFallbackReason: Complex argument passing
3443+
v29:BasicObject = GetLocal :s, l0, EP@4
34393444
v30:BasicObject = GetLocal :a, l0, EP@3
3445+
v34:BasicObject = GetLocal :a, l0, EP@3
34403446
CheckInterrupts
3441-
Return v30
3447+
Return v34
34423448
");
34433449
}
34443450

@@ -6538,20 +6544,23 @@ mod hir_opt_tests {
65386544
Jump bb2(v5, v6)
65396545
bb2(v8:BasicObject, v9:NilClass):
65406546
v13:ArrayExact = NewArray
6547+
v15:CPtr = GetEP 0
6548+
v17:CInt64 = LoadField v15, :_env_data_index_flags@0x1000
6549+
v18:CInt64 = GuardNoBitsSet v17, CUInt64(8)
65416550
SetLocal :result, l0, EP@3, v13
65426551
PatchPoint SingleRactorMode
6543-
PatchPoint StableConstantNames(0x1000, A)
6544-
v36:ArrayExact[VALUE(0x1008)] = Const Value(VALUE(0x1008))
6552+
PatchPoint StableConstantNames(0x1008, A)
6553+
v40:ArrayExact[VALUE(0x1010)] = Const Value(VALUE(0x1010))
65456554
PatchPoint SingleRactorMode
6546-
PatchPoint StableConstantNames(0x1010, B)
6547-
v39:ArrayExact[VALUE(0x1018)] = Const Value(VALUE(0x1018))
6548-
PatchPoint NoSingletonClass(Array@0x1020)
6549-
PatchPoint MethodRedefined(Array@0x1020, zip@0x1028, cme:0x1030)
6550-
v43:BasicObject = CCallVariadic v36, :zip@0x1058, v39
6551-
v25:BasicObject = GetLocal :result, l0, EP@3
6555+
PatchPoint StableConstantNames(0x1018, B)
6556+
v43:ArrayExact[VALUE(0x1020)] = Const Value(VALUE(0x1020))
6557+
PatchPoint NoSingletonClass(Array@0x1028)
6558+
PatchPoint MethodRedefined(Array@0x1028, zip@0x1030, cme:0x1038)
6559+
v47:BasicObject = CCallVariadic v40, :zip@0x1060, v43
65526560
v29:BasicObject = GetLocal :result, l0, EP@3
6561+
v33:BasicObject = GetLocal :result, l0, EP@3
65536562
CheckInterrupts
6554-
Return v29
6563+
Return v33
65556564
");
65566565
}
65576566

@@ -10577,25 +10586,28 @@ mod hir_opt_tests {
1057710586
Jump bb2(v8, v9, v10, v11, v12)
1057810587
bb2(v14:BasicObject, v15:BasicObject, v16:BasicObject, v17:BasicObject, v18:NilClass):
1057910588
CheckInterrupts
10589+
v30:CPtr = GetEP 0
10590+
v32:CInt64 = LoadField v30, :_env_data_index_flags@0x1000
10591+
v33:CInt64 = GuardNoBitsSet v32, CUInt64(8)
1058010592
SetLocal :formatted, l0, EP@3, v15
1058110593
PatchPoint SingleRactorMode
10582-
v57:HeapBasicObject = GuardType v14, HeapBasicObject
10583-
v58:CShape = LoadField v57, :_shape_id@0x1000
10584-
v59:CShape[0x1001] = GuardBitEquals v58, CShape(0x1001)
10585-
StoreField v57, :@formatted@0x1002, v15
10586-
WriteBarrier v57, v15
10587-
v62:CShape[0x1003] = Const CShape(0x1003)
10588-
StoreField v57, :_shape_id@0x1000, v62
10589-
v46:Class[VMFrozenCore] = Const Value(VALUE(0x1008))
10594+
v61:HeapBasicObject = GuardType v14, HeapBasicObject
10595+
v62:CShape = LoadField v61, :_shape_id@0x1001
10596+
v63:CShape[0x1002] = GuardBitEquals v62, CShape(0x1002)
10597+
StoreField v61, :@formatted@0x1003, v15
10598+
WriteBarrier v61, v15
10599+
v66:CShape[0x1004] = Const CShape(0x1004)
10600+
StoreField v61, :_shape_id@0x1001, v66
10601+
v50:Class[VMFrozenCore] = Const Value(VALUE(0x1008))
1059010602
PatchPoint NoSingletonClass(Class@0x1010)
1059110603
PatchPoint MethodRedefined(Class@0x1010, lambda@0x1018, cme:0x1020)
10592-
v67:BasicObject = CCallWithFrame v46, :RubyVM::FrozenCore.lambda@0x1048, block=0x1050
10593-
v49:BasicObject = GetLocal :a, l0, EP@6
10594-
v50:BasicObject = GetLocal :_b, l0, EP@5
10595-
v51:BasicObject = GetLocal :_c, l0, EP@4
10596-
v52:BasicObject = GetLocal :formatted, l0, EP@3
10604+
v71:BasicObject = CCallWithFrame v50, :RubyVM::FrozenCore.lambda@0x1048, block=0x1050
10605+
v53:BasicObject = GetLocal :a, l0, EP@6
10606+
v54:BasicObject = GetLocal :_b, l0, EP@5
10607+
v55:BasicObject = GetLocal :_c, l0, EP@4
10608+
v56:BasicObject = GetLocal :formatted, l0, EP@3
1059710609
CheckInterrupts
10598-
Return v67
10610+
Return v71
1059910611
");
1060010612
}
1060110613

@@ -11594,14 +11606,17 @@ mod hir_opt_tests {
1159411606
bb2(v10:BasicObject, v11:BasicObject, v12:NilClass):
1159511607
PatchPoint NoSingletonClass(B@0x1000)
1159611608
PatchPoint MethodRedefined(B@0x1000, proc@0x1008, cme:0x1010)
11597-
v35:HeapObject[class_exact:B] = GuardType v10, HeapObject[class_exact:B]
11598-
v36:BasicObject = CCallWithFrame v35, :Kernel#proc@0x1038, block=0x1040
11609+
v39:HeapObject[class_exact:B] = GuardType v10, HeapObject[class_exact:B]
11610+
v40:BasicObject = CCallWithFrame v39, :Kernel#proc@0x1038, block=0x1040
1159911611
v18:BasicObject = GetLocal :blk, l0, EP@4
11600-
SetLocal :other_block, l0, EP@3, v36
11601-
v25:BasicObject = GetLocal :other_block, l0, EP@3
11602-
v27:BasicObject = InvokeSuper v10, 0x1048, v25 # SendFallbackReason: super: complex argument passing to `super` call
11612+
v21:CPtr = GetEP 0
11613+
v23:CInt64 = LoadField v21, :_env_data_index_flags@0x1048
11614+
v24:CInt64 = GuardNoBitsSet v23, CUInt64(8)
11615+
SetLocal :other_block, l0, EP@3, v40
11616+
v29:BasicObject = GetLocal :other_block, l0, EP@3
11617+
v31:BasicObject = InvokeSuper v10, 0x1050, v29 # SendFallbackReason: super: complex argument passing to `super` call
1160311618
CheckInterrupts
11604-
Return v27
11619+
Return v31
1160511620
");
1160611621
}
1160711622

0 commit comments

Comments
 (0)