brintos

brintos / linux-shallow public Read only

0
0
Text · 5.4 KiB · 29d01ff Raw
281 lines · c
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 Facebook7 */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-level78 * trivial), the following are deciphered here for future generations:79 *80 * - `fn_ptr2_t`: function, taking anonymous struct as a first arg and pointer81 *   to a function, that takes int and returns int, as a second arg; returning82 *   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 accepting88 *   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 an91 *   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 to96 *   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 arguments99 *   and returning a const pointer to a function, that takes pointer to a100 *   `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}281