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)(void); 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])(void))(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 f(struct root_struct * s)277 int f(struct root_struct *s) 278 { 279 return 0; 280 } 281