Mercurial > hg > CbC > CbC_gcc
comparison gcc/jit/docs/topics/function-pointers.rst @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children | 84e7813d76e9 |
comparison
equal
deleted
inserted
replaced
68:561a7518be6b | 111:04ced10e8804 |
---|---|
1 .. Copyright (C) 2017 Free Software Foundation, Inc. | |
2 Originally contributed by David Malcolm <dmalcolm@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 <http://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. |