-- WAMR for the wasm scripting backend. Flags proven by the luau_wasm EH
-- spike: sw-bounds artifacts must never unwind through hardware traps
-- (the longjmp skips the sjlj glue's native frames). Bounds checks default
-- sw; wasm_hw_bounds below. libc-wasi stays on: it makes WAMR leave the Luau
-- blob's __wasm_call_ctors to the host, off it also runs them at instantiate.
local dependency = require('dependency')
-- The patch set carries the rive fast-interp fixes (linear_mem_size
-- refreshes around growth, gated OOB diagnostics); a clone without them is
-- subtly wrong under memory growth.
local wamr = dependency.github('bytecodealliance/wasm-micro-runtime', 'WAMR-2.4.5', {
    patches = path.join(path.getdirectory(_SCRIPT), 'wamr_patches'),
})
-- Header-only simd library the fast interpreter's v128 handlers compile
-- against; upstream fetches the same tag through CMake FetchContent.
local simde = dependency.github('simd-everywhere/simde', 'v0.8.2')

-- Struct layouts in wamr's internal headers follow these; any rive TU that
-- includes them (the tier transplant) must compile with the identical set
-- or instance layouts silently diverge.
local wamrConfigDefines = {
    'WASM_ENABLE_INTERP=1',
    'WASM_ENABLE_FAST_INTERP=1',
    'WASM_ENABLE_AOT=1',
    'WASM_ENABLE_JIT=0',
    'WASM_ENABLE_LIBC_BUILTIN=1',
    'WASM_ENABLE_LIBC_WASI=1',
    'WASM_ENABLE_MODULE_INST_CONTEXT=1',
    'WASM_ENABLE_BULK_MEMORY=1',
    -- A host watchdog, not module fuel, bounds how long a call may run.
    'WASM_ENABLE_RIVE_INTERRUPT=1',
    -- Simde-backed v128 in the fast interpreter; scalar modules
    -- translate the same as before, simd modules stop being refused.
    'WASM_ENABLE_SIMD=1',
    'WASM_ENABLE_SIMDE=1',
    'WASM_DISABLE_STACK_HW_BOUND_CHECK=1',
    'BH_MALLOC=wasm_runtime_malloc',
    'BH_FREE=wasm_runtime_free',
}
-- Opt-in hw bounds serve AOT artifacts compiled --bounds-checks=0 only:
-- patch 0009 keeps the interpreter sw-checked and patch 0010 keeps sw
-- artifacts unwinding by checked returns, so the Luau lane never takes
-- a hardware trap. Native stack checks stay sw everywhere (artifacts
-- must carry --stack-bounds-checks=1).
if not _OPTIONS['wasm_hw_bounds'] then
    table.insert(wamrConfigDefines, 'WASM_DISABLE_HW_BOUND_CHECK=1')
end
-- Nintendo cross builds set this from packages/runtime_switch and run on a
-- Windows host, so every os.target() gate below must yield to it. nnSdk
-- ships no mmap family and no signal API, so the platform layer is ours.
local isNx = _OPTIONS['_nx_platform'] ~= nil
if isNx then
    -- Console trap forensics: no debugger reaches the dev kit, so name the
    -- wasm frames when a call dies. Config defines so every TU agrees on
    -- layouts.
    table.insert(wamrConfigDefines, 'WASM_ENABLE_DUMP_CALL_STACK=1')
    -- The dump's AOT side compiles against frame bookkeeping gated on this.
    table.insert(wamrConfigDefines, 'WASM_ENABLE_AOT_STACK_FRAME=1')
    -- Patch 0017: XIP modules loaded from sections execute text linked into
    -- the host image, the only AOT shape possible without runtime
    -- executable memory.
    table.insert(wamrConfigDefines, 'WASM_ENABLE_PRELINKED_AOT=1')
end
if os.target() == 'windows' and not isNx then
    -- We link wamr statically; under clang's msvc mode wasm_export.h and
    -- wasm_c_api.h otherwise declare every API dllimport.
    table.insert(wamrConfigDefines, 'WASM_RUNTIME_API_EXTERN=')
    table.insert(wamrConfigDefines, 'WASM_API_EXTERN=')
end

-- os.target() stays the host under --for_android; the option is the
-- truth for the platform dir.
local forAndroid = _OPTIONS['for_android'] ~= nil
local platformDir = forAndroid and 'android'
    or os.target() == 'linux' and 'linux'
    or os.target() == 'windows' and 'windows'
    or 'darwin'
-- Where platform_internal.h and the os_* implementations come from.
local platformPath = isNx
        and path.join(path.getdirectory(_SCRIPT), 'wamr_nx')
    or (wamr .. '/core/shared/platform/' .. platformDir)

project('wamr')
do
    kind('StaticLib')
    language('C')
    warnings('Off')
    -- Vendored dep nobody debugs into: an unoptimized interpreter is 6x
    -- slower, so every config builds it optimized. NDEBUG matches the CMake
    -- Release baseline; without it the interpreter's computed-goto dispatch
    -- tail-merges into a single prediction-killing branch.
    optimize('Speed')
    defines({ 'NDEBUG' })
    -- Replicated per-handler dispatch is what makes the fast interpreter
    -- fast; default heuristics tail-merge the computed gotos into a single
    -- indirect branch (+27% on box2d). Guarded by bench/check_dispatch_sites.
    -- LTO would run codegen at link where these -mllvm knobs cannot reach,
    -- so this library opts out and keeps its dispatch replication.
    buildoptions({ '-fno-lto' })
    -- The tail-dup knobs need llvm 19; older clangs build correct but
    -- slower dispatch, still caught by the dispatch-site guard where it runs.
    -- The probe runs host clang; cross toolchains (the NDK's) may reject
    -- the knobs the host accepts, so cross builds keep default dispatch.
    local devNull = os.ishost('windows') and 'NUL' or '/dev/null'
    local _, tailDupProbe = os.outputof(
        'clang -fsyntax-only -x c ' .. devNull ..
            ' -mllvm -tail-dup-pred-size=5000' ..
            ' -mllvm -tail-dup-succ-size=5000 2>&1'
    )
    if tailDupProbe == 0 and _OPTIONS['for_android'] == nil and not isNx then
        buildoptions({
            '-mllvm -tail-dup-pred-size=5000',
            '-mllvm -tail-dup-succ-size=5000',
        })
    end
    defines(wamrConfigDefines)
    filter({ 'system:macosx' })
    defines({ 'BH_PLATFORM_DARWIN' })
    filter({ 'system:linux' })
    defines({ 'BH_PLATFORM_LINUX' })
    filter({ 'system:android' })
    defines({ 'BH_PLATFORM_ANDROID' })
    filter({ 'system:windows' })
    defines({
        'BH_PLATFORM_WINDOWS',
        'HAVE_STRUCT_TIMESPEC',
        '_WINSOCK_DEPRECATED_NO_WARNINGS',
    })
    filter({})
    -- Per-lane arch beats host arch: universal builds compile both lanes
    -- on one machine and each must get its own invoke shim and relocs.
    local archOption = _OPTIONS['arch']
    local machine = os.outputof('uname -m')
    local isArm64
    -- 'host' is the option's default, not an explicit lane.
    if isNx then
        -- Windows hosted cross build, so neither the host arch nor --arch
        -- describes the target.
        isArm64 = true
    elseif archOption ~= nil and archOption ~= '' and archOption ~= 'host' then
        isArm64 = archOption == 'arm64' or archOption == 'aarch64'
    else
        isArm64 = machine == 'arm64' or machine == 'aarch64'
    end
    local isArm32 = forAndroid and archOption == 'arm'
    -- The quoted string define goes through buildoptions pre-escaped so both
    -- the gmake and ninja generators deliver the quotes to the compiler.
    if isArm32 then
        -- NDK armv7 compiles thumb2 with NEON/VFP by default. Upstream's
        -- thumb reloc does pointer arithmetic clang 18 makes a hard error.
        -- The THUMBV7 string matters: the aot loader matches it against
        -- wamrc's thumbv7 artifacts (bare THUMB defaults to thumbv4t).
        defines({ 'BUILD_TARGET_THUMB_VFP' })
        buildoptions({
            '-DBUILD_TARGET=\\"THUMBV7\\"',
            '-Wno-int-conversion',
        })
    elseif isArm64 then
        defines({ 'BUILD_TARGET_AARCH64' })
        buildoptions({ '-DBUILD_TARGET=\\"AARCH64\\"' })
    else
        defines({ 'BUILD_TARGET_X86_64' })
        buildoptions({ '-DBUILD_TARGET=\\"X86_64\\"' })
    end
    -- em64 is WAMR's x86-64 SysV invoke shim. With WASM_ENABLE_SIMD the
    -- invoke marshaling widens float slots to v128, so the shim must be the
    -- _simd variant or int registers load from the wrong offsets. arm32 has
    -- no simd invoke variant; its marshaling never widens. Windows takes
    -- the mingw shim: same Win64 ABI as MSVC targets, and GAS syntax that
    -- clang's integrated assembler handles without ml64.
    local invokeNative = isArm32 and 'invokeNative_thumb_vfp.s'
        or isArm64 and 'invokeNative_aarch64_simd.s'
        or os.target() == 'windows' and 'invokeNative_mingw_x64_simd.s'
        or 'invokeNative_em64_simd.s'
    local aotReloc = isArm32 and 'aot_reloc_thumb.c'
        or isArm64 and 'aot_reloc_aarch64.c'
        or 'aot_reloc_x86_64.c'
    includedirs({
        wamr .. '/core/iwasm/include',
        wamr .. '/core/iwasm/common',
        wamr .. '/core/iwasm/aot',
        wamr .. '/core/iwasm/interpreter',
        wamr .. '/core/shared/include',
        wamr .. '/core/shared/platform/include',
        -- platform_internal.h comes from the per-platform dir.
        platformPath,
        wamr .. '/core/shared/platform/common/libc-util',
        wamr .. '/core/shared/mem-alloc',
        -- wasm_runtime_common.h pulls the wasi primitives when libc-wasi is
        -- on, which our config always is.
        wamr .. '/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src',
        wamr .. '/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/include',
        wamr .. '/core/shared/utils',
        wamr .. '/core/shared/utils/uncommon',
        simde,
    })
    files({
        wamr .. '/core/iwasm/common/*.c',
        wamr .. '/core/iwasm/common/arch/' .. invokeNative,
        wamr .. '/core/iwasm/interpreter/wasm_loader.c',
        wamr .. '/core/iwasm/interpreter/wasm_runtime.c',
        wamr .. '/core/iwasm/interpreter/wasm_interp_fast.c',
        wamr .. '/core/iwasm/aot/*.c',
        wamr .. '/core/iwasm/aot/arch/' .. aotReloc,
        wamr .. '/core/iwasm/libraries/libc-builtin/*.c',
        wamr .. '/core/iwasm/libraries/libc-wasi/**.c',
        platformPath .. '/*.c',
        -- Windows replaces the posix layer wholesale; win_atomic is C++.
        (os.target() == 'windows' and not isNx)
                and (wamr .. '/core/shared/platform/windows/*.cpp')
            or (wamr .. '/core/shared/platform/common/posix/*.c'),
        wamr .. '/core/shared/platform/common/memory/*.c',
        wamr .. '/core/shared/platform/common/libc-util/*.c',
        wamr .. '/core/shared/mem-alloc/*.c',
        wamr .. '/core/shared/mem-alloc/ems/*.c',
        wamr .. '/core/shared/utils/*.c',
        wamr .. '/core/shared/utils/uncommon/*.c',
    })
    if os.target() == 'windows' and not isNx then
        -- Linux perf-map support; leans on pid_t/getpid.
        removefiles({ wamr .. '/core/iwasm/aot/aot_perf_map.c' })
    end
    if isNx then
        files({ platformPath .. '/*.cpp' })
        -- The posix mapping calls resolve against symbols nnSdk never
        -- exports, so nx_platform.cpp replaces the whole file.
        removefiles({ wamr .. '/core/shared/platform/common/posix/posix_memmap.c' })
    end
end

return {
    wamr = wamr,
    configDefines = wamrConfigDefines,
    internalIncludes = {
        wamr .. '/core/iwasm/interpreter',
        wamr .. '/core/iwasm/aot',
        wamr .. '/core/iwasm/common',
        wamr .. '/core/shared/include',
        wamr .. '/core/shared/platform/include',
        -- platform_internal.h comes from the per-platform dir.
        platformPath,
        wamr .. '/core/shared/mem-alloc',
        -- wasm_runtime_common.h pulls the wasi primitives when libc-wasi is
        -- on, which our config always is.
        wamr .. '/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/src',
        wamr .. '/core/iwasm/libraries/libc-wasi/sandboxed-system-primitives/include',
        wamr .. '/core/shared/utils',
    },
}
