Skip to content

Commit b67ef5a

Browse files
thibaudmichaudV8 LUCI CQ
authored andcommitted
[wasmfx] Simplify active stack update
Update the active stack in {Isolate::SwitchStacks} instead of doing it in each asm builtin separately. [email protected],[email protected] Bug: 388533754 Change-Id: Ie7d3c03a3cf0655414d37aa2a01ee7ffad35ccac Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/6943374 Commit-Queue: Thibaud Michaud <[email protected]> Reviewed-by: Jakob Kummerow <[email protected]> Reviewed-by: Clemens Backes <[email protected]> Cr-Commit-Position: refs/heads/main@{#102471}
1 parent b575104 commit b67ef5a

8 files changed

Lines changed: 77 additions & 129 deletions

File tree

src/builtins/arm/builtins-arm.cc

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3033,12 +3033,9 @@ void ReloadParentStack(MacroAssembler* masm, Register return_reg,
30333033
Register parent = tmp2;
30343034
__ ldr(parent, MemOperand(active_stack, wasm::kStackParentOffset));
30353035

3036-
// Update active stack.
3037-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
3038-
30393036
// Switch stack!
3040-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3041-
nullptr, no_reg, {return_reg, return_value, context, parent});
3037+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3038+
no_reg, {return_reg, return_value, context, parent});
30423039
LoadJumpBuffer(masm, parent, false, tmp3);
30433040
}
30443041

@@ -3248,17 +3245,15 @@ void Builtins::Generate_WasmSuspend(MacroAssembler* masm) {
32483245
DEFINE_REG(stack);
32493246
__ LoadRootRelative(stack, IsolateData::active_stack_offset());
32503247

3251-
// Update active stack.
32523248
DEFINE_REG(parent);
32533249
__ LoadTaggedField(
32543250
parent, FieldMemOperand(suspender, WasmSuspenderObject::kParentOffset));
32553251
DEFINE_REG(target_stack);
32563252
__ ldr(target_stack,
32573253
FieldMemOperand(parent, WasmSuspenderObject::kStackOffset));
3258-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
32593254

3260-
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), stack, &resume,
3261-
no_reg, {target_stack, suspender, parent});
3255+
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), target_stack,
3256+
&resume, no_reg, {target_stack, suspender, parent});
32623257
__ StoreRootRelative(IsolateData::active_suspender_offset(), parent);
32633258
__ LoadTaggedField(
32643259
kReturnRegister0,
@@ -3330,8 +3325,7 @@ void Generate_WasmResumeHelper(MacroAssembler* masm, wasm::OnResume on_resume) {
33303325
__ ldr(target_stack,
33313326
FieldMemOperand(suspender, WasmSuspenderObject::kStackOffset));
33323327

3333-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
3334-
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), active_stack,
3328+
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), target_stack,
33353329
&suspend, suspender, {target_stack});
33363330
regs.ResetExcept(target_stack);
33373331

@@ -3381,11 +3375,8 @@ void Builtins::Generate_WasmFXResume(MacroAssembler* masm) {
33813375
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
33823376
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
33833377
Label suspend;
3384-
Register active_stack = r0;
3385-
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
3386-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
33873378
SwitchStacks(masm, ExternalReference::wasm_resume_wasmfx_stack(),
3388-
active_stack, &suspend, no_reg, {target_stack});
3379+
target_stack, &suspend, no_reg, {target_stack});
33893380
LoadJumpBuffer(masm, target_stack, true, r1);
33903381
__ Trap();
33913382
__ bind(&suspend);
@@ -3398,9 +3389,8 @@ void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
33983389
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
33993390
Register parent = r1;
34003391
__ Move(parent, MemOperand(active_stack, wasm::kStackParentOffset));
3401-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
3402-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3403-
nullptr, no_reg, {parent});
3392+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3393+
no_reg, {parent});
34043394
LoadJumpBuffer(masm, parent, true, r2);
34053395
__ Trap();
34063396
}
@@ -3417,19 +3407,17 @@ void SwitchToAllocatedStack(MacroAssembler* masm, RegisterAllocator& regs,
34173407
Label* suspend) {
34183408
ResetWasmJspiFrameStackSlots(masm);
34193409
DEFINE_SCOPED(scratch)
3420-
DEFINE_REG(target_stack)
3421-
__ LoadRootRelative(target_stack, IsolateData::active_stack_offset());
3422-
DEFINE_REG(parent_stack)
3423-
__ ldr(parent_stack, MemOperand(target_stack, wasm::kStackParentOffset));
3424-
3425-
SwitchStacks(masm, ExternalReference::wasm_start_stack(), parent_stack,
3426-
suspend, no_reg, {wasm_instance, wrapper_buffer});
3427-
3428-
FREE_REG(parent_stack);
3410+
DEFINE_REG(stack)
3411+
__ LoadRootRelative(stack, IsolateData::active_suspender_offset());
3412+
__ ldr(stack, FieldMemOperand(stack, WasmSuspenderObject::kStackOffset));
3413+
SwitchStacks(masm, ExternalReference::wasm_start_stack(), stack, suspend,
3414+
no_reg, {wasm_instance, wrapper_buffer});
3415+
FREE_REG(stack);
34293416
// Save the old stack's fp in x9, and use it to access the parameters in
34303417
// the parent frame.
34313418
regs.Pinned(r9, &original_fp);
34323419
__ Move(original_fp, fp);
3420+
DEFINE_REG(target_stack)
34333421
__ LoadRootRelative(target_stack, IsolateData::active_stack_offset());
34343422
LoadTargetJumpBuffer(masm, target_stack, scratch);
34353423
FREE_REG(target_stack);

src/builtins/arm64/builtins-arm64.cc

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3567,12 +3567,9 @@ void ReloadParentStack(MacroAssembler* masm, Register return_reg,
35673567
Register parent = tmp2;
35683568
__ Ldr(parent, MemOperand(active_stack, wasm::kStackParentOffset));
35693569

3570-
// Update active stack.
3571-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
3572-
35733570
// Switch stack!
3574-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3575-
nullptr, no_reg, {return_reg, return_value, context, parent});
3571+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3572+
no_reg, {return_reg, return_value, context, parent});
35763573
LoadJumpBuffer(masm, parent, false, tmp3);
35773574
}
35783575

@@ -3777,22 +3774,18 @@ void Builtins::Generate_WasmSuspend(MacroAssembler* masm) {
37773774
ResetWasmJspiFrameStackSlots(masm);
37783775

37793776
Label resume;
3780-
DEFINE_REG(stack);
3781-
__ LoadRootRelative(stack, IsolateData::active_stack_offset());
37823777
DEFINE_REG(scratch);
37833778

3784-
// Update active stack.
37853779
DEFINE_REG(parent);
37863780
__ LoadProtectedPointerField(
37873781
parent, FieldMemOperand(suspender, WasmSuspenderObject::kParentOffset));
37883782
DEFINE_REG(target_stack);
37893783
__ LoadExternalPointerField(
37903784
target_stack, FieldMemOperand(parent, WasmSuspenderObject::kStackOffset),
37913785
kWasmStackMemoryTag);
3792-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
37933786

3794-
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), stack, &resume,
3795-
no_reg, {target_stack, suspender, parent});
3787+
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), target_stack,
3788+
&resume, no_reg, {target_stack, suspender, parent});
37963789
__ StoreRootRelative(IsolateData::active_suspender_offset(), parent);
37973790
__ LoadTaggedField(
37983791
kReturnRegister0,
@@ -3867,8 +3860,7 @@ void Generate_WasmResumeHelper(MacroAssembler* masm, wasm::OnResume on_resume) {
38673860
target_stack,
38683861
FieldMemOperand(suspender, WasmSuspenderObject::kStackOffset),
38693862
kWasmStackMemoryTag);
3870-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
3871-
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), active_stack,
3863+
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), target_stack,
38723864
&suspend, suspender, {target_stack});
38733865
regs.ResetExcept(target_stack);
38743866

@@ -3916,11 +3908,8 @@ void Builtins::Generate_WasmFXResume(MacroAssembler* masm) {
39163908
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
39173909
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
39183910
Label suspend;
3919-
Register active_stack = x0;
3920-
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
3921-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
39223911
SwitchStacks(masm, ExternalReference::wasm_resume_wasmfx_stack(),
3923-
active_stack, &suspend, no_reg, {target_stack});
3912+
target_stack, &suspend, no_reg, {target_stack});
39243913
// When we resume the stack for the first time, we enter the wrapper. However
39253914
// the wrapper starts with bti c, not bti j, so we cannot jump to it with an
39263915
// arbitrary register. We have to use ip0 or ip1 as the target register here
@@ -3941,9 +3930,8 @@ void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
39413930
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
39423931
Register parent = x1;
39433932
__ Move(parent, MemOperand(active_stack, wasm::kStackParentOffset));
3944-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
3945-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3946-
nullptr, no_reg, {parent});
3933+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3934+
no_reg, {parent});
39473935
LoadJumpBuffer(masm, parent, true, x2);
39483936
__ Trap();
39493937
}
@@ -3959,12 +3947,14 @@ void SwitchToAllocatedStack(MacroAssembler* masm, RegisterAllocator& regs,
39593947
Label* suspend) {
39603948
ResetWasmJspiFrameStackSlots(masm);
39613949
DEFINE_SCOPED(scratch)
3962-
DEFINE_REG(parent_stack)
3963-
__ LoadRootRelative(parent_stack, IsolateData::active_stack_offset());
3964-
__ Ldr(parent_stack, MemOperand(parent_stack, wasm::kStackParentOffset));
3965-
SwitchStacks(masm, ExternalReference::wasm_start_stack(), parent_stack,
3966-
suspend, no_reg, {wasm_instance, wrapper_buffer});
3967-
FREE_REG(parent_stack);
3950+
DEFINE_REG(stack)
3951+
__ LoadRootRelative(stack, IsolateData::active_suspender_offset());
3952+
__ LoadExternalPointerField(
3953+
stack, FieldMemOperand(stack, WasmSuspenderObject::kStackOffset),
3954+
kWasmStackMemoryTag);
3955+
SwitchStacks(masm, ExternalReference::wasm_start_stack(), stack, suspend,
3956+
no_reg, {wasm_instance, wrapper_buffer});
3957+
FREE_REG(stack);
39683958
// Save the old stack's fp in x9, and use it to access the parameters in
39693959
// the parent frame.
39703960
regs.Pinned(x9, &original_fp);

src/builtins/ia32/builtins-ia32.cc

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3370,18 +3370,12 @@ void ReloadParentStack(MacroAssembler* masm, Register promise,
33703370

33713371
DCHECK(!AreAliased(promise, return_value, context, tmp));
33723372

3373-
__ Push(promise);
3374-
33753373
Register parent = tmp2;
33763374
__ mov(parent, Operand(active_stack, wasm::kStackParentOffset));
33773375

3378-
// Update active stack root.
3379-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
3380-
3381-
__ Pop(promise);
33823376
// Switch stack!
3383-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3384-
nullptr, no_reg, {promise, return_value, context, parent});
3377+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3378+
no_reg, {promise, return_value, context, parent});
33853379
LoadJumpBuffer(masm, parent, false);
33863380
}
33873381

@@ -3422,12 +3416,12 @@ void SwitchToAllocatedStack(MacroAssembler* masm, Register wrapper_buffer,
34223416
Register scratch, Register scratch2,
34233417
Label* suspend) {
34243418
ResetWasmJspiFrameStackSlots(masm);
3425-
Register parent_stack = new_wrapper_buffer;
3426-
__ LoadRootRelative(parent_stack, IsolateData::active_stack_offset());
3427-
__ Move(parent_stack, Operand(parent_stack, wasm::kStackParentOffset));
3428-
SwitchStacks(masm, ExternalReference::wasm_start_stack(), parent_stack,
3429-
suspend, no_reg, {wrapper_buffer});
3430-
parent_stack = no_reg;
3419+
Register stack = new_wrapper_buffer;
3420+
__ LoadRootRelative(stack, IsolateData::active_suspender_offset());
3421+
__ Move(stack, FieldOperand(stack, WasmSuspenderObject::kStackOffset));
3422+
SwitchStacks(masm, ExternalReference::wasm_start_stack(), stack, suspend,
3423+
no_reg, {wrapper_buffer});
3424+
stack = no_reg;
34313425
Register target_stack = scratch;
34323426
__ LoadRootRelative(target_stack, IsolateData::active_stack_offset());
34333427
// Save the old stack's ebp, and use it to access the parameters in
@@ -3819,17 +3813,15 @@ void Builtins::Generate_WasmSuspend(MacroAssembler* masm) {
38193813
Register stack = edx;
38203814
__ LoadRootRelative(stack, IsolateData::active_stack_offset());
38213815

3822-
// Update active stack.
38233816
Register parent = edi;
38243817
__ Move(parent, FieldOperand(suspender, WasmSuspenderObject::kParentOffset));
38253818
Register target_stack = ecx;
38263819
__ Move(target_stack,
38273820
FieldOperand(parent, WasmSuspenderObject::kStackOffset));
3828-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
38293821

38303822
// Switch stacks.
3831-
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), stack, &resume,
3832-
no_reg, {target_stack, suspender, parent});
3823+
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), target_stack,
3824+
&resume, no_reg, {target_stack, suspender, parent});
38333825
__ StoreRootRelative(IsolateData::active_suspender_offset(), parent);
38343826
parent = no_reg;
38353827
__ Move(kReturnRegister0,
@@ -3893,8 +3885,7 @@ void Generate_WasmResumeHelper(MacroAssembler* masm, wasm::OnResume on_resume) {
38933885
Register target_stack = edx;
38943886
__ Move(target_stack,
38953887
FieldOperand(suspender, WasmSuspenderObject::kStackOffset));
3896-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
3897-
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), active_stack,
3888+
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), target_stack,
38983889
&suspend, suspender, {target_stack});
38993890
suspender = no_reg;
39003891

@@ -3939,11 +3930,8 @@ void Builtins::Generate_WasmFXResume(MacroAssembler* masm) {
39393930
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
39403931
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
39413932
Label suspend;
3942-
Register active_stack = ecx;
3943-
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
3944-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
39453933
SwitchStacks(masm, ExternalReference::wasm_resume_wasmfx_stack(),
3946-
active_stack, &suspend, no_reg, {target_stack});
3934+
target_stack, &suspend, no_reg, {target_stack});
39473935
LoadJumpBuffer(masm, target_stack, true);
39483936
__ Trap();
39493937
__ bind(&suspend);
@@ -3956,9 +3944,8 @@ void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
39563944
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
39573945
Register parent = esi;
39583946
__ Move(parent, MemOperand(active_stack, wasm::kStackParentOffset));
3959-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
3960-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3961-
nullptr, no_reg, {parent});
3947+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3948+
no_reg, {parent});
39623949
LoadJumpBuffer(masm, parent, true);
39633950
__ Trap();
39643951
}

src/builtins/x64/builtins-x64.cc

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3506,10 +3506,9 @@ void ReloadParentStack(MacroAssembler* masm, Register promise,
35063506

35073507
Register parent = tmp2;
35083508
__ Move(parent, MemOperand(active_stack, wasm::kStackParentOffset));
3509-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
35103509
// Switch stack!
3511-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
3512-
nullptr, no_reg, {promise, return_value, context, parent});
3510+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
3511+
no_reg, {promise, return_value, context, parent});
35133512
LoadJumpBuffer(masm, parent, false);
35143513
}
35153514

@@ -3552,12 +3551,13 @@ void SwitchToAllocatedStack(MacroAssembler* masm, Register wasm_instance,
35523551
Register new_wrapper_buffer, Register scratch,
35533552
Label* suspend) {
35543553
ResetWasmJspiFrameStackSlots(masm);
3555-
Register parent_stack = new_wrapper_buffer;
3556-
__ LoadRootRelative(parent_stack, IsolateData::active_stack_offset());
3557-
__ Move(parent_stack, MemOperand(parent_stack, wasm::kStackParentOffset));
3558-
SwitchStacks(masm, ExternalReference::wasm_start_stack(), parent_stack,
3559-
suspend, no_reg, {kWasmImplicitArgRegister, wrapper_buffer});
3560-
parent_stack = no_reg;
3554+
Register stack = new_wrapper_buffer;
3555+
__ LoadRootRelative(stack, IsolateData::active_suspender_offset());
3556+
__ LoadExternalPointerField(
3557+
stack, FieldOperand(stack, WasmSuspenderObject::kStackOffset),
3558+
kWasmStackMemoryTag, kScratchRegister);
3559+
SwitchStacks(masm, ExternalReference::wasm_start_stack(), stack, suspend,
3560+
no_reg, {kWasmImplicitArgRegister, wrapper_buffer});
35613561
Register target_stack = scratch;
35623562
__ LoadRootRelative(target_stack, IsolateData::active_stack_offset());
35633563
// Save the old stack's rbp in r9, and use it to access the parameters in
@@ -3915,22 +3915,17 @@ void Builtins::Generate_WasmSuspend(MacroAssembler* masm) {
39153915
ResetWasmJspiFrameStackSlots(masm);
39163916

39173917
Label resume;
3918-
Register stack = rbx;
3919-
__ LoadRootRelative(stack, IsolateData::active_stack_offset());
3920-
3921-
// Update active stack.
39223918
Register parent = rdx;
39233919
__ LoadProtectedPointerField(
39243920
parent, FieldOperand(suspender, WasmSuspenderObject::kParentOffset));
39253921
Register target_stack = rcx;
39263922
__ LoadExternalPointerField(
39273923
target_stack, FieldOperand(parent, WasmSuspenderObject::kStackOffset),
39283924
kWasmStackMemoryTag, kScratchRegister);
3929-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
39303925

39313926
// Switch stacks.
3932-
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), stack, &resume,
3933-
no_reg, {target_stack, suspender, parent});
3927+
SwitchStacks(masm, ExternalReference::wasm_suspend_stack(), target_stack,
3928+
&resume, no_reg, {target_stack, suspender, parent});
39343929
__ StoreRootRelative(IsolateData::active_suspender_offset(), parent);
39353930
parent = no_reg;
39363931
__ LoadTaggedField(
@@ -4003,8 +3998,7 @@ void Generate_WasmResumeHelper(MacroAssembler* masm, wasm::OnResume on_resume) {
40033998
__ LoadExternalPointerField(
40043999
target_stack, FieldOperand(suspender, WasmSuspenderObject::kStackOffset),
40054000
kWasmStackMemoryTag, kScratchRegister);
4006-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
4007-
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), active_stack,
4001+
SwitchStacks(masm, ExternalReference::wasm_resume_jspi_stack(), target_stack,
40084002
&suspend, suspender, {target_stack});
40094003
suspender = no_reg;
40104004

@@ -4049,11 +4043,8 @@ void Builtins::Generate_WasmFXResume(MacroAssembler* masm) {
40494043
__ EnterFrame(StackFrame::WASM_STACK_EXIT);
40504044
Register target_stack = WasmFXResumeDescriptor::GetRegisterParameter(0);
40514045
Label suspend;
4052-
Register active_stack = rbx;
4053-
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
4054-
__ StoreRootRelative(IsolateData::active_stack_offset(), target_stack);
40554046
SwitchStacks(masm, ExternalReference::wasm_resume_wasmfx_stack(),
4056-
active_stack, &suspend, no_reg, {target_stack});
4047+
target_stack, &suspend, no_reg, {target_stack});
40574048
LoadJumpBuffer(masm, target_stack, true);
40584049
__ Trap();
40594050
__ bind(&suspend);
@@ -4067,9 +4058,8 @@ void Builtins::Generate_WasmFXReturn(MacroAssembler* masm) {
40674058
__ LoadRootRelative(active_stack, IsolateData::active_stack_offset());
40684059
Register parent = rbx;
40694060
__ Move(parent, MemOperand(active_stack, wasm::kStackParentOffset));
4070-
__ StoreRootRelative(IsolateData::active_stack_offset(), parent);
4071-
SwitchStacks(masm, ExternalReference::wasm_return_stack(), active_stack,
4072-
nullptr, no_reg, {parent});
4061+
SwitchStacks(masm, ExternalReference::wasm_return_stack(), parent, nullptr,
4062+
no_reg, {parent});
40734063
LoadJumpBuffer(masm, parent, true);
40744064
__ Trap();
40754065
}

src/execution/isolate.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3960,6 +3960,7 @@ template <wasm::JumpBuffer::StackState new_state_of_old_stack,
39603960
void Isolate::SwitchStacks(wasm::StackMemory* from, wasm::StackMemory* to,
39613961
Address sp, Address fp, Address pc) {
39623962
SBXCHECK_EQ(from->jmpbuf()->state, wasm::JumpBuffer::Active);
3963+
DCHECK_EQ(from, isolate_data()->active_stack());
39633964
constexpr bool is_resume =
39643965
expected_target_state == wasm::JumpBuffer::Suspended;
39653966
#if DEBUG
@@ -3982,6 +3983,7 @@ void Isolate::SwitchStacks(wasm::StackMemory* from, wasm::StackMemory* to,
39823983
}
39833984
SBXCHECK_EQ(to->jmpbuf()->state, expected_target_state);
39843985
to->jmpbuf()->state = wasm::JumpBuffer::Active;
3986+
isolate_data()->set_active_stack(to);
39853987
DisallowGarbageCollection no_gc;
39863988
if constexpr (is_resume) {
39873989
// To resume multiple stacks at once, we have to update the parent of the

0 commit comments

Comments
 (0)