#include "config.h"
#include "WasmBinding.h"
#if ENABLE(WEBASSEMBLY)
#include "CCallHelpers.h"
#include "LinkBuffer.h"
#include "WasmCallingConvention.h"
#include "WasmInstance.h"
namespace JSC { namespace Wasm {
using JIT = CCallHelpers;
Expected<MacroAssemblerCodeRef<WasmEntryPtrTag>, BindingFailure> wasmToWasm(unsigned importIndex)
{
const PinnedRegisterInfo& pinnedRegs = PinnedRegisterInfo::get();
JIT jit;
GPRReg scratch = wasmCallingConvention().prologueScratchGPRs[0];
GPRReg baseMemory = pinnedRegs.baseMemoryPointer;
ASSERT(baseMemory != GPRReg::InvalidGPRReg);
ASSERT(baseMemory != scratch);
ASSERT(pinnedRegs.boundsCheckingSizeRegister != baseMemory);
ASSERT(pinnedRegs.boundsCheckingSizeRegister != scratch);
GPRReg sizeRegAsScratch = pinnedRegs.boundsCheckingSizeRegister;
ASSERT(sizeRegAsScratch != GPRReg::InvalidGPRReg);
jit.loadWasmContextInstance(sizeRegAsScratch); jit.loadPtr(JIT::Address(sizeRegAsScratch, Instance::offsetOfTargetInstance(importIndex)), baseMemory); jit.loadPtr(JIT::Address(sizeRegAsScratch, Instance::offsetOfWasmEntrypointLoadLocation(importIndex)), scratch);
jit.storeWasmContextInstance(baseMemory);
jit.loadPtr(JIT::Address(sizeRegAsScratch, Instance::offsetOfCachedStackLimit()), sizeRegAsScratch);
jit.storePtr(sizeRegAsScratch, JIT::Address(baseMemory, Instance::offsetOfCachedStackLimit()));
{
GPRReg scratchOrBoundsCheckingSize = !Gigacage::isEnabled(Gigacage::Primitive) ? pinnedRegs.boundsCheckingSizeRegister : wasmCallingConvention().prologueScratchGPRs[1];
jit.loadPtr(JIT::Address(baseMemory, Wasm::Instance::offsetOfCachedBoundsCheckingSize()), pinnedRegs.boundsCheckingSizeRegister); jit.loadPtr(JIT::Address(baseMemory, Wasm::Instance::offsetOfCachedMemory()), baseMemory); jit.cageConditionally(Gigacage::Primitive, baseMemory, pinnedRegs.boundsCheckingSizeRegister, scratchOrBoundsCheckingSize);
}
jit.loadPtr(scratch, scratch);
jit.farJump(scratch, WasmEntryPtrTag);
LinkBuffer patchBuffer(jit, GLOBAL_THUNK_ID, JITCompilationCanFail);
if (UNLIKELY(patchBuffer.didFailToAllocate()))
return makeUnexpected(BindingFailure::OutOfMemory);
return FINALIZE_WASM_CODE(patchBuffer, WasmEntryPtrTag, "WebAssembly->WebAssembly import[%i]", importIndex);
}
} }
#endif // ENABLE(WEBASSEMBLY)