Home | History | Annotate | Line # | Download | only in topics
      1 .. Copyright (C) 2017-2022 Free Software Foundation, Inc.
      2    Originally contributed by David Malcolm <dmalcolm (a] redhat.com>
      3 
      4    This is free software: you can redistribute it and/or modify it
      5    under the terms of the GNU General Public License as published by
      6    the Free Software Foundation, either version 3 of the License, or
      7    (at your option) any later version.
      8 
      9    This program is distributed in the hope that it will be useful, but
     10    WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    General Public License for more details.
     13 
     14    You should have received a copy of the GNU General Public License
     15    along with this program.  If not, see
     16    <https://www.gnu.org/licenses/>.
     17 
     18 .. default-domain:: c
     19 
     20 Function pointers
     21 =================
     22 
     23 You can generate calls that use a function pointer via
     24 :c:func:`gcc_jit_context_new_call_through_ptr`.
     25 
     26 To do requires a :c:type:`gcc_jit_rvalue` of the correct function pointer type.
     27 
     28 Function pointers for a :c:type:`gcc_jit_function` can be obtained
     29 via :c:func:`gcc_jit_function_get_address`.
     30 
     31 .. function:: gcc_jit_rvalue *\
     32 	      gcc_jit_function_get_address (gcc_jit_function *fn,\
     33                                             gcc_jit_location *loc)
     34 
     35    Get the address of a function as an rvalue, of function pointer
     36    type.
     37 
     38    This entrypoint was added in :ref:`LIBGCCJIT_ABI_9`; you can test
     39    for its presence using
     40 
     41    .. code-block:: c
     42 
     43       #ifdef LIBGCCJIT_HAVE_gcc_jit_function_get_address
     44 
     45 Alternatively, given an existing function, you can obtain a pointer
     46 to it in :c:type:`gcc_jit_rvalue` form using
     47 :c:func:`gcc_jit_context_new_rvalue_from_ptr`, using a function pointer
     48 type obtained using :c:func:`gcc_jit_context_new_function_ptr_type`.
     49 
     50 Here's an example of creating a function pointer type corresponding to C's
     51 :c:type:`void (*) (int, int, int)`:
     52 
     53 .. code-block:: c
     54 
     55   gcc_jit_type *void_type =
     56     gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
     57   gcc_jit_type *int_type =
     58     gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
     59 
     60   /* Build the function ptr type.  */
     61   gcc_jit_type *param_types[3];
     62   param_types[0] = int_type;
     63   param_types[1] = int_type;
     64   param_types[2] = int_type;
     65 
     66   gcc_jit_type *fn_ptr_type =
     67     gcc_jit_context_new_function_ptr_type (ctxt, NULL,
     68 					   void_type,
     69 					   3, param_types, 0);
     70 
     71 .. function:: gcc_jit_type *\
     72 	      gcc_jit_context_new_function_ptr_type (gcc_jit_context *ctxt,\
     73 				       gcc_jit_location *loc,\
     74 				       gcc_jit_type *return_type,\
     75 				       int num_params,\
     76 				       gcc_jit_type **param_types,\
     77 				       int is_variadic)
     78 
     79    Generate a :c:type:`gcc_jit_type` for a function pointer with the
     80    given return type and parameters.
     81 
     82    Each of `param_types` must be non-`void`; `return_type` may be `void`.
     83