Coverage Report

Created: 2026-11-12 06:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/lib/executor/engine/proxy.cpp
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
3
4
#include "executor/executor.h"
5
#include "system/fault.h"
6
7
#include <cstdint>
8
9
namespace WasmEdge {
10
namespace Executor {
11
12
thread_local Executor *Executor::This = nullptr;
13
thread_local Runtime::StackManager *Executor::CurrentStack = nullptr;
14
thread_local Executor::ExecutorContext Executor::ExecutionContext;
15
thread_local Executor::PendingExnStruct Executor::PendingExn;
16
thread_local std::array<StackTraceEntry, 256> Executor::StackTrace;
17
thread_local size_t Executor::StackTraceSize = 0;
18
19
namespace {
20
21
/// Helper for the call proxies: keep an escaped exception pending for the
22
/// post-call check in the compiled caller and skip the results.
23
Expect<void> callFromCompiled(Runtime::StackManager &StackMgr,
24
                              const Runtime::Instance::FunctionInstance &Func,
25
0
                              ValVariant *Rets, Expect<void> Res) noexcept {
26
0
  if (unlikely(!Res)) {
27
0
    if (Res.error() == ErrCode::Value::PendingException) {
28
0
      return {};
29
0
    }
30
0
    return Unexpect(Res.error());
31
0
  }
32
0
  const uint32_t ReturnsSize =
33
0
      static_cast<uint32_t>(Func.getFuncType().getReturnTypes().size());
34
0
  for (uint32_t I = 0; I < ReturnsSize; ++I) {
35
0
    Rets[ReturnsSize - 1 - I] = StackMgr.pop();
36
0
  }
37
0
  return {};
38
0
}
39
40
} // namespace
41
42
template <typename RetT, typename... ArgsT>
43
struct Executor::ProxyHelper<Expect<RetT> (Executor::*)(Runtime::StackManager &,
44
                                                        ArgsT...) noexcept> {
45
  template <Expect<RetT> (Executor::*Func)(Runtime::StackManager &,
46
                                           ArgsT...) noexcept>
47
0
  static auto proxy(ArgsT... Args) {
48
#if defined(__s390x__)
49
    // Required on s390x: materializing args prevents runtime failures in
50
    // release builds.
51
    auto Materialize = [](auto &&A) -> decltype(auto) {
52
      using T = std::decay_t<decltype(A)>;
53
      if constexpr (std::is_integral_v<T>) {
54
        volatile T Tmp = A;
55
        return Tmp;
56
      } else {
57
        return std::forward<decltype(A)>(A);
58
      }
59
    };
60
    Expect<RetT> Res = (This->*Func)(*CurrentStack, Materialize(Args)...);
61
#else
62
0
    Expect<RetT> Res = (This->*Func)(*CurrentStack, Args...);
63
0
#endif
64
0
    if (unlikely(!Res)) {
65
0
      Fault::emitFault(Res.error());
66
0
    }
67
0
    if constexpr (std::is_same_v<RetT, RefVariant>) {
68
0
      return (*Res).getRawData();
69
0
    } else if constexpr (!std::is_void_v<RetT>) {
70
0
      return *Res;
71
0
    }
72
0
  }
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyTrap>(unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyCall>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyCallIndirect>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyCallRef>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<WasmEdge::RefVariant, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyRefFunc>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<WasmEdge::RefVariant, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyStructNew>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, bool, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyStructGet>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, bool, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyStructSet>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<WasmEdge::RefVariant, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayNew>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<WasmEdge::RefVariant, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayNewData>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<WasmEdge::RefVariant, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayNewElem>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, bool, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayGet>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, bool, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArraySet>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<unsigned int, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::RefVariant) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayLen>(WasmEdge::RefVariant)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayFill>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayCopy>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayInitData>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyArrayInitElem>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<unsigned int, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::ValType) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyRefTest>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::ValType)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<WasmEdge::RefVariant, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::ValType) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyRefCast>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::ValType)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyTableInit>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyElemDrop>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned long, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyTableCopy>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned long, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<unsigned long, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::RefVariant, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyTableGrow>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::RefVariant, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, WasmEdge::RefVariant, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyTableFill>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, WasmEdge::RefVariant, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<unsigned long, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyMemGrow>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyMemInit>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned int, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyDataDrop>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned long, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyMemCopy>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, unsigned long, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, unsigned char, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyMemFill>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, unsigned char, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<unsigned long, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, unsigned long) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyMemAtomicNotify>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, unsigned long)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<unsigned long, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, unsigned long, long, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyMemAtomicWait>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned long, unsigned long, long, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void*, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, WasmEdge::Runtime::Instance::ModuleInstance::ModuleContext**) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyTableGetFuncSymbol>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, unsigned int, unsigned long, WasmEdge::Runtime::Instance::ModuleInstance::ModuleContext**)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void*, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::Runtime::Instance::ModuleInstance::ModuleContext**) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyRefGetFuncSymbol>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::RefVariant, WasmEdge::Runtime::Instance::ModuleInstance::ModuleContext**)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void*, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyFuncGetFuncSymbol>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyThrow>(WasmEdge::Runtime::Instance::ModuleInstance const*, unsigned int, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant> const*, unsigned int)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::RefVariant) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyThrowRef>(WasmEdge::RefVariant)
Unexecuted instantiation: auto WasmEdge::Executor::Executor::ProxyHelper<cxx20::expected<void, WasmEdge::ErrCode> (WasmEdge::Executor::Executor::*)(WasmEdge::Runtime::StackManager&, WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*, unsigned int, unsigned int) noexcept>::proxy<&WasmEdge::Executor::Executor::proxyCatchPop>(WasmEdge::Runtime::Instance::ModuleInstance const*, WasmEdge::Variant<unsigned int, int, unsigned long, long, float, double, unsigned __int128, __int128, cxx26::simd::basic_vec<unsigned long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<long, cxx26::simd::detail::vector_ext_abi<2> >, cxx26::simd::basic_vec<unsigned int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<int, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<unsigned short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<short, cxx26::simd::detail::vector_ext_abi<8> >, cxx26::simd::basic_vec<unsigned char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<signed char, cxx26::simd::detail::vector_ext_abi<16> >, cxx26::simd::basic_vec<float, cxx26::simd::detail::vector_ext_abi<4> >, cxx26::simd::basic_vec<double, cxx26::simd::detail::vector_ext_abi<2> >, WasmEdge::RefVariant>*, unsigned int, unsigned int)
73
};
74
75
#if defined(__clang_major__) && __clang_major__ >= 10
76
#pragma clang diagnostic push
77
#pragma clang diagnostic ignored "-Wc99-designator"
78
#endif
79
80
// Intrinsics table
81
const Executable::IntrinsicsTable Executor::Intrinsics = {
82
#if defined(_MSC_VER) && !defined(__clang__)
83
#define ENTRY(NAME, FUNC)                                                      \
84
  reinterpret_cast<void *>(&Executor::ProxyHelper<                             \
85
                           decltype(&Executor::FUNC)>::proxy<&Executor::FUNC>)
86
#else
87
#define ENTRY(NAME, FUNC)                                                      \
88
  [uint8_t(Executable::Intrinsics::NAME)] = reinterpret_cast<void *>(          \
89
      &Executor::ProxyHelper<decltype(&Executor::FUNC)>::proxy<                \
90
          &Executor::FUNC>)
91
#endif
92
    ENTRY(kTrap, proxyTrap),
93
    ENTRY(kCall, proxyCall),
94
    ENTRY(kCallIndirect, proxyCallIndirect),
95
    ENTRY(kCallRef, proxyCallRef),
96
    ENTRY(kRefFunc, proxyRefFunc),
97
    ENTRY(kStructNew, proxyStructNew),
98
    ENTRY(kStructGet, proxyStructGet),
99
    ENTRY(kStructSet, proxyStructSet),
100
    ENTRY(kArrayNew, proxyArrayNew),
101
    ENTRY(kArrayNewData, proxyArrayNewData),
102
    ENTRY(kArrayNewElem, proxyArrayNewElem),
103
    ENTRY(kArrayGet, proxyArrayGet),
104
    ENTRY(kArraySet, proxyArraySet),
105
    ENTRY(kArrayLen, proxyArrayLen),
106
    ENTRY(kArrayFill, proxyArrayFill),
107
    ENTRY(kArrayCopy, proxyArrayCopy),
108
    ENTRY(kArrayInitData, proxyArrayInitData),
109
    ENTRY(kArrayInitElem, proxyArrayInitElem),
110
    ENTRY(kRefTest, proxyRefTest),
111
    ENTRY(kRefCast, proxyRefCast),
112
    ENTRY(kTableInit, proxyTableInit),
113
    ENTRY(kElemDrop, proxyElemDrop),
114
    ENTRY(kTableCopy, proxyTableCopy),
115
    ENTRY(kTableGrow, proxyTableGrow),
116
    ENTRY(kTableFill, proxyTableFill),
117
    ENTRY(kMemGrow, proxyMemGrow),
118
    ENTRY(kMemInit, proxyMemInit),
119
    ENTRY(kDataDrop, proxyDataDrop),
120
    ENTRY(kMemCopy, proxyMemCopy),
121
    ENTRY(kMemFill, proxyMemFill),
122
    ENTRY(kMemAtomicNotify, proxyMemAtomicNotify),
123
    ENTRY(kMemAtomicWait, proxyMemAtomicWait),
124
    ENTRY(kTableGetFuncSymbol, proxyTableGetFuncSymbol),
125
    ENTRY(kRefGetFuncSymbol, proxyRefGetFuncSymbol),
126
    ENTRY(kFuncGetFuncSymbol, proxyFuncGetFuncSymbol),
127
    ENTRY(kThrow, proxyThrow),
128
    ENTRY(kThrowRef, proxyThrowRef),
129
    ENTRY(kCatchPop, proxyCatchPop),
130
#undef ENTRY
131
};
132
133
#if defined(__clang_major__) && __clang_major__ >= 10
134
#pragma clang diagnostic pop
135
#endif
136
137
Expect<void> Executor::proxyTrap(Runtime::StackManager &,
138
0
                                 const uint32_t Code) noexcept {
139
0
  return Unexpect(static_cast<ErrCategory>(Code >> 24), Code);
140
0
}
141
142
Expect<void>
143
Executor::proxyCall(Runtime::StackManager &StackMgr,
144
                    const Runtime::Instance::ModuleInstance *ModInst,
145
                    const uint32_t FuncIdx, const ValVariant *Args,
146
0
                    ValVariant *Rets) noexcept {
147
0
  const auto *FuncInst = getFuncInstByIdx(ModInst, FuncIdx);
148
0
  assuming(FuncInst);
149
0
  EXPECTED_TRY(checkLazyCompilation(FuncInst));
150
0
  const auto &FuncType = FuncInst->getFuncType();
151
0
  const uint32_t ParamsSize =
152
0
      static_cast<uint32_t>(FuncType.getParamTypes().size());
153
154
0
  for (uint32_t I = 0; I < ParamsSize; ++I) {
155
0
    StackMgr.push(Args[I]);
156
0
  }
157
158
0
  auto Instrs = FuncInst->getInstrs();
159
0
  auto Res =
160
0
      enterFunction(StackMgr, *FuncInst, Instrs.end(), false, true, ModInst)
161
0
          .and_then([&](AST::InstrView::iterator StartIt) {
162
0
            return execute(StackMgr, StartIt, Instrs.end());
163
0
          });
164
0
  return callFromCompiled(StackMgr, *FuncInst, Rets, std::move(Res));
165
0
}
166
167
Expect<void>
168
Executor::proxyCallIndirect(Runtime::StackManager &StackMgr,
169
                            const Runtime::Instance::ModuleInstance *ModInst,
170
                            const uint32_t TableIdx, const uint32_t FuncTypeIdx,
171
                            const uint64_t FuncIdx, const ValVariant *Args,
172
0
                            ValVariant *Rets) noexcept {
173
0
  const auto *TabInst = getTabInstByIdx(ModInst, TableIdx);
174
0
  assuming(TabInst);
175
176
0
  if (unlikely(FuncIdx >= TabInst->getSize())) {
177
0
    return Unexpect(ErrCode::Value::UndefinedElement);
178
0
  }
179
180
0
  auto Ref = TabInst->getRefAddr(FuncIdx);
181
0
  assuming(Ref);
182
0
  if (unlikely(Ref->isNull())) {
183
0
    return Unexpect(ErrCode::Value::UninitializedElement);
184
0
  }
185
186
0
  assuming(ModInst);
187
0
  const auto *FuncInst = retrieveFuncRef(*Ref);
188
0
  assuming(FuncInst);
189
190
0
  EXPECTED_TRY(checkLazyCompilation(FuncInst));
191
192
0
  if (!matchRef(ModInst, ValType(TypeCode::Ref, FuncTypeIdx), *Ref)) {
193
0
    return Unexpect(ErrCode::Value::IndirectCallTypeMismatch);
194
0
  }
195
196
0
  const auto &FuncType = FuncInst->getFuncType();
197
0
  const uint32_t ParamsSize =
198
0
      static_cast<uint32_t>(FuncType.getParamTypes().size());
199
200
0
  for (uint32_t I = 0; I < ParamsSize; ++I) {
201
0
    StackMgr.push(Args[I]);
202
0
  }
203
204
0
  auto Instrs = FuncInst->getInstrs();
205
0
  auto Res =
206
0
      enterFunction(StackMgr, *FuncInst, Instrs.end(), false, true, ModInst)
207
0
          .and_then([&](AST::InstrView::iterator StartIt) {
208
0
            return execute(StackMgr, StartIt, Instrs.end());
209
0
          });
210
0
  return callFromCompiled(StackMgr, *FuncInst, Rets, std::move(Res));
211
0
}
212
213
Expect<void>
214
Executor::proxyCallRef(Runtime::StackManager &StackMgr,
215
                       const Runtime::Instance::ModuleInstance *ModInst,
216
                       const RefVariant Ref, const ValVariant *Args,
217
0
                       ValVariant *Rets) noexcept {
218
0
  const auto *FuncInst = retrieveFuncRef(Ref);
219
0
  if (unlikely(!FuncInst)) {
220
0
    return Unexpect(ErrCode::Value::AccessNullFunc);
221
0
  }
222
223
0
  EXPECTED_TRY(checkLazyCompilation(FuncInst));
224
225
0
  const auto &FuncType = FuncInst->getFuncType();
226
0
  const uint32_t ParamsSize =
227
0
      static_cast<uint32_t>(FuncType.getParamTypes().size());
228
229
0
  for (uint32_t I = 0; I < ParamsSize; ++I) {
230
0
    StackMgr.push(Args[I]);
231
0
  }
232
233
0
  auto Instrs = FuncInst->getInstrs();
234
0
  auto Res =
235
0
      enterFunction(StackMgr, *FuncInst, Instrs.end(), false, true, ModInst)
236
0
          .and_then([&](AST::InstrView::iterator StartIt) {
237
0
            return execute(StackMgr, StartIt, Instrs.end());
238
0
          });
239
0
  return callFromCompiled(StackMgr, *FuncInst, Rets, std::move(Res));
240
0
}
241
242
Expect<RefVariant>
243
Executor::proxyRefFunc(Runtime::StackManager &,
244
                       const Runtime::Instance::ModuleInstance *ModInst,
245
0
                       const uint32_t FuncIdx) noexcept {
246
0
  auto *FuncInst = getFuncInstByIdx(ModInst, FuncIdx);
247
0
  assuming(FuncInst);
248
0
  return RefVariant(FuncInst->getDefType(), FuncInst);
249
0
}
250
251
Expect<RefVariant>
252
Executor::proxyStructNew(Runtime::StackManager &,
253
                         const Runtime::Instance::ModuleInstance *ModInst,
254
                         const uint32_t TypeIdx, const ValVariant *Args,
255
0
                         const uint32_t ArgSize) noexcept {
256
0
  if (Args == nullptr) {
257
0
    return structNew(ModInst, TypeIdx);
258
0
  } else {
259
0
    return structNew(ModInst, TypeIdx, Span<const ValVariant>(Args, ArgSize));
260
0
  }
261
0
}
262
263
Expect<void> Executor::proxyStructGet(
264
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
265
    const RefVariant Ref, const uint32_t TypeIdx, const uint32_t Off,
266
0
    const bool IsSigned, ValVariant *Ret) noexcept {
267
0
  EXPECTED_TRY(auto Val, structGet(ModInst, Ref, TypeIdx, Off, IsSigned));
268
0
  *Ret = Val;
269
0
  return {};
270
0
}
271
272
Expect<void>
273
Executor::proxyStructSet(Runtime::StackManager &,
274
                         const Runtime::Instance::ModuleInstance *ModInst,
275
                         const RefVariant Ref, const uint32_t TypeIdx,
276
0
                         const uint32_t Off, const ValVariant *Val) noexcept {
277
0
  return structSet(ModInst, Ref, *Val, TypeIdx, Off);
278
0
}
279
280
Expect<RefVariant> Executor::proxyArrayNew(
281
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
282
    const uint32_t TypeIdx, const uint32_t Length, const ValVariant *Args,
283
0
    const uint32_t ArgSize) noexcept {
284
0
  assuming(ArgSize == 0 || ArgSize == 1 || ArgSize == Length);
285
0
  if (ArgSize == 0) {
286
0
    return arrayNew(ModInst, TypeIdx, Length);
287
0
  } else if (ArgSize == 1) {
288
0
    return arrayNew(ModInst, TypeIdx, Length, {Args[0]});
289
0
  } else {
290
0
    return arrayNew(ModInst, TypeIdx, Length,
291
0
                    Span<const ValVariant>(Args, ArgSize));
292
0
  }
293
0
}
294
295
Expect<RefVariant> Executor::proxyArrayNewData(
296
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
297
    const uint32_t TypeIdx, const uint32_t DataIdx, const uint32_t Start,
298
0
    const uint32_t Length) noexcept {
299
0
  return arrayNewData(ModInst, TypeIdx, DataIdx, Start, Length);
300
0
}
301
302
Expect<RefVariant> Executor::proxyArrayNewElem(
303
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
304
    const uint32_t TypeIdx, const uint32_t ElemIdx, const uint32_t Start,
305
0
    const uint32_t Length) noexcept {
306
0
  return arrayNewElem(ModInst, TypeIdx, ElemIdx, Start, Length);
307
0
}
308
309
Expect<void> Executor::proxyArrayGet(
310
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
311
    const RefVariant Ref, const uint32_t TypeIdx, const uint32_t Idx,
312
0
    const bool IsSigned, ValVariant *Ret) noexcept {
313
0
  EXPECTED_TRY(auto Val, arrayGet(ModInst, Ref, TypeIdx, Idx, IsSigned));
314
0
  *Ret = Val;
315
0
  return {};
316
0
}
317
318
Expect<void>
319
Executor::proxyArraySet(Runtime::StackManager &,
320
                        const Runtime::Instance::ModuleInstance *ModInst,
321
                        const RefVariant Ref, const uint32_t TypeIdx,
322
0
                        const uint32_t Idx, const ValVariant *Val) noexcept {
323
0
  return arraySet(ModInst, Ref, *Val, TypeIdx, Idx);
324
0
}
325
326
Expect<uint32_t> Executor::proxyArrayLen(Runtime::StackManager &,
327
0
                                         const RefVariant Ref) noexcept {
328
0
  auto *Inst = Ref.getPtr<Runtime::Instance::ArrayInstance>();
329
0
  if (Inst == nullptr) {
330
0
    return Unexpect(ErrCode::Value::AccessNullArray);
331
0
  }
332
0
  return Inst->getLength();
333
0
}
334
335
Expect<void> Executor::proxyArrayFill(
336
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
337
    const RefVariant Ref, const uint32_t TypeIdx, const uint32_t Idx,
338
0
    const uint32_t Cnt, const ValVariant *Val) noexcept {
339
0
  return arrayFill(ModInst, Ref, *Val, TypeIdx, Idx, Cnt);
340
0
}
341
342
Expect<void> Executor::proxyArrayCopy(
343
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
344
    const RefVariant DstRef, const uint32_t DstTypeIdx, const uint32_t DstIdx,
345
    const RefVariant SrcRef, const uint32_t SrcTypeIdx, const uint32_t SrcIdx,
346
0
    const uint32_t Cnt) noexcept {
347
0
  return arrayCopy(ModInst, DstRef, DstTypeIdx, DstIdx, SrcRef, SrcTypeIdx,
348
0
                   SrcIdx, Cnt);
349
0
}
350
351
Expect<void> Executor::proxyArrayInitData(
352
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
353
    const RefVariant Ref, const uint32_t TypeIdx, const uint32_t DataIdx,
354
0
    const uint32_t DstIdx, const uint32_t SrcIdx, const uint32_t Cnt) noexcept {
355
0
  return arrayInitData(ModInst, Ref, TypeIdx, DataIdx, DstIdx, SrcIdx, Cnt);
356
0
}
357
358
Expect<void> Executor::proxyArrayInitElem(
359
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
360
    const RefVariant Ref, const uint32_t TypeIdx, const uint32_t ElemIdx,
361
0
    const uint32_t DstIdx, const uint32_t SrcIdx, const uint32_t Cnt) noexcept {
362
0
  return arrayInitElem(ModInst, Ref, TypeIdx, ElemIdx, DstIdx, SrcIdx, Cnt);
363
0
}
364
365
Expect<uint32_t>
366
Executor::proxyRefTest(Runtime::StackManager &,
367
                       const Runtime::Instance::ModuleInstance *ModInst,
368
0
                       const RefVariant Ref, ValType VTTest) noexcept {
369
0
  assuming(ModInst);
370
0
  return static_cast<uint32_t>(matchRef(ModInst, VTTest, Ref) ? 1 : 0);
371
0
}
372
373
Expect<RefVariant>
374
Executor::proxyRefCast(Runtime::StackManager &,
375
                       const Runtime::Instance::ModuleInstance *ModInst,
376
0
                       const RefVariant Ref, ValType VTCast) noexcept {
377
0
  assuming(ModInst);
378
0
  if (!matchRef(ModInst, VTCast, Ref)) {
379
0
    return Unexpect(ErrCode::Value::CastFailed);
380
0
  }
381
0
  return Ref;
382
0
}
383
384
// For the runtime value of `uint64_t`, arguments are expected to be extended
385
// to 64-bit width in the LLVM compiler regardless of whether the address type
386
// is 32 or 64 bits. On the other hand, a `uint64_t` return should handle the
387
// conversion to a 32- or 64-bit value according to the address type in the LLVM
388
// compiler.
389
390
Expect<void> Executor::proxyTableInit(
391
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
392
    const uint32_t TableIdx, const uint32_t ElemIdx, const uint64_t DstOff,
393
0
    const uint32_t SrcOff, const uint32_t Len) noexcept {
394
0
  auto *TabInst = getTabInstByIdx(ModInst, TableIdx);
395
0
  assuming(TabInst);
396
0
  auto *ElemInst = getElemInstByIdx(ModInst, ElemIdx);
397
0
  assuming(ElemInst);
398
0
  return TabInst->setRefs(ElemInst->getRefs(), DstOff, SrcOff, Len);
399
0
}
400
401
Expect<void>
402
Executor::proxyElemDrop(Runtime::StackManager &,
403
                        const Runtime::Instance::ModuleInstance *ModInst,
404
0
                        const uint32_t ElemIdx) noexcept {
405
0
  auto *ElemInst = getElemInstByIdx(ModInst, ElemIdx);
406
0
  assuming(ElemInst);
407
0
  ElemInst->clear();
408
0
  return {};
409
0
}
410
411
Expect<void> Executor::proxyTableCopy(
412
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
413
    const uint32_t TableIdxDst, const uint32_t TableIdxSrc,
414
0
    const uint64_t DstOff, const uint64_t SrcOff, const uint64_t Len) noexcept {
415
0
  auto *TabInstDst = getTabInstByIdx(ModInst, TableIdxDst);
416
0
  assuming(TabInstDst);
417
0
  auto *TabInstSrc = getTabInstByIdx(ModInst, TableIdxSrc);
418
0
  assuming(TabInstSrc);
419
420
0
  EXPECTED_TRY(auto Refs, TabInstSrc->getRefs(0, SrcOff + Len));
421
0
  return TabInstDst->setRefs(Refs, DstOff, SrcOff, Len);
422
0
}
423
424
Expect<uint64_t>
425
Executor::proxyTableGrow(Runtime::StackManager &,
426
                         const Runtime::Instance::ModuleInstance *ModInst,
427
                         const uint32_t TableIdx, const RefVariant Val,
428
0
                         const uint64_t NewSize) noexcept {
429
0
  auto *TabInst = getTabInstByIdx(ModInst, TableIdx);
430
0
  assuming(TabInst);
431
0
  const auto AddrType = TabInst->getTableType().getLimit().getAddrType();
432
0
  const uint64_t CurrTableSize = TabInst->getSize();
433
0
  if (likely(TabInst->growTable(NewSize, Val))) {
434
0
    return CurrTableSize;
435
0
  } else {
436
0
    switch (AddrType) {
437
0
    case AddressType::I32:
438
0
      return static_cast<uint32_t>(-1);
439
0
    case AddressType::I64:
440
0
      return static_cast<uint64_t>(-1);
441
0
    default:
442
0
      assumingUnreachable();
443
0
    }
444
0
  }
445
0
}
446
447
Expect<void>
448
Executor::proxyTableFill(Runtime::StackManager &,
449
                         const Runtime::Instance::ModuleInstance *ModInst,
450
                         const uint32_t TableIdx, const uint64_t Off,
451
0
                         const RefVariant Ref, const uint64_t Len) noexcept {
452
0
  auto *TabInst = getTabInstByIdx(ModInst, TableIdx);
453
0
  assuming(TabInst);
454
0
  return TabInst->fillRefs(Ref, Off, Len);
455
0
}
456
457
Expect<uint64_t>
458
Executor::proxyMemGrow(Runtime::StackManager &,
459
                       const Runtime::Instance::ModuleInstance *ModInst,
460
0
                       const uint32_t MemIdx, const uint64_t NewSize) noexcept {
461
0
  auto *MemInst = getMemInstByIdx(ModInst, MemIdx);
462
0
  assuming(MemInst);
463
0
  const auto AddrType = MemInst->getMemoryType().getLimit().getAddrType();
464
0
  const uint64_t CurrPageSize = MemInst->getPageSize();
465
0
  if (MemInst->growPage(NewSize)) {
466
0
    return CurrPageSize;
467
0
  } else {
468
0
    switch (AddrType) {
469
0
    case AddressType::I32:
470
0
      return static_cast<uint32_t>(-1);
471
0
    case AddressType::I64:
472
0
      return static_cast<uint64_t>(-1);
473
0
    default:
474
0
      assumingUnreachable();
475
0
    }
476
0
  }
477
0
}
478
479
Expect<void> Executor::proxyMemInit(
480
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
481
    const uint32_t MemIdx, const uint32_t DataIdx, const uint64_t DstOff,
482
0
    const uint32_t SrcOff, const uint32_t Len) noexcept {
483
0
  auto *MemInst = getMemInstByIdx(ModInst, MemIdx);
484
0
  assuming(MemInst);
485
0
  auto *DataInst = getDataInstByIdx(ModInst, DataIdx);
486
0
  assuming(DataInst);
487
0
  return MemInst->setBytes(DataInst->getData(), DstOff, SrcOff, Len);
488
0
}
489
490
Expect<void>
491
Executor::proxyDataDrop(Runtime::StackManager &,
492
                        const Runtime::Instance::ModuleInstance *ModInst,
493
0
                        const uint32_t DataIdx) noexcept {
494
0
  auto *DataInst = getDataInstByIdx(ModInst, DataIdx);
495
0
  assuming(DataInst);
496
0
  DataInst->clear();
497
0
  return {};
498
0
}
499
500
Expect<void> Executor::proxyMemCopy(
501
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
502
    const uint32_t DstMemIdx, const uint32_t SrcMemIdx, const uint64_t DstOff,
503
0
    const uint64_t SrcOff, const uint64_t Len) noexcept {
504
0
  auto *MemInstDst = getMemInstByIdx(ModInst, DstMemIdx);
505
0
  assuming(MemInstDst);
506
0
  auto *MemInstSrc = getMemInstByIdx(ModInst, SrcMemIdx);
507
0
  assuming(MemInstSrc);
508
509
0
  EXPECTED_TRY(auto Data, MemInstSrc->getBytes(SrcOff, Len));
510
0
  return MemInstDst->setBytes(Data, DstOff, 0, Len);
511
0
}
512
513
Expect<void>
514
Executor::proxyMemFill(Runtime::StackManager &,
515
                       const Runtime::Instance::ModuleInstance *ModInst,
516
                       const uint32_t MemIdx, const uint64_t Off,
517
0
                       const uint8_t Val, const uint64_t Len) noexcept {
518
0
  auto *MemInst = getMemInstByIdx(ModInst, MemIdx);
519
0
  assuming(MemInst);
520
0
  return MemInst->fillBytes(Val, Off, Len);
521
0
}
522
523
Expect<uint64_t>
524
Executor::proxyMemAtomicNotify(Runtime::StackManager &,
525
                               const Runtime::Instance::ModuleInstance *ModInst,
526
                               const uint32_t MemIdx, const uint64_t Offset,
527
0
                               const uint64_t Count) noexcept {
528
0
  auto *MemInst = getMemInstByIdx(ModInst, MemIdx);
529
0
  assuming(MemInst);
530
0
  return atomicNotify(*MemInst, Offset, Count);
531
0
}
532
533
Expect<uint64_t> Executor::proxyMemAtomicWait(
534
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
535
    const uint32_t MemIdx, const uint64_t Offset, const uint64_t Expected,
536
0
    const int64_t Timeout, const uint32_t BitWidth) noexcept {
537
0
  auto *MemInst = getMemInstByIdx(ModInst, MemIdx);
538
0
  assuming(MemInst);
539
540
0
  if (BitWidth == 64) {
541
0
    return atomicWait<uint64_t>(*MemInst, Offset, Expected, Timeout);
542
0
  } else if (BitWidth == 32) {
543
0
    return atomicWait<uint32_t>(*MemInst, Offset,
544
0
                                static_cast<uint32_t>(Expected), Timeout);
545
0
  }
546
0
  assumingUnreachable();
547
0
}
548
549
Expect<void *> Executor::proxyTableGetFuncSymbol(
550
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
551
    const uint32_t TableIdx, const uint32_t FuncTypeIdx, const uint64_t FuncIdx,
552
0
    Runtime::Instance::ModuleInstance::ModuleContext **CalleeCtxOut) noexcept {
553
0
  *CalleeCtxOut = nullptr;
554
0
  const auto *TabInst = getTabInstByIdx(ModInst, TableIdx);
555
0
  assuming(TabInst);
556
557
0
  if (unlikely(FuncIdx >= TabInst->getSize())) {
558
0
    return Unexpect(ErrCode::Value::UndefinedElement);
559
0
  }
560
561
0
  auto Ref = TabInst->getRefAddr(FuncIdx);
562
0
  assuming(Ref);
563
0
  if (unlikely(Ref->isNull())) {
564
0
    return Unexpect(ErrCode::Value::UninitializedElement);
565
0
  }
566
567
0
  const auto *FuncInst = retrieveFuncRef(*Ref);
568
0
  assuming(FuncInst);
569
  // Check the function type; the same module and type index need no matching.
570
0
  if ((FuncInst->getModule() != ModInst ||
571
0
       FuncInst->getTypeIndex() != FuncTypeIdx) &&
572
0
      !matchRef(ModInst, ValType(TypeCode::Ref, FuncTypeIdx), *Ref)) {
573
0
    return Unexpect(ErrCode::Value::IndirectCallTypeMismatch);
574
0
  }
575
576
0
  EXPECTED_TRY(checkLazyCompilation(FuncInst));
577
578
0
  if (unlikely(!FuncInst->isCompiledFunction())) {
579
0
    return nullptr;
580
0
  }
581
0
  if (FuncInst->getModule() != ModInst) {
582
0
    *CalleeCtxOut =
583
0
        &const_cast<Runtime::Instance::ModuleInstance *>(FuncInst->getModule())
584
0
             ->ModCtx;
585
0
  }
586
0
  return FuncInst->getSymbol().get();
587
0
}
588
589
Expect<void *> Executor::proxyRefGetFuncSymbol(
590
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
591
    const RefVariant Ref,
592
0
    Runtime::Instance::ModuleInstance::ModuleContext **CalleeCtxOut) noexcept {
593
0
  *CalleeCtxOut = nullptr;
594
0
  const auto *FuncInst = retrieveFuncRef(Ref);
595
0
  assuming(FuncInst);
596
0
  if (likely(FuncInst->isCompiledFunction())) {
597
0
    if (FuncInst->getModule() != ModInst) {
598
0
      *CalleeCtxOut = &const_cast<Runtime::Instance::ModuleInstance *>(
599
0
                           FuncInst->getModule())
600
0
                           ->ModCtx;
601
0
    }
602
0
    return FuncInst->getSymbol().get();
603
0
  }
604
0
  EXPECTED_TRY(checkLazyCompilation(FuncInst));
605
606
0
  if (unlikely(!FuncInst->isCompiledFunction())) {
607
0
    return nullptr;
608
0
  }
609
0
  if (FuncInst->getModule() != ModInst) {
610
0
    *CalleeCtxOut =
611
0
        &const_cast<Runtime::Instance::ModuleInstance *>(FuncInst->getModule())
612
0
             ->ModCtx;
613
0
  }
614
0
  return FuncInst->getSymbol().get();
615
0
}
616
617
Expect<void *> Executor::proxyFuncGetFuncSymbol(
618
    Runtime::StackManager &, const Runtime::Instance::ModuleInstance *ModInst,
619
0
    const uint32_t FuncIdx) noexcept {
620
0
  const auto *FuncInst = getFuncInstByIdx(ModInst, FuncIdx);
621
0
  assuming(FuncInst);
622
0
  if (likely(FuncInst->isCompiledFunction())) {
623
0
    return FuncInst->getSymbol().get();
624
0
  }
625
0
  EXPECTED_TRY(checkLazyCompilation(FuncInst));
626
627
0
  if (unlikely(!FuncInst->isCompiledFunction())) {
628
0
    return nullptr;
629
0
  }
630
0
  return FuncInst->getSymbol().get();
631
0
}
632
633
Expect<void>
634
Executor::proxyThrow(Runtime::StackManager &,
635
                     const Runtime::Instance::ModuleInstance *ModInst,
636
                     const uint32_t TagIdx, const ValVariant *Vals,
637
0
                     const uint32_t Num) noexcept {
638
0
  auto *TagInst = getTagInstByIdx(ModInst, TagIdx);
639
0
  assuming(TagInst);
640
0
  assuming(TagInst->getTagType().getAssocValSize() == Num);
641
0
  PendingExn.TagInst = TagInst;
642
0
  PendingExn.Inst = nullptr;
643
0
  PendingExn.setPayload(Span<const ValVariant>(Vals, Num));
644
0
  return {};
645
0
}
646
647
Expect<void> Executor::proxyThrowRef(Runtime::StackManager &,
648
0
                                     const RefVariant Ref) noexcept {
649
0
  const auto *ExnInst = Ref.getPtr<Runtime::Instance::ExceptionInstance>();
650
0
  if (unlikely(ExnInst == nullptr)) {
651
0
    return Unexpect(ErrCode::Value::AccessNullException);
652
0
  }
653
0
  PendingExn.TagInst = ExnInst->getTag();
654
0
  PendingExn.Inst = ExnInst;
655
0
  PendingExn.setPayload(ExnInst->getPayload());
656
0
  return {};
657
0
}
658
659
Expect<void>
660
Executor::proxyCatchPop(Runtime::StackManager &,
661
                        const Runtime::Instance::ModuleInstance *ModInst,
662
                        ValVariant *Out, const uint32_t PopPayload,
663
0
                        const uint32_t NeedRef) noexcept {
664
0
  auto *TagInst = PendingExn.TagInst;
665
0
  assuming(TagInst);
666
0
  uint32_t Idx = 0;
667
0
  if (PopPayload != 0) {
668
0
    Idx = TagInst->getTagType().getAssocValSize();
669
0
    std::copy_n(PendingExn.getPayload().begin(), Idx, Out);
670
0
  }
671
0
  if (NeedRef != 0) {
672
0
    const auto *Inst = PendingExn.Inst;
673
0
    if (Inst == nullptr) {
674
0
      assuming(ModInst);
675
0
      Inst = const_cast<Runtime::Instance::ModuleInstance *>(ModInst)
676
0
                 ->newException(
677
0
                     TagInst, std::vector<ValVariant>(PendingExn.getPayload()));
678
0
    }
679
0
    Out[Idx] = RefVariant(ValType(TypeCode::Ref, TypeCode::ExnRef), Inst);
680
0
  }
681
0
  PendingExn = {};
682
0
  return {};
683
0
}
684
685
} // namespace Executor
686
} // namespace WasmEdge