| // Copyright 2026 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // Wasm import declarations for the freestanding libc. | |
| // | |
| // These functions are provided by the JS host and appear as wasm imports in the | |
| // module's import section. The JS test harness, browser host, or Node.js loader | |
| // must supply implementations for all of them. | |
| // | |
| // The import_module groups related imports: | |
| // "iree_syscall" — basic OS-level operations (write, clock, exit) | |
| #ifndef IREE_WASM_LIBC_SYSCALL_IMPORTS_H_ | |
| #define IREE_WASM_LIBC_SYSCALL_IMPORTS_H_ | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #define IREE_WASM_IMPORT(module, name) \ | |
| __attribute__((import_module(module), import_name(name))) | |
| // Writes |length| bytes from |buffer| (a wasm linear memory pointer) to the | |
| // output identified by |fd|. fd 1 = stdout, fd 2 = stderr. Returns the number | |
| // of bytes written, or -1 on error. | |
| IREE_WASM_IMPORT("iree_syscall", "write") | |
| int32_t iree_wasm_write(int32_t fd, const void* buffer, int32_t length); | |
| // Returns the current monotonic time in nanoseconds. Backed by | |
| // performance.now() in the JS host (millisecond precision, microsecond | |
| // resolution when cross-origin isolated). | |
| IREE_WASM_IMPORT("iree_syscall", "clock_now_ns") | |
| int64_t iree_wasm_clock_now_ns(void); | |
| // Terminates the wasm module with the given exit code. The JS host should | |
| // record the status and stop executing wasm code. This function should not | |
| // return, but we don't mark it _Noreturn because the import mechanism can't | |
| // enforce that — the caller follows up with __builtin_trap(). | |
| IREE_WASM_IMPORT("iree_syscall", "exit") | |
| void iree_wasm_exit(int32_t status); | |
| // Reports an assertion failure to the JS host for diagnostic logging. | |
| // |expression|, |file|, and |function| are pointers into wasm linear memory | |
| // (null-terminated C strings). The JS host should log these and the line | |
| // number, then the caller traps. | |
| IREE_WASM_IMPORT("iree_syscall", "assert_fail") | |
| void iree_wasm_assert_fail_import(const char* expression, const char* file, | |
| int32_t line, const char* function); | |
| #endif // IREE_WASM_LIBC_SYSCALL_IMPORTS_H_ |