1 #ifndef HALIDE_WASM_EXECUTOR_H
2 #define HALIDE_WASM_EXECUTOR_H
3 
4 /** \file
5  *
6  * Support for running Halide-compiled Wasm code in-process.
7  * Bindings for parameters, extern calls, etc. are established and the
8  * Wasm code is executed. Allows calls to realize to work
9  * exactly as if native code had been run, but via a JavaScript/Wasm VM.
10  * Currently, only the WABT interpreter is supported.
11  */
12 
13 #include "Argument.h"
14 #include "JITModule.h"
15 #include "Parameter.h"
16 #include "Target.h"
17 #include "Type.h"
18 
19 namespace Halide {
20 namespace Internal {
21 
22 struct WasmModuleContents;
23 
24 /** Handle to compiled wasm code which can be called later. */
25 struct WasmModule {
26     Internal::IntrusivePtr<WasmModuleContents> contents;
27 
28     /** If the given target can be executed via the wasm executor, return true. */
29     static bool can_jit_target(const Target &target);
30 
31     /** Compile generated wasm code with a set of externs. */
32     static WasmModule compile(
33         const Module &module,
34         const std::vector<Argument> &arguments,
35         const std::string &fn_name,
36         const std::map<std::string, JITExtern> &externs,
37         const std::vector<JITModule> &extern_deps);
38 
39     /** Run generated previously compiled wasm code with a set of arguments. */
40     int run(const void **args);
41 };
42 
43 }  // namespace Internal
44 }  // namespace Halide
45 
46 #endif  // HALIDE_WASM_EXECUTOR_H
47