.. Copyright (C) 2017-2022 Free Software Foundation, Inc. Originally contributed by David Malcolm This is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . .. default-domain:: c Function pointers ================= You can generate calls that use a function pointer via :c:func:`gcc_jit_context_new_call_through_ptr`. To do requires a :c:type:`gcc_jit_rvalue` of the correct function pointer type. Function pointers for a :c:type:`gcc_jit_function` can be obtained via :c:func:`gcc_jit_function_get_address`. .. function:: gcc_jit_rvalue *\ gcc_jit_function_get_address (gcc_jit_function *fn,\ gcc_jit_location *loc) Get the address of a function as an rvalue, of function pointer type. This entrypoint was added in :ref:`LIBGCCJIT_ABI_9`; you can test for its presence using .. code-block:: c #ifdef LIBGCCJIT_HAVE_gcc_jit_function_get_address Alternatively, given an existing function, you can obtain a pointer to it in :c:type:`gcc_jit_rvalue` form using :c:func:`gcc_jit_context_new_rvalue_from_ptr`, using a function pointer type obtained using :c:func:`gcc_jit_context_new_function_ptr_type`. Here's an example of creating a function pointer type corresponding to C's :expr:`void (*) (int, int, int)`: .. code-block:: c gcc_jit_type *void_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID); gcc_jit_type *int_type = gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT); /* Build the function ptr type. */ gcc_jit_type *param_types[3]; param_types[0] = int_type; param_types[1] = int_type; param_types[2] = int_type; gcc_jit_type *fn_ptr_type = gcc_jit_context_new_function_ptr_type (ctxt, NULL, void_type, 3, param_types, 0); .. function:: gcc_jit_type *\ gcc_jit_context_new_function_ptr_type (gcc_jit_context *ctxt,\ gcc_jit_location *loc,\ gcc_jit_type *return_type,\ int num_params,\ gcc_jit_type **param_types,\ int is_variadic) Generate a :c:type:`gcc_jit_type` for a function pointer with the given return type and parameters. Each of `param_types` must be non-`void`; `return_type` may be `void`.