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}