diff --git a/src/coreclr/jit/codegenwasm.cpp b/src/coreclr/jit/codegenwasm.cpp index f1f0133313acd2..db26846e35e0b7 100644 --- a/src/coreclr/jit/codegenwasm.cpp +++ b/src/coreclr/jit/codegenwasm.cpp @@ -3278,7 +3278,37 @@ void CodeGen::genCodeForInitBlkLoop(GenTreeBlk* blkOp) void CodeGen::genCallFinally(BasicBlock* block) { assert(block->KindIs(BBJ_CALLFINALLY)); - NYI_WASM("genCallFinally"); + BasicBlock* const finallyTarget = block->GetTarget(); + EHblkDsc* const ehDsc = m_compiler->ehGetBlockHndDsc(finallyTarget); + assert(ehDsc->ebdHandlerType == EH_HANDLER_FINALLY); + assert(ehDsc->ebdHndBeg == finallyTarget); + unsigned const funcletIndex = ehDsc->ebdFuncIndex; + + assert((funcletIndex >= 1) && (funcletIndex < m_compiler->compFuncCount())); + + EmitCallParams params; + params.callType = EmitCallType::EC_INDIR_R; + + // A finally takes SP and FP as arguments, and returns nothing. + // + CorInfoWasmType ptrType = (TARGET_POINTER_SIZE == 4) ? CORINFO_WASM_TYPE_I32 : CORINFO_WASM_TYPE_I64; + ArrayStack typeStack(m_compiler->getAllocator(CMK_Codegen)); + typeStack.Push(CORINFO_WASM_TYPE_VOID); + typeStack.Push(ptrType); + typeStack.Push(ptrType); + + params.wasmSignature = m_compiler->info.compCompHnd->getWasmTypeSymbol(typeStack.Data(), typeStack.Height()); + + GetEmitter()->emitIns_I(INS_local_get, EA_PTRSIZE, GetStackPointerRegIndex()); + GetEmitter()->emitIns_I(INS_local_get, EA_PTRSIZE, GetFramePointerRegIndex()); + GetEmitter()->emitFuncletAddressConstant(funcletIndex); + + genEmitCallWithCurrentGC(params); + + if (block->HasFlag(BBF_RETLESS_CALL)) + { + GetEmitter()->emitIns(INS_unreachable); + } } //------------------------------------------------------------------------