cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

btf_dump_test_case_syntax.c (4887B)


      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
     28typedef int int_t;
     29
     30typedef volatile const int * volatile const crazy_ptr_t;
     31
     32typedef int *****we_need_to_go_deeper_ptr_t;
     33
     34typedef 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;
     35
     36typedef int *ptr_arr_t[10];
     37
     38typedef void (*fn_ptr1_t)(int);
     39
     40typedef void (*printf_fn_t)(const char *, ...);
     41
     42/* ------ END-EXPECTED-OUTPUT ------ */
     43/*
     44 * While previous function pointers are pretty trivial (C-syntax-level
     45 * trivial), the following are deciphered here for future generations:
     46 *
     47 * - `fn_ptr2_t`: function, taking anonymous struct as a first arg and pointer
     48 *   to a function, that takes int and returns int, as a second arg; returning
     49 *   a pointer to a const pointer to a char. Equivalent to:
     50 *	typedef struct { int a; } s_t;
     51 *	typedef int (*fn_t)(int);
     52 *	typedef char * const * (*fn_ptr2_t)(s_t, fn_t);
     53 *
     54 * - `fn_complext_t`: pointer to a function returning struct and accepting
     55 *   union and struct. All structs and enum are anonymous and defined inline.
     56 *
     57 * - `signal_t: pointer to a function accepting a pointer to a function as an
     58 *   argument and returning pointer to a function as a result. Sane equivalent:
     59 *	typedef void (*signal_handler_t)(int);
     60 *	typedef signal_handler_t (*signal_ptr_t)(int, signal_handler_t);
     61 *
     62 * - fn_ptr_arr1_t: array of pointers to a function accepting pointer to
     63 *   a pointer to an int and returning pointer to a char. Easy.
     64 *
     65 * - fn_ptr_arr2_t: array of const pointers to a function taking no arguments
     66 *   and returning a const pointer to a function, that takes pointer to a
     67 *   `int -> char *` function and returns pointer to a char. Equivalent:
     68 *   typedef char * (*fn_input_t)(int);
     69 *   typedef char * (*fn_output_outer_t)(fn_input_t);
     70 *   typedef const fn_output_outer_t (* fn_output_inner_t)();
     71 *   typedef const fn_output_inner_t fn_ptr_arr2_t[5];
     72 */
     73/* ----- START-EXPECTED-OUTPUT ----- */
     74typedef char * const * (*fn_ptr2_t)(struct {
     75	int a;
     76}, int (*)(int));
     77
     78typedef struct {
     79	int a;
     80	void (*b)(int, struct {
     81		int c;
     82	}, union {
     83		char d;
     84		int e[5];
     85	});
     86} (*fn_complex_t)(union {
     87	void *f;
     88	char g[16];
     89}, struct {
     90	int h;
     91});
     92
     93typedef void (* (*signal_t)(int, void (*)(int)))(int);
     94
     95typedef char * (*fn_ptr_arr1_t[10])(int **);
     96
     97typedef char * (* (* const fn_ptr_arr2_t[5])())(char * (*)(int));
     98
     99struct struct_w_typedefs {
    100	int_t a;
    101	crazy_ptr_t b;
    102	we_need_to_go_deeper_ptr_t c;
    103	how_about_this_ptr_t d;
    104	ptr_arr_t e;
    105	fn_ptr1_t f;
    106	printf_fn_t g;
    107	fn_ptr2_t h;
    108	fn_complex_t i;
    109	signal_t j;
    110	fn_ptr_arr1_t k;
    111	fn_ptr_arr2_t l;
    112};
    113
    114typedef struct {
    115	int x;
    116	int y;
    117	int z;
    118} anon_struct_t;
    119
    120struct struct_fwd;
    121
    122typedef struct struct_fwd struct_fwd_t;
    123
    124typedef struct struct_fwd *struct_fwd_ptr_t;
    125
    126union union_fwd;
    127
    128typedef union union_fwd union_fwd_t;
    129
    130typedef union union_fwd *union_fwd_ptr_t;
    131
    132struct struct_empty {};
    133
    134struct struct_simple {
    135	int a;
    136	char b;
    137	const int_t *p;
    138	struct struct_empty s;
    139	enum e2 e;
    140	enum {
    141		ANON_VAL1 = 1,
    142		ANON_VAL2 = 2,
    143	} f;
    144	int arr1[13];
    145	enum e2 arr2[5];
    146};
    147
    148union union_empty {};
    149
    150union union_simple {
    151	void *ptr;
    152	int num;
    153	int_t num2;
    154	union union_empty u;
    155};
    156
    157struct struct_in_struct {
    158	struct struct_simple simple;
    159	union union_simple also_simple;
    160	struct {
    161		int a;
    162	} not_so_hard_as_well;
    163	union {
    164		int b;
    165		int c;
    166	} anon_union_is_good;
    167	struct {
    168		int d;
    169		int e;
    170	};
    171	union {
    172		int f;
    173		int g;
    174	};
    175};
    176
    177struct struct_in_array {};
    178
    179struct struct_in_array_typed {};
    180
    181typedef struct struct_in_array_typed struct_in_array_t[2];
    182
    183struct struct_with_embedded_stuff {
    184	int a;
    185	struct {
    186		int b;
    187		struct {
    188			struct struct_with_embedded_stuff *c;
    189			const char *d;
    190		} e;
    191		union {
    192			volatile long f;
    193			void * restrict g;
    194		};
    195	};
    196	union {
    197		const int_t *h;
    198		void (*i)(char, int, void *);
    199	} j;
    200	enum {
    201		K = 100,
    202		L = 200,
    203	} m;
    204	char n[16];
    205	struct {
    206		char o;
    207		int p;
    208		void (*q)(int);
    209	} r[5];
    210	struct struct_in_struct s[10];
    211	int t[11];
    212	struct struct_in_array (*u)[2];
    213	struct_in_array_t *v;
    214};
    215
    216struct float_struct {
    217	float f;
    218	const double *d;
    219	volatile long double *ld;
    220};
    221
    222struct root_struct {
    223	enum e1 _1;
    224	enum e2 _2;
    225	e2_t _2_1;
    226	e3_t _2_2;
    227	struct struct_w_typedefs _3;
    228	anon_struct_t _7;
    229	struct struct_fwd *_8;
    230	struct_fwd_t *_9;
    231	struct_fwd_ptr_t _10;
    232	union union_fwd *_11;
    233	union_fwd_t *_12;
    234	union_fwd_ptr_t _13;
    235	struct struct_with_embedded_stuff _14;
    236	struct float_struct _15;
    237};
    238
    239/* ------ END-EXPECTED-OUTPUT ------ */
    240
    241int f(struct root_struct *s)
    242{
    243	return 0;
    244}