43#if defined(INFIX_OS_MACOS)
46#if defined(INFIX_OS_WINDOWS)
57 size_t num_fixed_args,
58 void * user_callback_fn,
62#if defined(INFIX_ABI_WINDOWS_X64)
66#elif defined(INFIX_ABI_SYSV_X64)
70#elif defined(INFIX_ABI_AAPCS64)
74#elif defined(INFIX_ABI_RISCV64)
89#if defined(INFIX_ABI_WINDOWS_X64)
91#elif defined(INFIX_ABI_SYSV_X64)
93#elif defined(INFIX_ABI_AAPCS64)
95#elif defined(INFIX_ABI_RISCV64)
108#if defined(INFIX_ABI_WINDOWS_X64)
110#elif defined(INFIX_ABI_SYSV_X64)
112#elif defined(INFIX_ABI_AAPCS64)
114#elif defined(INFIX_ABI_RISCV64)
126#if defined(INFIX_ABI_WINDOWS_X64)
128#elif defined(INFIX_ABI_SYSV_X64)
130#elif defined(INFIX_ABI_AAPCS64)
132#elif defined(INFIX_ABI_RISCV64)
167 if (len > SIZE_MAX - buf->
size) {
173 size_t new_capacity = buf->
capacity;
174 while (new_capacity < buf->size + len) {
175 if (new_capacity > SIZE_MAX / 2) {
183 if (new_code ==
nullptr) {
189 buf->
code = new_code;
277 size_t total_size = 0;
281 total_size +=
sizeof(
infix_type *) * num_args;
282 for (
size_t i = 0; i < num_args; ++i)
331 size_t num_fixed_args,
334 if (out_trampoline ==
nullptr ||
return_type ==
nullptr || (
arg_types ==
nullptr && num_args > 0)) {
343 for (
size_t i = 0; i < num_args; ++i) {
363 char canonical_sig[8192];
375 for (
size_t i = 0; i < num_args; ++i) {
377 tmp_args[i].
name =
nullptr;
381 sizeof(canonical_sig),
393 *out_trampoline = cached;
400 if (spec ==
nullptr) {
433 if (handle ==
nullptr) {
440 handle->
arena = target_arena;
447 if (handle->
arena ==
nullptr) {
459 for (
size_t i = 0; i < num_args; ++i) {
476 size_t sig_len = strlen(canonical_sig) + 1;
497 *out_trampoline = handle;
552 if (spec ==
nullptr) {
570 if (handle ==
nullptr) {
580 if (handle->
arena ==
nullptr) {
592 for (
size_t i = 0; i < num_args; ++i) {
647 *out_trampoline = handle;
677 size_t num_fixed_args,
678 void * target_function) {
684 out_trampoline,
nullptr,
return_type,
arg_types, num_args, num_fixed_args, target_function,
false);
703 size_t num_fixed_args) {
713 if (trampoline ==
nullptr)
739#if defined(INFIX_OS_WINDOWS)
741 GetSystemInfo(&sysInfo);
742 return sysInfo.dwPageSize;
745 return sysconf(_SC_PAGESIZE);
775 size_t num_fixed_args,
776 void * user_callback_fn,
779 if (out_context ==
nullptr ||
return_type ==
nullptr || num_fixed_args > num_args) {
788 if (
arg_types ==
nullptr && num_args > 0) {
792 for (
size_t i = 0; i < num_args; ++i) {
799 if (spec ==
nullptr) {
818 size_t context_alloc_size = (
sizeof(
infix_reverse_t) + page_size - 1) & ~(page_size - 1);
820 if (prot.
rw_ptr ==
nullptr) {
830 if (context->
arena ==
nullptr) {
838 context->
is_variadic = (num_fixed_args < num_args);
851 for (
size_t i = 0; i < num_args; ++i) {
908 *out_context = context;
912 if (prot.
rw_ptr !=
nullptr)
932 size_t num_fixed_args,
933 void * user_callback_fn) {
937 out_context,
return_type,
arg_types, num_args, num_fixed_args, user_callback_fn,
nullptr,
true);
954 size_t num_fixed_args,
960 out_context,
return_type,
arg_types, num_args, num_fixed_args, (
void *)user_callback_fn, user_data,
false);
970 if (reverse_trampoline ==
nullptr)
975 if (reverse_trampoline->
arena)
988 if (reverse_trampoline ==
nullptr)
998 if (reverse_trampoline ==
nullptr)
1005 const char * signature,
1006 void * target_function,
1016 size_t num_args = 0, num_fixed = 0;
1019 if (signature[0] ==
'@') {
1026 if (func_type == NULL) {
1053 for (
size_t i = 0; i < num_args; ++i)
1073 for (
size_t i = 0; i < num_args; ++i)
1078 out_trampoline, target_arena,
ret_type,
arg_types, num_args, num_fixed, target_function,
false);
1083 const char * signature,
1084 void * target_function,
1087 if (!signature || !target_function) {
1094 size_t num_args = 0, num_fixed = 0;
1107 for (
size_t i = 0; i < num_args; ++i)
1111 out_trampoline, NULL,
ret_type,
arg_types, num_args, num_fixed, target_function,
true);
1116 const char * signature,
1117 void * target_function,
1122 const char * signature,
1127 const char * signature,
1128 void * target_function,
1132 if (!signature || !target_function || !
handlers) {
1140 size_t num_args = 0, num_fixed = 0;
1158 for (
size_t i = 0; i < num_args; ++i)
1171 const char * signature,
1172 void * user_callback_fn,
1177 size_t num_args = 0, num_fixed = 0;
1190 for (
size_t i = 0; i < num_args; ++i)
1199 const char * signature,
1206 size_t num_args = 0, num_fixed = 0;
1219 for (
size_t i = 0; i < num_args; ++i)
1222 out_context,
ret_type,
arg_types, num_args, num_fixed, user_callback_fn, user_data);
1234#if defined(INFIX_ABI_WINDOWS_X64)
1235#include "../arch/x64/abi_win_x64.c"
1236#include "../arch/x64/abi_x64_emitters.c"
1237#elif defined(INFIX_ABI_SYSV_X64)
1238#include "../arch/x64/abi_sysv_x64.c"
1239#include "../arch/x64/abi_x64_emitters.c"
1240#elif defined(INFIX_ABI_AAPCS64)
1241#include "../arch/aarch64/abi_arm64.c"
1242#include "../arch/aarch64/abi_arm64_emitters.c"
1243#elif defined(INFIX_ABI_RISCV64)
1244#include "../arch/riscv/abi_riscv64.c"
1245#include "../arch/riscv/abi_riscv64_emitters.c"
1247#error "No supported ABI was selected for the unity build in trampoline.c."
infix_arena_t * arena
Definition 005_layouts.c:62
infix_registry_t * registry
Definition 008_registry_introspection.c:33
infix_status status
Definition 103_unions.c:61
void * args[]
Definition 202_in_structs.c:59
infix_type * return_type
Definition 202_in_structs.c:55
infix_type * arg_types[]
Definition 901_call_overhead.c:62
infix_type * ret_type
Definition 901_call_overhead.c:61
infix_direct_arg_handler_t handlers[2]
Definition 901_call_overhead.c:104
const infix_reverse_abi_spec g_arm64_reverse_spec
Definition abi_arm64.c:116
const infix_forward_abi_spec g_arm64_forward_spec
Definition abi_arm64.c:95
const infix_direct_forward_abi_spec g_arm64_direct_forward_spec
Definition abi_arm64.c:139
const infix_forward_abi_spec g_riscv64_forward_spec
Definition abi_riscv64.c:112
const infix_direct_forward_abi_spec g_riscv64_direct_forward_spec
Definition abi_riscv64.c:157
const infix_reverse_abi_spec g_riscv64_reverse_spec
Definition abi_riscv64.c:133
const infix_reverse_abi_spec g_sysv_x64_reverse_spec
Definition abi_sysv_x64.c:113
const infix_direct_forward_abi_spec g_sysv_x64_direct_forward_spec
Definition abi_sysv_x64.c:137
const infix_forward_abi_spec g_sysv_x64_forward_spec
Definition abi_sysv_x64.c:92
const infix_direct_forward_abi_spec g_win_x64_direct_forward_spec
Definition abi_win_x64.c:130
const infix_reverse_abi_spec g_win_x64_reverse_spec
Definition abi_win_x64.c:106
const infix_forward_abi_spec g_win_x64_forward_spec
Definition abi_win_x64.c:86
#define c23_nodiscard
Internal alias for the public INFIX_NODISCARD macro.
Definition compat_c23.h:92
void(* infix_direct_cif_func)(void *, void **)
A function pointer for a direct marshalling forward trampoline.
Definition infix.h:1489
INFIX_API c23_nodiscard infix_direct_cif_func infix_forward_get_direct_code(infix_forward_t *trampoline)
Gets the callable function pointer from a direct marshalling trampoline.
Definition trampoline.c:298
INFIX_API c23_nodiscard infix_status infix_forward_create_direct(infix_forward_t **out_trampoline, const char *signature, void *target_function, infix_direct_arg_handler_t *handlers, infix_registry_t *registry)
Creates a forward trampoline with direct, JIT-bound marshalling.
Definition trampoline.c:1126
@ INFIX_CODE_MISSING_REGISTRY
Definition infix.h:1417
@ INFIX_CODE_UNRESOLVED_NAMED_TYPE
Definition infix.h:1439
@ INFIX_CODE_INTEGER_OVERFLOW
Definition infix.h:1431
@ INFIX_CODE_UNEXPECTED_TOKEN
Definition infix.h:1427
@ INFIX_CODE_UNSUPPORTED_ABI
Definition infix.h:1437
@ INFIX_CODE_NULL_POINTER
Definition infix.h:1416
@ INFIX_CODE_OUT_OF_MEMORY
Definition infix.h:1421
@ INFIX_CATEGORY_ABI
Definition infix.h:1407
@ INFIX_CATEGORY_ALLOCATION
Definition infix.h:1405
@ INFIX_CATEGORY_GENERAL
Definition infix.h:1404
@ INFIX_CATEGORY_PARSER
Definition infix.h:1406
struct infix_type_t::@0::@1 pointer_info
Metadata for INFIX_TYPE_POINTER.
union infix_type_t::@0 meta
A union containing metadata specific to the type's category.
bool is_incomplete
Definition infix.h:282
infix_type * type
Definition infix.h:352
INFIX_API INFIX_NODISCARD infix_status infix_signature_parse(const char *, infix_arena_t **, infix_type **, infix_function_argument **, size_t *, size_t *, infix_registry_t *)
Parses a full function signature string into its constituent parts.
Definition signature.c:1127
struct infix_type_t::@0::@4 func_ptr_info
Metadata for INFIX_TYPE_REVERSE_TRAMPOLINE.
void(* infix_cif_func)(void *, void **)
A function pointer type for a bound forward trampoline.
Definition infix.h:470
void(* infix_unbound_cif_func)(void *, void *, void **)
A function pointer type for an unbound forward trampoline.
Definition infix.h:461
INFIX_API c23_nodiscard infix_status infix_reverse_create_callback(infix_reverse_t **out_context, const char *signature, void *user_callback_fn, infix_registry_t *registry)
Creates a type-safe reverse trampoline (callback).
Definition trampoline.c:1170
infix_struct_member * members
Definition infix.h:295
INFIX_API c23_nodiscard infix_status infix_forward_create_safe(infix_forward_t **out_trampoline, const char *signature, void *target_function, infix_registry_t *registry)
Creates a "safe" bound forward trampoline that catches native exceptions.
Definition trampoline.c:1082
infix_function_argument * args
Definition infix.h:308
c23_nodiscard infix_status infix_reverse_create_closure(infix_reverse_t **out_context, const char *signature, infix_closure_handler_fn user_callback_fn, void *user_data, infix_registry_t *registry)
Creates a generic reverse trampoline (closure) for stateful callbacks.
Definition trampoline.c:1198
infix_status
Enumerates the possible status codes returned by infix API functions.
Definition infix.h:486
const char * name
Definition infix.h:351
INFIX_API c23_nodiscard infix_status infix_forward_create_in_arena(infix_forward_t **out_trampoline, infix_arena_t *target_arena, const char *signature, void *target_function, infix_registry_t *registry)
Creates a "bound" forward trampoline within a user-provided arena.
Definition trampoline.c:1003
infix_type_category category
Definition infix.h:278
struct infix_type_t::@0::@2 aggregate_info
Metadata for INFIX_TYPE_STRUCT and INFIX_TYPE_UNION.
struct infix_type_t::@0::@3 array_info
Metadata for INFIX_TYPE_ARRAY.
struct infix_type_t * pointee_type
Definition infix.h:291
infix_type * type
Definition infix.h:338
struct infix_type_t * element_type
Definition infix.h:301
struct infix_type_t * return_type
Definition infix.h:307
size_t num_members
Definition infix.h:296
size_t num_fixed_args
Definition infix.h:310
INFIX_API c23_nodiscard infix_status infix_forward_create_unbound(infix_forward_t **out_trampoline, const char *signature, infix_registry_t *registry)
Creates an "unbound" forward trampoline from a signature string.
Definition trampoline.c:1121
void(* infix_closure_handler_fn)(infix_context_t *, void *, void **)
A function pointer type for a generic closure handler.
Definition infix.h:482
size_t num_args
Definition infix.h:309
INFIX_API c23_nodiscard infix_status infix_forward_create(infix_forward_t **out_trampoline, const char *signature, void *target_function, infix_registry_t *registry)
Creates a "bound" forward trampoline from a signature string.
Definition trampoline.c:1115
@ INFIX_ERROR_ALLOCATION_FAILED
Definition infix.h:488
@ INFIX_ERROR_PROTECTION_FAILED
Definition infix.h:492
@ INFIX_ERROR_UNSUPPORTED_ABI
Definition infix.h:490
@ INFIX_SUCCESS
Definition infix.h:487
@ INFIX_ERROR_INVALID_ARGUMENT
Definition infix.h:489
INFIX_API INFIX_NODISCARD infix_status infix_function_print(char *, size_t, const char *, const infix_type *, const infix_function_argument *, size_t, size_t, infix_print_dialect_t)
Serializes a function signature's components into a string.
Definition signature.c:2084
INFIX_API c23_nodiscard void * infix_reverse_get_code(const infix_reverse_t *reverse_trampoline)
Gets the native, callable C function pointer from a reverse trampoline.
Definition trampoline.c:987
INFIX_API c23_nodiscard infix_unbound_cif_func infix_forward_get_unbound_code(infix_forward_t *trampoline)
Gets the callable function pointer from an unbound forward trampoline.
Definition trampoline.c:288
INFIX_API c23_nodiscard infix_cif_func infix_forward_get_code(infix_forward_t *trampoline)
Gets the callable function pointer from a bound forward trampoline.
Definition trampoline.c:293
INFIX_API c23_nodiscard void * infix_reverse_get_user_data(const infix_reverse_t *reverse_trampoline)
Gets the user-provided data pointer from a closure context.
Definition trampoline.c:997
@ INFIX_DIALECT_SIGNATURE
Definition infix.h:1228
INFIX_API void infix_reverse_destroy(infix_reverse_t *reverse_trampoline)
Destroys a reverse trampoline and frees all associated memory.
Definition trampoline.c:969
INFIX_API c23_nodiscard infix_status infix_forward_create_manual(infix_forward_t **out_trampoline, infix_type *return_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *target_function)
Creates a bound forward trampoline from infix_type objects (Manual API).
Definition trampoline.c:673
INFIX_API c23_nodiscard infix_status infix_forward_create_unbound_manual(infix_forward_t **out_trampoline, infix_type *return_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args)
Creates an unbound forward trampoline from infix_type objects (Manual API).
Definition trampoline.c:699
INFIX_API c23_nodiscard infix_status infix_reverse_create_closure_manual(infix_reverse_t **out_context, infix_type *return_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, infix_closure_handler_fn user_callback_fn, void *user_data)
Creates a generic reverse trampoline (closure) from infix_type objects (Manual API).
Definition trampoline.c:950
INFIX_API c23_nodiscard infix_status infix_reverse_create_callback_manual(infix_reverse_t **out_context, infix_type *return_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *user_callback_fn)
Creates a type-safe reverse trampoline (callback) from infix_type objects (Manual API).
Definition trampoline.c:928
INFIX_API void infix_forward_destroy(infix_forward_t *trampoline)
Destroys a forward trampoline and frees all associated memory.
Definition trampoline.c:731
INFIX_API INFIX_NODISCARD void * infix_arena_alloc(infix_arena_t *, size_t, size_t)
Allocates a block of memory from an arena.
Definition arena.c:117
#define infix_calloc(nelem, size)
A macro that can be defined to override infix's allocator at compile time.
Definition infix.h:427
#define infix_free(ptr)
A macro that can be defined to override infix's allocator at compile time.
Definition infix.h:435
#define infix_memcpy
A macro that can be defined to override the default memcpy function.
Definition infix.h:439
INFIX_API INFIX_NODISCARD infix_arena_t * infix_arena_create(size_t)
Creates a new memory arena.
Definition arena.c:52
#define infix_memset
A macro that can be defined to override the default memset function.
Definition infix.h:443
INFIX_API void infix_arena_destroy(infix_arena_t *)
Destroys an arena and frees all memory allocated from it.
Definition arena.c:83
INFIX_API INFIX_NODISCARD const infix_type * infix_registry_lookup_type(const infix_registry_t *, const char *)
Retrieves the canonical infix_type object for a given name from the registry.
Definition type_registry.c:938
@ INFIX_TYPE_UNION
Definition infix.h:233
@ INFIX_TYPE_ARRAY
Definition infix.h:234
@ INFIX_TYPE_POINTER
Definition infix.h:231
@ INFIX_TYPE_NAMED_REFERENCE
Definition infix.h:239
@ INFIX_TYPE_REVERSE_TRAMPOLINE
Definition infix.h:235
@ INFIX_TYPE_STRUCT
Definition infix.h:232
#define INFIX_API
Symbol visibility macro.
Definition infix.h:114
#define INFIX_TRAMPOLINE_HEADROOM
Extra bytes to allocate in a trampoline's private arena.
Definition infix_config.h:213
Internal data structures, function prototypes, and constants.
@ INFIX_EXECUTABLE_REVERSE
Definition infix_internals.h:709
@ INFIX_EXECUTABLE_SAFE_FORWARD
Definition infix_internals.h:708
@ INFIX_EXECUTABLE_DIRECT
Definition infix_internals.h:710
@ INFIX_EXECUTABLE_FORWARD
Definition infix_internals.h:707
INFIX_INTERNAL void _infix_cache_insert(infix_forward_t *trampoline)
Definition cache.c:136
INFIX_INTERNAL c23_nodiscard bool infix_executable_make_executable(infix_executable_t *exec, infix_executable_category_t category, uint32_t prologue_size, uint32_t epilogue_offset)
Makes a block of JIT memory executable, completing the W^X process.
INFIX_INTERNAL void infix_executable_free(infix_executable_t exec)
Frees a block of executable memory and applies guard pages to prevent use-after-free.
Definition executor.c:863
INFIX_INTERNAL c23_nodiscard infix_protected_t infix_protected_alloc(size_t size)
Allocates a block of standard memory for later protection.
Definition executor.c:1055
INFIX_INTERNAL void infix_protected_free(infix_protected_t prot)
Frees a block of protected memory.
Definition executor.c:1089
INFIX_INTERNAL c23_nodiscard infix_executable_t infix_executable_alloc(size_t size)
Allocates a block of executable memory using the platform's W^X strategy.
Definition executor.c:280
INFIX_INTERNAL infix_type * _copy_type_graph_to_arena(infix_arena_t *, const infix_type *)
Performs a deep copy of a type graph into a destination arena.
Definition types.c:1128
INFIX_INTERNAL size_t _infix_estimate_graph_size(infix_arena_t *temp_arena, const infix_type *type)
Estimates the total memory required to deep-copy a complete type graph.
Definition types.c:1233
INFIX_INTERNAL c23_nodiscard bool infix_protected_make_readonly(infix_protected_t prot)
Makes a block of memory read-only for security hardening.
Definition executor.c:1109
INFIX_INTERNAL void _infix_clear_error(void)
Clears the thread-local error state.
Definition error.c:268
INFIX_INTERNAL void _infix_set_error(infix_error_category_t category, infix_error_code_t code, size_t position)
Sets the thread-local error state with detailed information.
Definition error.c:175
INFIX_INTERNAL void _infix_cache_release(infix_forward_t *trampoline)
Definition cache.c:258
INFIX_INTERNAL infix_forward_t * _infix_cache_lookup(const char *signature, void *target_fn, bool is_safe)
Definition cache.c:103
INFIX_INTERNAL void infix_internal_dispatch_callback_fn_impl(infix_reverse_t *context, void *return_value_ptr, void **args_array)
The universal C entry point for all reverse call trampolines.
Definition executor.c:1148
A dynamic buffer for staged machine code generation.
Definition infix_internals.h:210
uint8_t * code
Definition infix_internals.h:211
bool error
Definition infix_internals.h:214
size_t size
Definition infix_internals.h:213
size_t capacity
Definition infix_internals.h:212
infix_arena_t * arena
Definition infix_internals.h:215
Internal definition of a memory arena.
Definition infix_internals.h:143
bool error
Definition infix_internals.h:147
A complete layout blueprint for a forward call frame.
Definition infix_internals.h:307
uint32_t epilogue_offset
Definition infix_internals.h:323
uint32_t prologue_size
Definition infix_internals.h:322
A struct containing all the necessary handlers for a single function argument.
Definition infix.h:1552
A complete layout blueprint for a direct marshalling forward call frame.
Definition infix_internals.h:495
uint32_t epilogue_offset
Offset from the start of the JIT block to the epilogue.
Definition infix_internals.h:502
uint32_t prologue_size
Size of the generated prologue in bytes.
Definition infix_internals.h:501
Defines the ABI-specific implementation interface for direct marshalling forward trampolines.
Definition infix_internals.h:511
infix_status(* generate_direct_forward_call_instruction)(code_buffer *buf, infix_direct_call_frame_layout *layout)
Generates the call instruction to the target function.
Definition infix_internals.h:525
infix_status(* generate_direct_forward_argument_moves)(code_buffer *buf, infix_direct_call_frame_layout *layout)
Generates code to call marshallers and move arguments into their native locations.
Definition infix_internals.h:523
infix_status(* prepare_direct_forward_call_frame)(infix_arena_t *arena, infix_direct_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, infix_direct_arg_handler_t *handlers, void *target_fn)
Analyzes a function signature to create a complete direct call frame layout.
Definition infix_internals.h:513
infix_status(* generate_direct_forward_epilogue)(code_buffer *buf, infix_direct_call_frame_layout *layout, infix_type *ret_type)
Generates the function epilogue (handling return value, calling write-back handlers,...
Definition infix_internals.h:528
infix_status(* generate_direct_forward_prologue)(code_buffer *buf, infix_direct_call_frame_layout *layout)
Generates the function prologue (stack setup, saving registers).
Definition infix_internals.h:521
size_t size
Definition infix_internals.h:66
void * rw_ptr
Definition infix_internals.h:65
void * rx_ptr
Definition infix_internals.h:64
Defines the ABI-specific implementation interface for forward trampolines.
Definition infix_internals.h:356
infix_status(* generate_forward_prologue)(code_buffer *buf, infix_call_frame_layout *layout)
Generates the function prologue (stack setup, saving registers).
Definition infix_internals.h:385
infix_status(* generate_forward_argument_moves)(code_buffer *buf, infix_call_frame_layout *layout, infix_type **arg_types, size_t num_args, size_t num_fixed_args)
Generates code to move arguments from the void** array into registers and/or the stack.
Definition infix_internals.h:395
infix_status(* generate_forward_call_instruction)(code_buffer *buf, infix_call_frame_layout *layout)
Generates the call instruction to the target function.
Definition infix_internals.h:406
infix_status(* prepare_forward_call_frame)(infix_arena_t *arena, infix_call_frame_layout **out_layout, infix_type *ret_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *target_fn)
Analyzes a function signature to create a complete call frame layout.
Definition infix_internals.h:372
infix_status(* generate_forward_epilogue)(code_buffer *buf, infix_call_frame_layout *layout, infix_type *ret_type)
Generates the function epilogue (handling return value, restoring stack, returning).
Definition infix_internals.h:414
Internal definition of a forward trampoline handle.
Definition infix_internals.h:90
infix_executable_t exec
Definition infix_internals.h:94
void * target_fn
Definition infix_internals.h:99
size_t num_args
Definition infix_internals.h:97
bool is_external_arena
Definition infix_internals.h:92
size_t num_fixed_args
Definition infix_internals.h:98
infix_type ** arg_types
Definition infix_internals.h:96
infix_type * return_type
Definition infix_internals.h:95
size_t ref_count
Definition infix_internals.h:102
bool is_safe
Definition infix_internals.h:101
infix_arena_t * arena
Definition infix_internals.h:91
char * signature
Definition infix_internals.h:103
bool is_direct_trampoline
Definition infix_internals.h:100
Describes a single argument to a C function.
Definition infix.h:350
Internal representation of a memory block that will be made read-only.
Definition infix_internals.h:77
void * rw_ptr
Definition infix_internals.h:78
Internal definition of a named type registry.
Definition infix_internals.h:188
Defines the ABI-specific implementation interface for reverse trampolines.
Definition infix_internals.h:425
infix_status(* generate_reverse_argument_marshalling)(code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
Generates code to marshal arguments from their native locations (registers/stack) into a void** array...
Definition infix_internals.h:450
infix_status(* prepare_reverse_call_frame)(infix_arena_t *arena, infix_reverse_call_frame_layout **out_layout, infix_reverse_t *context)
Analyzes a function signature to create a layout for the reverse call stub's stack frame.
Definition infix_internals.h:433
infix_status(* generate_reverse_prologue)(code_buffer *buf, infix_reverse_call_frame_layout *layout)
Generates the reverse stub's prologue (stack setup).
Definition infix_internals.h:442
infix_status(* generate_reverse_dispatcher_call)(code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
Generates the call to the universal C dispatcher (infix_internal_dispatch_callback_fn_impl).
Definition infix_internals.h:460
infix_status(* generate_reverse_epilogue)(code_buffer *buf, infix_reverse_call_frame_layout *layout, infix_reverse_t *context)
Generates the reverse stub's epilogue (handling return value, restoring stack, returning).
Definition infix_internals.h:470
A complete layout blueprint for a reverse call frame.
Definition infix_internals.h:332
uint32_t prologue_size
Definition infix_internals.h:340
Internal definition of a reverse trampoline (callback/closure) handle.
Definition infix_internals.h:119
infix_type * return_type
Definition infix_internals.h:123
void * user_data
Definition infix_internals.h:129
void * user_callback_fn
Definition infix_internals.h:128
infix_executable_t exec
Definition infix_internals.h:121
infix_internal_dispatch_callback_fn internal_dispatcher
Definition infix_internals.h:131
size_t num_args
Definition infix_internals.h:125
size_t num_fixed_args
Definition infix_internals.h:126
infix_protected_t protected_ctx
Definition infix_internals.h:122
bool is_variadic
Definition infix_internals.h:127
infix_forward_t * cached_forward_trampoline
Definition infix_internals.h:133
infix_arena_t * arena
Definition infix_internals.h:120
infix_type ** arg_types
Definition infix_internals.h:124
A semi-opaque structure that describes a C type.
Definition infix.h:276
Definition trampoline.c:203
const infix_type * type
Definition trampoline.c:204
struct visited_node_t * next
Definition trampoline.c:205
void emit_byte(code_buffer *buf, uint8_t byte)
A convenience wrapper to append a single byte to a code buffer.
Definition trampoline.c:196
static bool _is_type_graph_resolved_recursive(const infix_type *type, visited_node_t *visited_head)
Definition trampoline.c:219
const infix_forward_abi_spec * get_current_forward_abi_spec()
Gets the ABI v-table for forward calls for the current platform.
Definition trampoline.c:88
void code_buffer_init(code_buffer *buf, infix_arena_t *arena)
Initializes a code buffer for JIT code generation.
Definition trampoline.c:145
static infix_status _infix_forward_create_impl(infix_forward_t **out_trampoline, infix_arena_t *target_arena, infix_type *return_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *target_fn, bool is_safe)
Definition trampoline.c:326
static bool _is_type_graph_resolved(const infix_type *type)
Definition trampoline.c:258
void emit_int64(code_buffer *buf, int64_t value)
A convenience wrapper to append a 64-bit integer (little-endian) to a code buffer.
Definition trampoline.c:200
void _infix_forward_destroy_internal(infix_forward_t *trampoline)
Definition trampoline.c:712
void code_buffer_append(code_buffer *buf, const void *data, size_t len)
Appends raw bytes to a code buffer, reallocating within its arena if necessary.
Definition trampoline.c:164
static infix_status _infix_forward_create_direct_impl(infix_forward_t **out_trampoline, infix_type *return_type, infix_type **arg_types, size_t num_args, void *target_fn, infix_direct_arg_handler_t *handlers)
Definition trampoline.c:539
static size_t get_page_size()
Definition trampoline.c:738
void emit_int32(code_buffer *buf, int32_t value)
A convenience wrapper to append a 32-bit integer (little-endian) to a code buffer.
Definition trampoline.c:198
static size_t _estimate_metadata_size(infix_arena_t *temp_arena, infix_type *return_type, infix_type **arg_types, size_t num_args)
Definition trampoline.c:273
const infix_direct_forward_abi_spec * get_current_direct_forward_abi_spec()
Gets the ABI v-table for direct marshalling forward calls for the current platform.
Definition trampoline.c:125
static infix_status _infix_reverse_create_internal(infix_reverse_t **out_context, infix_type *return_type, infix_type **arg_types, size_t num_args, size_t num_fixed_args, void *user_callback_fn, void *user_data, bool is_callback)
Definition trampoline.c:771
const infix_reverse_abi_spec * get_current_reverse_abi_spec()
Gets the ABI v-table for reverse calls for the current platform.
Definition trampoline.c:107
A header for conditionally compiled debugging utilities.
static void infix_dump_hex(c23_maybe_unused const void *data, c23_maybe_unused size_t size, c23_maybe_unused const char *title)
Definition utility.h:112