Linux Audio

Check our new training course

Loading...
v6.13.7
  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 ----- */
  9enum e1 {
 10	A = 0,
 11	B = 1,
 12};
 13
 14enum e2 {
 15	C = 100,
 16	D = 4294967295,
 17	E = 0,
 18};
 19
 20typedef enum e2 e2_t;
 21
 22typedef 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 ----- */
 37enum 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 ----- */
 51enum 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 ----- */
 57enum e_big {
 58	EBIG_1 = 1000000000000ULL,
 59};
 60
 61typedef int int_t;
 62
 63typedef volatile const int * volatile const crazy_ptr_t;
 64
 65typedef int *****we_need_to_go_deeper_ptr_t;
 66
 67typedef 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
 69typedef int *ptr_arr_t[10];
 70
 71typedef void (*fn_ptr1_t)(int);
 72
 73typedef 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)(void);
104 *   typedef const fn_output_inner_t fn_ptr_arr2_t[5];
105 */
106/* ----- START-EXPECTED-OUTPUT ----- */
107typedef char * const * (*fn_ptr2_t)(struct {
108	int a;
109}, int (*)(int));
110
111typedef 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
126typedef void (* (*signal_t)(int, void (*)(int)))(int);
127
128typedef char * (*fn_ptr_arr1_t[10])(int **);
129
130typedef char * (* (* const fn_ptr_arr2_t[5])(void))(char * (*)(int));
131
132struct 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
147typedef struct {
148	int x;
149	int y;
150	int z;
151} anon_struct_t;
152
153struct struct_fwd;
154
155typedef struct struct_fwd struct_fwd_t;
156
157typedef struct struct_fwd *struct_fwd_ptr_t;
158
159union union_fwd;
160
161typedef union union_fwd union_fwd_t;
162
163typedef union union_fwd *union_fwd_ptr_t;
164
165struct struct_empty {};
166
167struct 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
181union union_empty {};
182
183union union_simple {
184	void *ptr;
185	int num;
186	int_t num2;
187	union union_empty u;
188};
189
190struct 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
210struct struct_in_array {};
211
212struct struct_in_array_typed {};
213
214typedef struct struct_in_array_typed struct_in_array_t[2];
215
216struct 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
249struct float_struct {
250	float f;
251	const double *d;
252	volatile long double *ld;
253};
254
255struct 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
277int f(struct root_struct *s)
278{
279	return 0;
280}
v6.8
  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 ----- */
  9enum e1 {
 10	A = 0,
 11	B = 1,
 12};
 13
 14enum e2 {
 15	C = 100,
 16	D = 4294967295,
 17	E = 0,
 18};
 19
 20typedef enum e2 e2_t;
 21
 22typedef 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 ----- */
 37enum 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 ----- */
 51enum 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 ----- */
 57enum e_big {
 58	EBIG_1 = 1000000000000ULL,
 59};
 60
 61typedef int int_t;
 62
 63typedef volatile const int * volatile const crazy_ptr_t;
 64
 65typedef int *****we_need_to_go_deeper_ptr_t;
 66
 67typedef 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
 69typedef int *ptr_arr_t[10];
 70
 71typedef void (*fn_ptr1_t)(int);
 72
 73typedef 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 ----- */
107typedef char * const * (*fn_ptr2_t)(struct {
108	int a;
109}, int (*)(int));
110
111typedef 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
126typedef void (* (*signal_t)(int, void (*)(int)))(int);
127
128typedef char * (*fn_ptr_arr1_t[10])(int **);
129
130typedef char * (* (* const fn_ptr_arr2_t[5])())(char * (*)(int));
131
132struct 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
147typedef struct {
148	int x;
149	int y;
150	int z;
151} anon_struct_t;
152
153struct struct_fwd;
154
155typedef struct struct_fwd struct_fwd_t;
156
157typedef struct struct_fwd *struct_fwd_ptr_t;
158
159union union_fwd;
160
161typedef union union_fwd union_fwd_t;
162
163typedef union union_fwd *union_fwd_ptr_t;
164
165struct struct_empty {};
166
167struct 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
181union union_empty {};
182
183union union_simple {
184	void *ptr;
185	int num;
186	int_t num2;
187	union union_empty u;
188};
189
190struct 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
210struct struct_in_array {};
211
212struct struct_in_array_typed {};
213
214typedef struct struct_in_array_typed struct_in_array_t[2];
215
216struct 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
249struct float_struct {
250	float f;
251	const double *d;
252	volatile long double *ld;
253};
254
255struct 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
277int f(struct root_struct *s)
278{
279	return 0;
280}