1 | // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) |
2 | |
3 | /* |
4 | * BTF-to-C dumper test for majority of C syntax quirks. |
5 | * |
6 | * Copyright (c) 2019 Facebook |
7 | */ |
8 | /* ----- START-EXPECTED-OUTPUT ----- */ |
9 | enum e1 { |
10 | A = 0, |
11 | B = 1, |
12 | }; |
13 | |
14 | enum e2 { |
15 | C = 100, |
16 | D = 4294967295, |
17 | E = 0, |
18 | }; |
19 | |
20 | typedef enum e2 e2_t; |
21 | |
22 | typedef enum { |
23 | F = 0, |
24 | G = 1, |
25 | H = 2, |
26 | } e3_t; |
27 | |
28 | /* ----- START-EXPECTED-OUTPUT ----- */ |
29 | /* |
30 | *enum e_byte { |
31 | * EBYTE_1 = 0, |
32 | * EBYTE_2 = 1, |
33 | *} __attribute__((mode(byte))); |
34 | * |
35 | */ |
36 | /* ----- END-EXPECTED-OUTPUT ----- */ |
37 | enum e_byte { |
38 | EBYTE_1, |
39 | EBYTE_2, |
40 | } __attribute__((mode(byte))); |
41 | |
42 | /* ----- START-EXPECTED-OUTPUT ----- */ |
43 | /* |
44 | *enum e_word { |
45 | * EWORD_1 = 0LL, |
46 | * EWORD_2 = 1LL, |
47 | *} __attribute__((mode(word))); |
48 | * |
49 | */ |
50 | /* ----- END-EXPECTED-OUTPUT ----- */ |
51 | enum e_word { |
52 | EWORD_1, |
53 | EWORD_2, |
54 | } __attribute__((mode(word))); /* force to use 8-byte backing for this enum */ |
55 | |
56 | /* ----- START-EXPECTED-OUTPUT ----- */ |
57 | enum e_big { |
58 | EBIG_1 = 1000000000000ULL, |
59 | }; |
60 | |
61 | typedef int int_t; |
62 | |
63 | typedef volatile const int * volatile const crazy_ptr_t; |
64 | |
65 | typedef int *****we_need_to_go_deeper_ptr_t; |
66 | |
67 | typedef volatile const we_need_to_go_deeper_ptr_t * restrict * volatile * const * restrict volatile * restrict const * volatile const * restrict volatile const how_about_this_ptr_t; |
68 | |
69 | typedef int *ptr_arr_t[10]; |
70 | |
71 | typedef void (*fn_ptr1_t)(int); |
72 | |
73 | typedef void (*printf_fn_t)(const char *, ...); |
74 | |
75 | /* ------ END-EXPECTED-OUTPUT ------ */ |
76 | /* |
77 | * While previous function pointers are pretty trivial (C-syntax-level |
78 | * trivial), the following are deciphered here for future generations: |
79 | * |
80 | * - `fn_ptr2_t`: function, taking anonymous struct as a first arg and pointer |
81 | * to a function, that takes int and returns int, as a second arg; returning |
82 | * a pointer to a const pointer to a char. Equivalent to: |
83 | * typedef struct { int a; } s_t; |
84 | * typedef int (*fn_t)(int); |
85 | * typedef char * const * (*fn_ptr2_t)(s_t, fn_t); |
86 | * |
87 | * - `fn_complex_t`: pointer to a function returning struct and accepting |
88 | * union and struct. All structs and enum are anonymous and defined inline. |
89 | * |
90 | * - `signal_t: pointer to a function accepting a pointer to a function as an |
91 | * argument and returning pointer to a function as a result. Sane equivalent: |
92 | * typedef void (*signal_handler_t)(int); |
93 | * typedef signal_handler_t (*signal_ptr_t)(int, signal_handler_t); |
94 | * |
95 | * - fn_ptr_arr1_t: array of pointers to a function accepting pointer to |
96 | * a pointer to an int and returning pointer to a char. Easy. |
97 | * |
98 | * - fn_ptr_arr2_t: array of const pointers to a function taking no arguments |
99 | * and returning a const pointer to a function, that takes pointer to a |
100 | * `int -> char *` function and returns pointer to a char. Equivalent: |
101 | * typedef char * (*fn_input_t)(int); |
102 | * typedef char * (*fn_output_outer_t)(fn_input_t); |
103 | * typedef const fn_output_outer_t (* fn_output_inner_t)(); |
104 | * typedef const fn_output_inner_t fn_ptr_arr2_t[5]; |
105 | */ |
106 | /* ----- START-EXPECTED-OUTPUT ----- */ |
107 | typedef char * const * (*fn_ptr2_t)(struct { |
108 | int a; |
109 | }, int (*)(int)); |
110 | |
111 | typedef struct { |
112 | int a; |
113 | void (*b)(int, struct { |
114 | int c; |
115 | }, union { |
116 | char d; |
117 | int e[5]; |
118 | }); |
119 | } (*fn_complex_t)(union { |
120 | void *f; |
121 | char g[16]; |
122 | }, struct { |
123 | int h; |
124 | }); |
125 | |
126 | typedef void (* (*signal_t)(int, void (*)(int)))(int); |
127 | |
128 | typedef char * (*fn_ptr_arr1_t[10])(int **); |
129 | |
130 | typedef char * (* (* const fn_ptr_arr2_t[5])())(char * (*)(int)); |
131 | |
132 | struct struct_w_typedefs { |
133 | int_t a; |
134 | crazy_ptr_t b; |
135 | we_need_to_go_deeper_ptr_t c; |
136 | how_about_this_ptr_t d; |
137 | ptr_arr_t e; |
138 | fn_ptr1_t f; |
139 | printf_fn_t g; |
140 | fn_ptr2_t h; |
141 | fn_complex_t i; |
142 | signal_t j; |
143 | fn_ptr_arr1_t k; |
144 | fn_ptr_arr2_t l; |
145 | }; |
146 | |
147 | typedef struct { |
148 | int x; |
149 | int y; |
150 | int z; |
151 | } anon_struct_t; |
152 | |
153 | struct struct_fwd; |
154 | |
155 | typedef struct struct_fwd struct_fwd_t; |
156 | |
157 | typedef struct struct_fwd *struct_fwd_ptr_t; |
158 | |
159 | union union_fwd; |
160 | |
161 | typedef union union_fwd union_fwd_t; |
162 | |
163 | typedef union union_fwd *union_fwd_ptr_t; |
164 | |
165 | struct struct_empty {}; |
166 | |
167 | struct struct_simple { |
168 | int a; |
169 | char b; |
170 | const int_t *p; |
171 | struct struct_empty s; |
172 | enum e2 e; |
173 | enum { |
174 | ANON_VAL1 = 1, |
175 | ANON_VAL2 = 2, |
176 | } f; |
177 | int arr1[13]; |
178 | enum e2 arr2[5]; |
179 | }; |
180 | |
181 | union union_empty {}; |
182 | |
183 | union union_simple { |
184 | void *ptr; |
185 | int num; |
186 | int_t num2; |
187 | union union_empty u; |
188 | }; |
189 | |
190 | struct struct_in_struct { |
191 | struct struct_simple simple; |
192 | union union_simple also_simple; |
193 | struct { |
194 | int a; |
195 | } not_so_hard_as_well; |
196 | union { |
197 | int b; |
198 | int c; |
199 | } anon_union_is_good; |
200 | struct { |
201 | int d; |
202 | int e; |
203 | }; |
204 | union { |
205 | int f; |
206 | int g; |
207 | }; |
208 | }; |
209 | |
210 | struct struct_in_array {}; |
211 | |
212 | struct struct_in_array_typed {}; |
213 | |
214 | typedef struct struct_in_array_typed struct_in_array_t[2]; |
215 | |
216 | struct struct_with_embedded_stuff { |
217 | int a; |
218 | struct { |
219 | int b; |
220 | struct { |
221 | struct struct_with_embedded_stuff *c; |
222 | const char *d; |
223 | } e; |
224 | union { |
225 | volatile long f; |
226 | void * restrict g; |
227 | }; |
228 | }; |
229 | union { |
230 | const int_t *h; |
231 | void (*i)(char, int, void *); |
232 | } j; |
233 | enum { |
234 | K = 100, |
235 | L = 200, |
236 | } m; |
237 | char n[16]; |
238 | struct { |
239 | char o; |
240 | int p; |
241 | void (*q)(int); |
242 | } r[5]; |
243 | struct struct_in_struct s[10]; |
244 | int t[11]; |
245 | struct struct_in_array (*u)[2]; |
246 | struct_in_array_t *v; |
247 | }; |
248 | |
249 | struct float_struct { |
250 | float f; |
251 | const double *d; |
252 | volatile long double *ld; |
253 | }; |
254 | |
255 | struct root_struct { |
256 | enum e1 _1; |
257 | enum e2 _2; |
258 | e2_t _2_1; |
259 | e3_t _2_2; |
260 | enum e_byte _100; |
261 | enum e_word _101; |
262 | enum e_big _102; |
263 | struct struct_w_typedefs _3; |
264 | anon_struct_t _7; |
265 | struct struct_fwd *_8; |
266 | struct_fwd_t *_9; |
267 | struct_fwd_ptr_t _10; |
268 | union union_fwd *_11; |
269 | union_fwd_t *_12; |
270 | union_fwd_ptr_t _13; |
271 | struct struct_with_embedded_stuff _14; |
272 | struct float_struct _15; |
273 | }; |
274 | |
275 | /* ------ END-EXPECTED-OUTPUT ------ */ |
276 | |
277 | int f(struct root_struct *s) |
278 | { |
279 | return 0; |
280 | } |
281 | |