blob: dde49215853ced9e67c9b693fa397bbc9442d02b [file] [log] [blame]
.. Copyright (C) 2017-2022 Free Software Foundation, Inc.
Originally contributed by David Malcolm <dmalcolm@redhat.com>
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
<https://www.gnu.org/licenses/>.
.. 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`.