linux/tools/testing/selftests/bpf/progs/btf_dump_test_case_syntax.c
<<
>>
Prefs
   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 (* 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 int 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}
 245