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