18 signed char m_signed_char
;
19 unsigned char m_unsigned_char
;
22 unsigned short m_unsigned_short
;
25 unsigned int m_unsigned_int
;
28 unsigned long m_unsigned_long
;
30 long long m_long_long
;
31 unsigned long long m_unsigned_long_long
;
43 #ifdef __SIZEOF_INT128__
52 long double m_long_double
;
54 const char *m_const_char_ptr
;
62 int *test_ptr
= &test_int
;
64 const char *test_string
= "test_string";
67 create_code (gcc_jit_context
*ctxt
, void *user_data
)
69 /* Let's try to inject the equivalent of:
72 test_caller (struct zoo *z)
74 for each fields "m_field":
75 z->m_field = ...some data;
78 gcc_jit_type
*void_type
=
79 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_VOID
);
81 #define CREATE_FIELD(TYPE, NAME) \
82 gcc_jit_context_new_field ( \
84 gcc_jit_context_get_type (ctxt, TYPE), \
87 gcc_jit_field
*field_m_void_ptr
=
88 CREATE_FIELD (GCC_JIT_TYPE_VOID_PTR
, "m_void_ptr");
90 gcc_jit_field
*field_m_bool
=
91 CREATE_FIELD (GCC_JIT_TYPE_BOOL
, "m_bool");
93 gcc_jit_field
*field_m_char
=
94 CREATE_FIELD (GCC_JIT_TYPE_CHAR
, "m_char");
95 gcc_jit_field
*field_m_signed_char
=
96 CREATE_FIELD (GCC_JIT_TYPE_SIGNED_CHAR
, "m_signed_char");
97 gcc_jit_field
*field_m_unsigned_char
=
98 CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_CHAR
, "m_unsigned_char");
100 gcc_jit_field
*field_m_short
=
101 CREATE_FIELD (GCC_JIT_TYPE_SHORT
, "m_short");
102 gcc_jit_field
*field_m_unsigned_short
=
103 CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_SHORT
, "m_unsigned_short");
105 gcc_jit_field
*field_m_int
=
106 CREATE_FIELD (GCC_JIT_TYPE_INT
, "m_int");
107 gcc_jit_field
*field_m_unsigned_int
=
108 CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_INT
, "m_unsigned_int");
110 gcc_jit_field
*field_m_long
=
111 CREATE_FIELD (GCC_JIT_TYPE_LONG
, "m_long");
112 gcc_jit_field
*field_m_unsigned_long
=
113 CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_LONG
, "m_unsigned_long");
115 gcc_jit_field
*field_m_long_long
=
116 CREATE_FIELD (GCC_JIT_TYPE_LONG_LONG
, "m_long_long");
117 gcc_jit_field
*field_m_unsigned_long_long
=
118 CREATE_FIELD (GCC_JIT_TYPE_UNSIGNED_LONG_LONG
, "m_unsigned_long_long");
120 gcc_jit_field
*field_m_u8
=
121 CREATE_FIELD (GCC_JIT_TYPE_UINT8_T
, "m_u8");
122 gcc_jit_field
*field_m_u16
=
123 CREATE_FIELD (GCC_JIT_TYPE_UINT16_T
, "m_u16");
124 gcc_jit_field
*field_m_u32
=
125 CREATE_FIELD (GCC_JIT_TYPE_UINT32_T
, "m_u32");
126 gcc_jit_field
*field_m_u64
=
127 CREATE_FIELD (GCC_JIT_TYPE_UINT64_T
, "m_u64");
129 gcc_jit_field
*field_m_i8
=
130 CREATE_FIELD (GCC_JIT_TYPE_INT8_T
, "m_i8");
131 gcc_jit_field
*field_m_i16
=
132 CREATE_FIELD (GCC_JIT_TYPE_INT16_T
, "m_i16");
133 gcc_jit_field
*field_m_i32
=
134 CREATE_FIELD (GCC_JIT_TYPE_INT32_T
, "m_i32");
135 gcc_jit_field
*field_m_i64
=
136 CREATE_FIELD (GCC_JIT_TYPE_INT64_T
, "m_i64");
138 #ifdef __SIZEOF_INT128__
139 gcc_jit_field
*field_m_u128
=
140 CREATE_FIELD (GCC_JIT_TYPE_UINT128_T
, "m_u128");
141 gcc_jit_field
*field_m_i128
=
142 CREATE_FIELD (GCC_JIT_TYPE_INT128_T
, "m_i128");
145 /* Signed int type with sizeof (int): */
146 gcc_jit_type
*sized_int_type
=
147 gcc_jit_context_get_int_type (ctxt
, sizeof (int), 1);
148 gcc_jit_field
*field_m_sized_int_type
=
149 gcc_jit_context_new_field (
150 ctxt
, NULL
, sized_int_type
, "m_sized_int_type");
152 gcc_jit_field
*field_m_float
=
153 CREATE_FIELD (GCC_JIT_TYPE_FLOAT
, "m_float");
154 gcc_jit_field
*field_m_double
=
155 CREATE_FIELD (GCC_JIT_TYPE_DOUBLE
, "m_double");
156 gcc_jit_field
*field_m_long_double
=
157 CREATE_FIELD (GCC_JIT_TYPE_LONG_DOUBLE
, "m_long_double");
159 gcc_jit_field
*field_m_const_char_ptr
=
160 CREATE_FIELD (GCC_JIT_TYPE_CONST_CHAR_PTR
, "m_const_char_ptr");
162 gcc_jit_field
*field_m_size_t
=
163 CREATE_FIELD (GCC_JIT_TYPE_SIZE_T
, "m_size_t");
165 gcc_jit_field
*field_m_FILE_ptr
=
166 CREATE_FIELD (GCC_JIT_TYPE_FILE_PTR
, "m_FILE_ptr");
170 gcc_jit_field
*zoo_fields
[] = {
177 field_m_unsigned_char
,
180 field_m_unsigned_short
,
183 field_m_unsigned_int
,
186 field_m_unsigned_long
,
189 field_m_unsigned_long_long
,
201 #ifdef __SIZEOF_INT128__
206 field_m_sized_int_type
,
212 field_m_const_char_ptr
,
219 gcc_jit_type
*zoo_type
=
220 gcc_jit_struct_as_type (
221 gcc_jit_context_new_struct_type (
225 sizeof (zoo_fields
) / sizeof (zoo_fields
[0]),
228 gcc_jit_type
*zoo_ptr_type
=
229 gcc_jit_type_get_pointer (zoo_type
);
231 /* Build the test_fn. */
232 gcc_jit_param
*param_z
=
233 gcc_jit_context_new_param (ctxt
, NULL
, zoo_ptr_type
, "z");
234 gcc_jit_function
*test_fn
=
235 gcc_jit_context_new_function (ctxt
, NULL
,
236 GCC_JIT_FUNCTION_EXPORTED
,
241 gcc_jit_block
*block
= gcc_jit_function_new_block (test_fn
, NULL
);
243 /* Write to the various fields of param "z". */
244 #define ASSIGN(FIELD, EXPR) \
245 gcc_jit_block_add_assignment ( \
247 gcc_jit_rvalue_dereference_field ( \
248 gcc_jit_param_as_rvalue (param_z), \
255 gcc_jit_context_new_rvalue_from_ptr (
257 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_VOID_PTR
),
261 gcc_jit_context_new_rvalue_from_int (
263 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_BOOL
), 1))
266 gcc_jit_context_new_rvalue_from_int (
268 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_CHAR
),
270 ASSIGN(field_m_signed_char
,
271 gcc_jit_context_new_rvalue_from_int (
273 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_SIGNED_CHAR
),
275 ASSIGN(field_m_unsigned_char
,
276 gcc_jit_context_new_rvalue_from_int (
278 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UNSIGNED_CHAR
),
281 ASSIGN(field_m_short
,
282 gcc_jit_context_new_rvalue_from_int (
284 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_SHORT
),
286 ASSIGN(field_m_unsigned_short
,
287 gcc_jit_context_new_rvalue_from_int (
289 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UNSIGNED_SHORT
),
293 gcc_jit_context_new_rvalue_from_int (
295 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT
),
297 ASSIGN(field_m_unsigned_int
,
298 gcc_jit_context_new_rvalue_from_int (
300 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UNSIGNED_INT
),
304 gcc_jit_context_new_rvalue_from_int (
306 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_LONG
),
308 ASSIGN(field_m_unsigned_long
,
309 gcc_jit_context_new_rvalue_from_int (
311 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UNSIGNED_LONG
),
314 ASSIGN(field_m_long_long
,
315 gcc_jit_context_new_rvalue_from_int (
317 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_LONG_LONG
),
319 ASSIGN(field_m_unsigned_long_long
,
320 gcc_jit_context_new_rvalue_from_int (
322 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UNSIGNED_LONG_LONG
),
326 gcc_jit_context_new_rvalue_from_int (
328 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UINT8_T
),
331 gcc_jit_context_new_rvalue_from_int (
333 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UINT16_T
),
336 gcc_jit_context_new_rvalue_from_int (
338 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UINT32_T
),
341 gcc_jit_context_new_rvalue_from_int (
343 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UINT64_T
),
347 gcc_jit_context_new_rvalue_from_int (
349 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT8_T
),
352 gcc_jit_context_new_rvalue_from_int (
354 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT16_T
),
357 gcc_jit_context_new_rvalue_from_int (
359 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT32_T
),
362 gcc_jit_context_new_rvalue_from_int (
364 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT64_T
),
367 #ifdef __SIZEOF_INT128__
369 gcc_jit_context_new_rvalue_from_int (
371 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_UINT128_T
),
374 gcc_jit_context_new_rvalue_from_int (
376 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT128_T
),
380 ASSIGN(field_m_sized_int_type
,
381 gcc_jit_context_new_rvalue_from_int (
383 sized_int_type
, 500))
385 ASSIGN(field_m_float
,
386 gcc_jit_context_new_rvalue_from_double (
388 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_FLOAT
),
390 ASSIGN(field_m_double
,
391 gcc_jit_context_new_rvalue_from_double (
393 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_DOUBLE
),
395 ASSIGN(field_m_long_double
,
396 gcc_jit_context_new_rvalue_from_double (
398 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_LONG_DOUBLE
),
401 ASSIGN(field_m_const_char_ptr
,
402 gcc_jit_context_new_rvalue_from_ptr (
404 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_CONST_CHAR_PTR
),
405 (char *)test_string
))
407 ASSIGN(field_m_size_t
,
408 gcc_jit_context_new_rvalue_from_int (
410 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_SIZE_T
),
411 sizeof (struct zoo
)))
413 ASSIGN(field_m_FILE_ptr
,
414 gcc_jit_context_new_rvalue_from_ptr (
416 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_FILE_PTR
),
421 gcc_jit_block_end_with_void_return (block
, NULL
);
425 verify_code (gcc_jit_context
*ctxt
, gcc_jit_result
*result
)
427 typedef void (*fn_type
) (struct zoo
*);
428 CHECK_NON_NULL (result
);
431 (fn_type
)gcc_jit_result_get_code (result
, "test_types");
432 CHECK_NON_NULL (test_types
);
435 memset (&z
, 0xf0, sizeof (z
));
437 /* Call the JIT-generated function. */
440 /* Verify that it correctly wrote to the various fields. */
441 CHECK_VALUE (z
.m_void_ptr
, test_ptr
);
443 CHECK_VALUE (z
.m_bool
, true);
445 CHECK_VALUE (z
.m_char
, 'V');
446 CHECK_VALUE (z
.m_signed_char
, -37);
447 CHECK_VALUE (z
.m_unsigned_char
, 200);
449 CHECK_VALUE (z
.m_short
, -900);
450 CHECK_VALUE (z
.m_unsigned_short
, 0x3000);
452 CHECK_VALUE (z
.m_int
, -0x2000);
453 CHECK_VALUE (z
.m_unsigned_int
, 1234567);
455 CHECK_VALUE (z
.m_long
, -5);
456 CHECK_VALUE (z
.m_unsigned_long
, 12345678);
458 CHECK_VALUE (z
.m_long_long
, -42);
459 CHECK_VALUE (z
.m_unsigned_long_long
, 123456789);
461 CHECK_VALUE (z
.m_u8
, 123);
462 CHECK_VALUE (z
.m_u16
, 12345);
463 CHECK_VALUE (z
.m_u32
, 123456789);
464 CHECK_VALUE (z
.m_u64
, 123456789);
466 CHECK_VALUE (z
.m_i8
, -1);
467 CHECK_VALUE (z
.m_i16
, -2);
468 CHECK_VALUE (z
.m_i32
, -3);
469 CHECK_VALUE (z
.m_i64
, -4);
471 #ifdef __SIZEOF_INT128__
472 CHECK_VALUE (z
.m_u128
, 123456789);
473 CHECK_VALUE (z
.m_i128
, -5);
476 CHECK_VALUE (z
.m_sized_int_type
, 500);
478 CHECK_VALUE (z
.m_float
, 3.141f
);
479 CHECK_VALUE (z
.m_double
, 3.141);
480 CHECK_VALUE (z
.m_long_double
, 3.141);
482 CHECK_VALUE (z
.m_const_char_ptr
, test_string
);
484 CHECK_VALUE (z
.m_size_t
, sizeof (struct zoo
));
486 CHECK_VALUE (z
.m_FILE_ptr
, stderr
);
488 if (sizeof(long) == 8)
489 CHECK (gcc_jit_compatible_types (
490 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_LONG
),
491 gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_INT64_T
)));
493 CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_FLOAT
)), sizeof (float));
494 CHECK_VALUE (gcc_jit_type_get_size (gcc_jit_context_get_type (ctxt
, GCC_JIT_TYPE_DOUBLE
)), sizeof (double));