commit a48c7813a3ef97b25731205732d77e20d269f8b3
parent 09f04022c6f22371a4ad9f46f8b919e55330ae4b
Author: Ryan Hunt <rhunt@eqrion.net>
Date: Thu, 18 Dec 2025 16:45:29 +0000
Bug 2002625 - wasm: Dynamically switch to main stack in import interp exit. r=yury
Use the infrastructure added for builtin thunks for the import
interp exit.
Differential Revision: https://phabricator.services.mozilla.com/D274194
Diffstat:
2 files changed, 8 insertions(+), 28 deletions(-)
diff --git a/js/src/wasm/WasmInstance.cpp b/js/src/wasm/WasmInstance.cpp
@@ -250,6 +250,11 @@ bool Instance::callImport(JSContext* cx, uint32_t funcImportIndex,
unsigned argc, uint64_t* argv) {
AssertRealmUnchanged aru(cx);
+#ifdef ENABLE_WASM_JSPI
+ // We should not be on a suspendable stack.
+ MOZ_ASSERT(!cx->wasm().onSuspendableStack());
+#endif
+
FuncImportInstanceData& instanceFuncImport =
funcImportInstanceData(funcImportIndex);
const FuncType& funcType = codeMeta().getFuncType(funcImportIndex);
@@ -408,24 +413,6 @@ bool Instance::callImport(JSContext* cx, uint32_t funcImportIndex,
Instance::callImport_general(Instance* instance, int32_t funcImportIndex,
int32_t argc, uint64_t* argv) {
JSContext* cx = instance->cx();
-#ifdef ENABLE_WASM_JSPI
- if (IsSuspendableStackActive(cx)) {
- struct ImportCallData {
- Instance* instance;
- int32_t funcImportIndex;
- int32_t argc;
- uint64_t* argv;
- static bool Call(ImportCallData* data) {
- Instance* instance = data->instance;
- JSContext* cx = instance->cx();
- return instance->callImport(cx, data->funcImportIndex, data->argc,
- data->argv);
- }
- } data = {instance, funcImportIndex, argc, argv};
- return CallOnMainStack(
- cx, reinterpret_cast<CallOnMainStackFn>(ImportCallData::Call), &data);
- }
-#endif
return instance->callImport(cx, funcImportIndex, argc, argv);
}
diff --git a/js/src/wasm/WasmStubs.cpp b/js/src/wasm/WasmStubs.cpp
@@ -338,13 +338,6 @@ static bool FinishOffsets(MacroAssembler& masm, Offsets* offsets) {
return !masm.oom();
}
-static void AssertStackAlignment(MacroAssembler& masm, uint32_t alignment,
- uint32_t addBeforeAssert = 0) {
- MOZ_ASSERT(
- (sizeof(Frame) + masm.framePushed() + addBeforeAssert) % alignment == 0);
- masm.assertStackAlignment(alignment, addBeforeAssert);
-}
-
template <class VectorT>
static unsigned StackArgBytesHelper(const VectorT& args, ABIKind kind) {
ABIArgIter<VectorT> iter(args, kind);
@@ -2003,7 +1996,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi,
ComputeByteAlignment(sizeof(Frame), ABIStackAlignment);
unsigned framePushed = AlignBytes(argOffset + argBytes, ABIStackAlignment);
GenerateExitPrologue(masm, ExitReason::Fixed::ImportInterp,
- /*switchToMainStack*/ false,
+ /*switchToMainStack*/ true,
/*framePushedPreSwitch*/ frameAlignment,
/*framePushedPostSwitch*/ framePushed, offsets);
@@ -2056,7 +2049,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi,
MOZ_ASSERT(i.done());
// Make the call, test whether it succeeded, and extract the return value.
- AssertStackAlignment(masm, ABIStackAlignment);
+ masm.assertStackAlignment(ABIStackAlignment);
masm.call(SymbolicAddress::CallImport_General);
masm.branchTest32(Assembler::Zero, ReturnReg, ReturnReg, throwLabel);
@@ -2125,7 +2118,7 @@ static bool GenerateImportInterpExit(MacroAssembler& masm, const FuncImport& fi,
#endif
GenerateExitEpilogue(masm, ExitReason::Fixed::ImportInterp,
- /*switchToMainStack*/ false, offsets);
+ /*switchToMainStack*/ true, offsets);
return FinishOffsets(masm, offsets);
}