blob: 4fc43a21e662ddae0149188a963b76a5f29e0b2b [file] [log] [blame]
// Copyright 2020 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
// NOTE: native_module_test.h contains documented examples of how to use this!
#ifndef IREE_VM_NATIVE_MODULE_H_
#define IREE_VM_NATIVE_MODULE_H_
#include <stdint.h>
#include "iree/base/api.h"
#include "iree/vm/instance.h"
#include "iree/vm/module.h"
#include "iree/vm/stack.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
enum iree_vm_native_import_flag_bits_e {
IREE_VM_NATIVE_IMPORT_REQUIRED = 1u << 0,
IREE_VM_NATIVE_IMPORT_OPTIONAL = 1u << 1,
};
typedef uint32_t iree_vm_native_import_flags_t;
// Describes an imported native function in a native module.
// All of this information is assumed read-only and will be referenced for the
// lifetime of any module created with the descriptor.
typedef struct iree_vm_native_import_descriptor_t {
// Flags controlling import resolution.
iree_vm_native_import_flags_t flags;
// Fully-qualified function name (for example, 'other_module.foo').
iree_string_view_t full_name;
} iree_vm_native_import_descriptor_t;
// Describes an exported native function in a native module.
// All of this information is assumed read-only and will be referenced for the
// lifetime of any module created with the descriptor.
typedef struct iree_vm_native_export_descriptor_t {
// Module-local function name (for example, 'foo' for function 'module.foo').
iree_string_view_t local_name;
// Calling convention string; see iree/vm/module.h for details.
iree_string_view_t calling_convention;
// An optional list of function-level reflection attributes.
iree_host_size_t attr_count;
const iree_string_pair_t* attrs;
} iree_vm_native_export_descriptor_t;
typedef iree_status_t(IREE_API_PTR* iree_vm_native_function_target_t)(
iree_vm_stack_t* stack, void* module, void* module_state);
enum iree_vm_native_function_flag_bits_t {
IREE_VM_NATIVE_FUNCTION_CALL_BEGIN = 1u << 0,
IREE_VM_NATIVE_FUNCTION_CALL_RESUME = 1u << 1,
};
typedef uint32_t iree_vm_native_function_flags_t;
typedef iree_status_t(IREE_API_PTR* iree_vm_native_function_shim_t)(
iree_vm_stack_t* stack, iree_vm_native_function_flags_t flags,
iree_byte_span_t args_storage, iree_byte_span_t rets_storage,
iree_vm_native_function_target_t target_fn, void* module,
void* module_state);
// An entry in the function pointer table.
typedef struct iree_vm_native_function_ptr_t {
// A shim function that takes the VM ABI and maps it to the target ABI.
iree_vm_native_function_shim_t shim;
// Target function passed to the shim.
iree_vm_native_function_target_t target;
} iree_vm_native_function_ptr_t;
// Describes a native module implementation by way of descriptor tables.
// All of this information is assumed read-only and will be referenced for the
// lifetime of any module created with the descriptor.
//
// The common native module code will use this descriptor to return metadata on
// query, lookup exported functions, and call module-provided implementation
// functions for state and call management.
typedef struct iree_vm_native_module_descriptor_t {
IREE_API_UNSTABLE
// Name of the module prefixed on all exported functions.
iree_string_view_t name;
// Version of the module used during dependency resolution.
uint32_t version;
// An optional list of module-level reflection attributes.
iree_host_size_t attr_count;
const iree_string_pair_t* attrs;
// Modules that the native module depends upon.
iree_host_size_t dependency_count;
const iree_vm_module_dependency_t* dependencies;
// All imported function descriptors.
// interface.resolve_import will be called for each import.
// Imports must be in order sorted by name compatible with
// iree_string_view_compare.
iree_host_size_t import_count;
const iree_vm_native_import_descriptor_t* imports;
// All exported function descriptors.
// Exports must be in order sorted by name compatible with
// iree_string_view_compare.
iree_host_size_t export_count;
const iree_vm_native_export_descriptor_t* exports;
// All function shims and target function pointers.
// These must match 1:1 with the exports if using the default begin_call
// implementation and are optional if overriding begin_call.
iree_host_size_t function_count;
const iree_vm_native_function_ptr_t* functions;
} iree_vm_native_module_descriptor_t;
// Returns the size, in bytes, of the allocation required for native modules.
// Callers may allocate more memory if they need additional storage.
IREE_API_EXPORT iree_host_size_t iree_vm_native_module_size(void);
// Creates a new native module with the metadata tables in |module_descriptor|.
// These tables will be used for reflection and function lookup, and the
// provided function pointers will be called when state needs to be managed or
// exported functions need to be called.
//
// An implementation |module_interface| providing functions for state management
// and function calls can be provided to override default implementations of
// functions. The structure will be copied and the self pointer will be passed
// to all |module_interface| functions.
//
// The provided |module_descriptor| will be referenced by the created module and
// must be kept live for the lifetime of the module.
IREE_API_EXPORT iree_status_t iree_vm_native_module_create(
const iree_vm_module_t* module_interface,
const iree_vm_native_module_descriptor_t* module_descriptor,
iree_vm_instance_t* instance, iree_allocator_t allocator,
iree_vm_module_t** out_module);
IREE_API_EXPORT iree_status_t iree_vm_native_module_initialize(
const iree_vm_module_t* module_interface,
const iree_vm_native_module_descriptor_t* module_descriptor,
iree_vm_instance_t* instance, iree_allocator_t allocator,
iree_vm_module_t* module);
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // IREE_VM_NATIVE_MODULE_H_