annotate gcc/testsuite/jit.dg/test-pr66700-observing-write-through-ptr.c @ 132:d34655255c78

update gcc-8.2
author mir3636
date Thu, 25 Oct 2018 10:21:07 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Test of PR jit/66700. */
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 #include <stdlib.h>
kono
parents:
diff changeset
4 #include <stdio.h>
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 #include "libgccjit.h"
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 #include "harness.h"
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #ifdef __cplusplus
kono
parents:
diff changeset
11 extern "C" {
kono
parents:
diff changeset
12 #endif
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 extern void
kono
parents:
diff changeset
15 write_back_through_ptr (double *d);
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 #ifdef __cplusplus
kono
parents:
diff changeset
18 }
kono
parents:
diff changeset
19 #endif
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 void
kono
parents:
diff changeset
22 create_code (gcc_jit_context *ctxt, void *user_data)
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 /* Let's try to inject the equivalent of:
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 double
kono
parents:
diff changeset
27 test_caller_of_write_back_through_ptr (void)
kono
parents:
diff changeset
28 {
kono
parents:
diff changeset
29 double d;
kono
parents:
diff changeset
30 d = 4.0;
kono
parents:
diff changeset
31 write_back_through_ptr (&d);
kono
parents:
diff changeset
32 return d;
kono
parents:
diff changeset
33 }
kono
parents:
diff changeset
34 */
kono
parents:
diff changeset
35 gcc_jit_type *t_void =
kono
parents:
diff changeset
36 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_VOID);
kono
parents:
diff changeset
37 gcc_jit_type *t_double =
kono
parents:
diff changeset
38 gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_DOUBLE);
kono
parents:
diff changeset
39 gcc_jit_type *t_ptr_to_double =
kono
parents:
diff changeset
40 gcc_jit_type_get_pointer (t_double);
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 /* Declare the imported function. */
kono
parents:
diff changeset
43 gcc_jit_param *params[1];
kono
parents:
diff changeset
44 params[0] =
kono
parents:
diff changeset
45 gcc_jit_context_new_param (ctxt, NULL, t_ptr_to_double, "d");
kono
parents:
diff changeset
46 gcc_jit_function *called_fn =
kono
parents:
diff changeset
47 gcc_jit_context_new_function (ctxt, NULL,
kono
parents:
diff changeset
48 GCC_JIT_FUNCTION_IMPORTED,
kono
parents:
diff changeset
49 t_void,
kono
parents:
diff changeset
50 "write_back_through_ptr",
kono
parents:
diff changeset
51 1, params,
kono
parents:
diff changeset
52 0);
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 /* Build the test_fn. */
kono
parents:
diff changeset
55 gcc_jit_function *test_fn =
kono
parents:
diff changeset
56 gcc_jit_context_new_function (ctxt, NULL,
kono
parents:
diff changeset
57 GCC_JIT_FUNCTION_EXPORTED,
kono
parents:
diff changeset
58 t_double,
kono
parents:
diff changeset
59 "test_caller_of_write_back_through_ptr",
kono
parents:
diff changeset
60 0, NULL,
kono
parents:
diff changeset
61 0);
kono
parents:
diff changeset
62 gcc_jit_lvalue *d =
kono
parents:
diff changeset
63 gcc_jit_function_new_local (test_fn, NULL, t_double, "d");
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 gcc_jit_block *block = gcc_jit_function_new_block (test_fn, NULL);
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 /* "d = 0.0" */
kono
parents:
diff changeset
68 gcc_jit_block_add_assignment (
kono
parents:
diff changeset
69 block, NULL, d,
kono
parents:
diff changeset
70 gcc_jit_context_new_rvalue_from_int (ctxt, t_double, 4));
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 /* "write_back_through_ptr (&d);" */
kono
parents:
diff changeset
73 gcc_jit_rvalue *args[1];
kono
parents:
diff changeset
74 args[0] = gcc_jit_lvalue_get_address (d, NULL);
kono
parents:
diff changeset
75 gcc_jit_block_add_eval (
kono
parents:
diff changeset
76 block, NULL,
kono
parents:
diff changeset
77 gcc_jit_context_new_call (ctxt,
kono
parents:
diff changeset
78 NULL,
kono
parents:
diff changeset
79 called_fn,
kono
parents:
diff changeset
80 1, args));
kono
parents:
diff changeset
81 gcc_jit_block_end_with_return (block,
kono
parents:
diff changeset
82 NULL,
kono
parents:
diff changeset
83 gcc_jit_lvalue_as_rvalue (d));
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 extern void
kono
parents:
diff changeset
87 write_back_through_ptr (double *d)
kono
parents:
diff changeset
88 {
kono
parents:
diff changeset
89 *d = 5.600000;
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 void
kono
parents:
diff changeset
93 verify_code (gcc_jit_context *ctxt, gcc_jit_result *result)
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 typedef double (*fn_type) (void);
kono
parents:
diff changeset
96 CHECK_NON_NULL (result);
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 fn_type test_caller_of_write_back_through_ptr =
kono
parents:
diff changeset
99 (fn_type)gcc_jit_result_get_code (result,
kono
parents:
diff changeset
100 "test_caller_of_write_back_through_ptr");
kono
parents:
diff changeset
101 CHECK_NON_NULL (test_caller_of_write_back_through_ptr);
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 /* Call the JIT-generated function. */
kono
parents:
diff changeset
104 double d = test_caller_of_write_back_through_ptr ();
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 /* Verify that it correctly called "write_back_through_ptr". */
kono
parents:
diff changeset
107 CHECK_VALUE (d, 5.600000);
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109