1c1f5e7ddSAndrii Nakryiko #include <stdint.h> 2c1f5e7ddSAndrii Nakryiko #include <stdbool.h> 35705d705SAndrii Nakryiko 45705d705SAndrii Nakryiko void preserce_ptr_sz_fn(long x) {} 55705d705SAndrii Nakryiko 65705d705SAndrii Nakryiko #define __bpf_aligned __attribute__((aligned(8))) 75705d705SAndrii Nakryiko 8ee2eb063SAndrii Nakryiko /* 9ee2eb063SAndrii Nakryiko * KERNEL 10ee2eb063SAndrii Nakryiko */ 11ee2eb063SAndrii Nakryiko 12ee2eb063SAndrii Nakryiko struct core_reloc_kernel_output { 13ee2eb063SAndrii Nakryiko int valid[10]; 14d25c5e23SAndrii Nakryiko char comm[sizeof("test_progs")]; 15ee2eb063SAndrii Nakryiko int comm_len; 16ee2eb063SAndrii Nakryiko }; 17c1f5e7ddSAndrii Nakryiko 18002d3afcSAndrii Nakryiko /* 19002d3afcSAndrii Nakryiko * FLAVORS 20002d3afcSAndrii Nakryiko */ 21002d3afcSAndrii Nakryiko struct core_reloc_flavors { 22002d3afcSAndrii Nakryiko int a; 23002d3afcSAndrii Nakryiko int b; 24002d3afcSAndrii Nakryiko int c; 25002d3afcSAndrii Nakryiko }; 26002d3afcSAndrii Nakryiko 27002d3afcSAndrii Nakryiko /* this is not a flavor, as it doesn't have triple underscore */ 28002d3afcSAndrii Nakryiko struct core_reloc_flavors__err_wrong_name { 29002d3afcSAndrii Nakryiko int a; 30002d3afcSAndrii Nakryiko int b; 31002d3afcSAndrii Nakryiko int c; 32002d3afcSAndrii Nakryiko }; 33ec6438a9SAndrii Nakryiko 34ec6438a9SAndrii Nakryiko /* 35ec6438a9SAndrii Nakryiko * NESTING 36ec6438a9SAndrii Nakryiko */ 37ec6438a9SAndrii Nakryiko /* original set up, used to record relocations in BPF program */ 38ec6438a9SAndrii Nakryiko struct core_reloc_nesting_substruct { 39ec6438a9SAndrii Nakryiko int a; 40ec6438a9SAndrii Nakryiko }; 41ec6438a9SAndrii Nakryiko 42ec6438a9SAndrii Nakryiko union core_reloc_nesting_subunion { 43ec6438a9SAndrii Nakryiko int b; 44ec6438a9SAndrii Nakryiko }; 45ec6438a9SAndrii Nakryiko 46ec6438a9SAndrii Nakryiko struct core_reloc_nesting { 47ec6438a9SAndrii Nakryiko union { 48ec6438a9SAndrii Nakryiko struct core_reloc_nesting_substruct a; 49ec6438a9SAndrii Nakryiko } a; 50ec6438a9SAndrii Nakryiko struct { 51ec6438a9SAndrii Nakryiko union core_reloc_nesting_subunion b; 52ec6438a9SAndrii Nakryiko } b; 53ec6438a9SAndrii Nakryiko }; 54ec6438a9SAndrii Nakryiko 55ec6438a9SAndrii Nakryiko /* inlined anonymous struct/union instead of named structs in original */ 56ec6438a9SAndrii Nakryiko struct core_reloc_nesting___anon_embed { 57ec6438a9SAndrii Nakryiko int __just_for_padding; 58ec6438a9SAndrii Nakryiko union { 59ec6438a9SAndrii Nakryiko struct { 60ec6438a9SAndrii Nakryiko int a; 61ec6438a9SAndrii Nakryiko } a; 62ec6438a9SAndrii Nakryiko } a; 63ec6438a9SAndrii Nakryiko struct { 64ec6438a9SAndrii Nakryiko union { 65ec6438a9SAndrii Nakryiko int b; 66ec6438a9SAndrii Nakryiko } b; 67ec6438a9SAndrii Nakryiko } b; 68ec6438a9SAndrii Nakryiko }; 69ec6438a9SAndrii Nakryiko 70ec6438a9SAndrii Nakryiko /* different mix of nested structs/unions than in original */ 71ec6438a9SAndrii Nakryiko struct core_reloc_nesting___struct_union_mixup { 72ec6438a9SAndrii Nakryiko int __a; 73ec6438a9SAndrii Nakryiko struct { 74ec6438a9SAndrii Nakryiko int __a; 75ec6438a9SAndrii Nakryiko union { 76ec6438a9SAndrii Nakryiko char __a; 77ec6438a9SAndrii Nakryiko int a; 78ec6438a9SAndrii Nakryiko } a; 79ec6438a9SAndrii Nakryiko } a; 80ec6438a9SAndrii Nakryiko int __b; 81ec6438a9SAndrii Nakryiko union { 82ec6438a9SAndrii Nakryiko int __b; 83ec6438a9SAndrii Nakryiko union { 84ec6438a9SAndrii Nakryiko char __b; 85ec6438a9SAndrii Nakryiko int b; 86ec6438a9SAndrii Nakryiko } b; 87ec6438a9SAndrii Nakryiko } b; 88ec6438a9SAndrii Nakryiko }; 89ec6438a9SAndrii Nakryiko 90ec6438a9SAndrii Nakryiko /* extra anon structs/unions, but still valid a.a.a and b.b.b accessors */ 91ec6438a9SAndrii Nakryiko struct core_reloc_nesting___extra_nesting { 92ec6438a9SAndrii Nakryiko int __padding; 93ec6438a9SAndrii Nakryiko struct { 94ec6438a9SAndrii Nakryiko struct { 95ec6438a9SAndrii Nakryiko struct { 96ec6438a9SAndrii Nakryiko struct { 97ec6438a9SAndrii Nakryiko union { 98ec6438a9SAndrii Nakryiko int a; 99ec6438a9SAndrii Nakryiko } a; 100ec6438a9SAndrii Nakryiko }; 101ec6438a9SAndrii Nakryiko }; 102ec6438a9SAndrii Nakryiko } a; 103ec6438a9SAndrii Nakryiko int __some_more; 104ec6438a9SAndrii Nakryiko struct { 105ec6438a9SAndrii Nakryiko union { 106ec6438a9SAndrii Nakryiko union { 107ec6438a9SAndrii Nakryiko union { 108ec6438a9SAndrii Nakryiko struct { 109ec6438a9SAndrii Nakryiko int b; 110ec6438a9SAndrii Nakryiko }; 111ec6438a9SAndrii Nakryiko } b; 112ec6438a9SAndrii Nakryiko }; 113ec6438a9SAndrii Nakryiko } b; 114ec6438a9SAndrii Nakryiko }; 115ec6438a9SAndrii Nakryiko }; 116ec6438a9SAndrii Nakryiko }; 117ec6438a9SAndrii Nakryiko 118ec6438a9SAndrii Nakryiko /* three flavors of same struct with different structure but same layout for 119ec6438a9SAndrii Nakryiko * a.a.a and b.b.b, thus successfully resolved and relocatable */ 120ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types { 121ec6438a9SAndrii Nakryiko char __just_for_padding; 122ec6438a9SAndrii Nakryiko /* 3 more bytes of padding */ 123ec6438a9SAndrii Nakryiko struct { 124ec6438a9SAndrii Nakryiko struct { 125ec6438a9SAndrii Nakryiko int a; /* offset 4 */ 126ec6438a9SAndrii Nakryiko } a; 127ec6438a9SAndrii Nakryiko } a; 128ec6438a9SAndrii Nakryiko long long __more_padding; 129ec6438a9SAndrii Nakryiko struct { 130ec6438a9SAndrii Nakryiko struct { 131ec6438a9SAndrii Nakryiko int b; /* offset 16 */ 132ec6438a9SAndrii Nakryiko } b; 133ec6438a9SAndrii Nakryiko } b; 134ec6438a9SAndrii Nakryiko }; 135ec6438a9SAndrii Nakryiko 136ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types__2 { 137ec6438a9SAndrii Nakryiko int __aligned_padding; 138ec6438a9SAndrii Nakryiko struct { 139ec6438a9SAndrii Nakryiko int __trickier_noop[0]; 140ec6438a9SAndrii Nakryiko struct { 141ec6438a9SAndrii Nakryiko char __some_more_noops[0]; 142ec6438a9SAndrii Nakryiko int a; /* offset 4 */ 143ec6438a9SAndrii Nakryiko } a; 144ec6438a9SAndrii Nakryiko } a; 145ec6438a9SAndrii Nakryiko int __more_padding; 146ec6438a9SAndrii Nakryiko struct { 147ec6438a9SAndrii Nakryiko struct { 148ec6438a9SAndrii Nakryiko struct { 149ec6438a9SAndrii Nakryiko int __critical_padding; 150ec6438a9SAndrii Nakryiko int b; /* offset 16 */ 151ec6438a9SAndrii Nakryiko } b; 152ec6438a9SAndrii Nakryiko int __does_not_matter; 153ec6438a9SAndrii Nakryiko }; 154ec6438a9SAndrii Nakryiko } b; 155ec6438a9SAndrii Nakryiko int __more_irrelevant_stuff; 156ec6438a9SAndrii Nakryiko }; 157ec6438a9SAndrii Nakryiko 158ec6438a9SAndrii Nakryiko struct core_reloc_nesting___dup_compat_types__3 { 159ec6438a9SAndrii Nakryiko char __correct_padding[4]; 160ec6438a9SAndrii Nakryiko struct { 161ec6438a9SAndrii Nakryiko struct { 162ec6438a9SAndrii Nakryiko int a; /* offset 4 */ 163ec6438a9SAndrii Nakryiko } a; 164ec6438a9SAndrii Nakryiko } a; 165ec6438a9SAndrii Nakryiko /* 8 byte padding due to next struct's alignment */ 166ec6438a9SAndrii Nakryiko struct { 167ec6438a9SAndrii Nakryiko struct { 168ec6438a9SAndrii Nakryiko int b; 169ec6438a9SAndrii Nakryiko } b; 170ec6438a9SAndrii Nakryiko } b __attribute__((aligned(16))); 171ec6438a9SAndrii Nakryiko }; 172ec6438a9SAndrii Nakryiko 173ec6438a9SAndrii Nakryiko /* b.b.b field is missing */ 174ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_missing_field { 175ec6438a9SAndrii Nakryiko struct { 176ec6438a9SAndrii Nakryiko struct { 177ec6438a9SAndrii Nakryiko int a; 178ec6438a9SAndrii Nakryiko } a; 179ec6438a9SAndrii Nakryiko } a; 180ec6438a9SAndrii Nakryiko struct { 181ec6438a9SAndrii Nakryiko struct { 182ec6438a9SAndrii Nakryiko int x; 183ec6438a9SAndrii Nakryiko } b; 184ec6438a9SAndrii Nakryiko } b; 185ec6438a9SAndrii Nakryiko }; 186ec6438a9SAndrii Nakryiko 187ec6438a9SAndrii Nakryiko /* b.b.b field is an array of integers instead of plain int */ 188ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_array_field { 189ec6438a9SAndrii Nakryiko struct { 190ec6438a9SAndrii Nakryiko struct { 191ec6438a9SAndrii Nakryiko int a; 192ec6438a9SAndrii Nakryiko } a; 193ec6438a9SAndrii Nakryiko } a; 194ec6438a9SAndrii Nakryiko struct { 195ec6438a9SAndrii Nakryiko struct { 196ec6438a9SAndrii Nakryiko int b[1]; 197ec6438a9SAndrii Nakryiko } b; 198ec6438a9SAndrii Nakryiko } b; 199ec6438a9SAndrii Nakryiko }; 200ec6438a9SAndrii Nakryiko 201ec6438a9SAndrii Nakryiko /* middle b container is missing */ 202ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_missing_container { 203ec6438a9SAndrii Nakryiko struct { 204ec6438a9SAndrii Nakryiko struct { 205ec6438a9SAndrii Nakryiko int a; 206ec6438a9SAndrii Nakryiko } a; 207ec6438a9SAndrii Nakryiko } a; 208ec6438a9SAndrii Nakryiko struct { 209ec6438a9SAndrii Nakryiko int x; 210ec6438a9SAndrii Nakryiko } b; 211ec6438a9SAndrii Nakryiko }; 212ec6438a9SAndrii Nakryiko 213ec6438a9SAndrii Nakryiko /* middle b container is referenced through pointer instead of being embedded */ 214ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_nonstruct_container { 215ec6438a9SAndrii Nakryiko struct { 216ec6438a9SAndrii Nakryiko struct { 217ec6438a9SAndrii Nakryiko int a; 218ec6438a9SAndrii Nakryiko } a; 219ec6438a9SAndrii Nakryiko } a; 220ec6438a9SAndrii Nakryiko struct { 221ec6438a9SAndrii Nakryiko struct { 222ec6438a9SAndrii Nakryiko int b; 223ec6438a9SAndrii Nakryiko } *b; 224ec6438a9SAndrii Nakryiko } b; 225ec6438a9SAndrii Nakryiko }; 226ec6438a9SAndrii Nakryiko 227ec6438a9SAndrii Nakryiko /* middle b container is an array of structs instead of plain struct */ 228ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_array_container { 229ec6438a9SAndrii Nakryiko struct { 230ec6438a9SAndrii Nakryiko struct { 231ec6438a9SAndrii Nakryiko int a; 232ec6438a9SAndrii Nakryiko } a; 233ec6438a9SAndrii Nakryiko } a; 234ec6438a9SAndrii Nakryiko struct { 235ec6438a9SAndrii Nakryiko struct { 236ec6438a9SAndrii Nakryiko int b; 237ec6438a9SAndrii Nakryiko } b[1]; 238ec6438a9SAndrii Nakryiko } b; 239ec6438a9SAndrii Nakryiko }; 240ec6438a9SAndrii Nakryiko 241ec6438a9SAndrii Nakryiko /* two flavors of same struct with incompatible layout for b.b.b */ 242ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_dup_incompat_types__1 { 243ec6438a9SAndrii Nakryiko struct { 244ec6438a9SAndrii Nakryiko struct { 245ec6438a9SAndrii Nakryiko int a; /* offset 0 */ 246ec6438a9SAndrii Nakryiko } a; 247ec6438a9SAndrii Nakryiko } a; 248ec6438a9SAndrii Nakryiko struct { 249ec6438a9SAndrii Nakryiko struct { 250ec6438a9SAndrii Nakryiko int b; /* offset 4 */ 251ec6438a9SAndrii Nakryiko } b; 252ec6438a9SAndrii Nakryiko } b; 253ec6438a9SAndrii Nakryiko }; 254ec6438a9SAndrii Nakryiko 255ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_dup_incompat_types__2 { 256ec6438a9SAndrii Nakryiko struct { 257ec6438a9SAndrii Nakryiko struct { 258ec6438a9SAndrii Nakryiko int a; /* offset 0 */ 259ec6438a9SAndrii Nakryiko } a; 260ec6438a9SAndrii Nakryiko } a; 261ec6438a9SAndrii Nakryiko int __extra_padding; 262ec6438a9SAndrii Nakryiko struct { 263ec6438a9SAndrii Nakryiko struct { 264ec6438a9SAndrii Nakryiko int b; /* offset 8 (!) */ 265ec6438a9SAndrii Nakryiko } b; 266ec6438a9SAndrii Nakryiko } b; 267ec6438a9SAndrii Nakryiko }; 268ec6438a9SAndrii Nakryiko 269ec6438a9SAndrii Nakryiko /* two flavors of same struct having one of a.a.a and b.b.b, but not both */ 270ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_partial_match_dups__a { 271ec6438a9SAndrii Nakryiko struct { 272ec6438a9SAndrii Nakryiko struct { 273ec6438a9SAndrii Nakryiko int a; 274ec6438a9SAndrii Nakryiko } a; 275ec6438a9SAndrii Nakryiko } a; 276ec6438a9SAndrii Nakryiko }; 277ec6438a9SAndrii Nakryiko 278ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_partial_match_dups__b { 279ec6438a9SAndrii Nakryiko struct { 280ec6438a9SAndrii Nakryiko struct { 281ec6438a9SAndrii Nakryiko int b; 282ec6438a9SAndrii Nakryiko } b; 283ec6438a9SAndrii Nakryiko } b; 284ec6438a9SAndrii Nakryiko }; 285ec6438a9SAndrii Nakryiko 286ec6438a9SAndrii Nakryiko struct core_reloc_nesting___err_too_deep { 287ec6438a9SAndrii Nakryiko struct { 288ec6438a9SAndrii Nakryiko struct { 289ec6438a9SAndrii Nakryiko int a; 290ec6438a9SAndrii Nakryiko } a; 291ec6438a9SAndrii Nakryiko } a; 292ec6438a9SAndrii Nakryiko /* 65 levels of nestedness for b.b.b */ 293ec6438a9SAndrii Nakryiko struct { 294ec6438a9SAndrii Nakryiko struct { 295ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 296ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 297ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 298ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 299ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 300ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 301ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 302ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 303ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 304ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 305ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 306ec6438a9SAndrii Nakryiko struct { struct { struct { struct { struct { 307ec6438a9SAndrii Nakryiko /* this one is one too much */ 308ec6438a9SAndrii Nakryiko struct { 309ec6438a9SAndrii Nakryiko int b; 310ec6438a9SAndrii Nakryiko }; 311ec6438a9SAndrii Nakryiko }; }; }; }; }; 312ec6438a9SAndrii Nakryiko }; }; }; }; }; 313ec6438a9SAndrii Nakryiko }; }; }; }; }; 314ec6438a9SAndrii Nakryiko }; }; }; }; }; 315ec6438a9SAndrii Nakryiko }; }; }; }; }; 316ec6438a9SAndrii Nakryiko }; }; }; }; }; 317ec6438a9SAndrii Nakryiko }; }; }; }; }; 318ec6438a9SAndrii Nakryiko }; }; }; }; }; 319ec6438a9SAndrii Nakryiko }; }; }; }; }; 320ec6438a9SAndrii Nakryiko }; }; }; }; }; 321ec6438a9SAndrii Nakryiko }; }; }; }; }; 322ec6438a9SAndrii Nakryiko }; }; }; }; }; 323ec6438a9SAndrii Nakryiko } b; 324ec6438a9SAndrii Nakryiko } b; 325ec6438a9SAndrii Nakryiko }; 32620a9ad2eSAndrii Nakryiko 32720a9ad2eSAndrii Nakryiko /* 32820a9ad2eSAndrii Nakryiko * ARRAYS 32920a9ad2eSAndrii Nakryiko */ 33020a9ad2eSAndrii Nakryiko struct core_reloc_arrays_output { 33120a9ad2eSAndrii Nakryiko int a2; 33220a9ad2eSAndrii Nakryiko char b123; 33320a9ad2eSAndrii Nakryiko int c1c; 33420a9ad2eSAndrii Nakryiko int d00d; 3355f2eecefSAndrii Nakryiko int f10c; 33620a9ad2eSAndrii Nakryiko }; 33720a9ad2eSAndrii Nakryiko 33820a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct { 33920a9ad2eSAndrii Nakryiko int c; 34020a9ad2eSAndrii Nakryiko int d; 34120a9ad2eSAndrii Nakryiko }; 34220a9ad2eSAndrii Nakryiko 34320a9ad2eSAndrii Nakryiko struct core_reloc_arrays { 34420a9ad2eSAndrii Nakryiko int a[5]; 34520a9ad2eSAndrii Nakryiko char b[2][3][4]; 34620a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 34720a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 3485f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[][2]; 34920a9ad2eSAndrii Nakryiko }; 35020a9ad2eSAndrii Nakryiko 35120a9ad2eSAndrii Nakryiko /* bigger array dimensions */ 35220a9ad2eSAndrii Nakryiko struct core_reloc_arrays___diff_arr_dim { 35320a9ad2eSAndrii Nakryiko int a[7]; 35420a9ad2eSAndrii Nakryiko char b[3][4][5]; 35520a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct c[4]; 35620a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct d[2][3]; 3575f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[1][3]; 35820a9ad2eSAndrii Nakryiko }; 35920a9ad2eSAndrii Nakryiko 36020a9ad2eSAndrii Nakryiko /* different size of array's value (struct) */ 36120a9ad2eSAndrii Nakryiko struct core_reloc_arrays___diff_arr_val_sz { 36220a9ad2eSAndrii Nakryiko int a[5]; 36320a9ad2eSAndrii Nakryiko char b[2][3][4]; 36420a9ad2eSAndrii Nakryiko struct { 36520a9ad2eSAndrii Nakryiko int __padding1; 36620a9ad2eSAndrii Nakryiko int c; 36720a9ad2eSAndrii Nakryiko int __padding2; 36820a9ad2eSAndrii Nakryiko } c[3]; 36920a9ad2eSAndrii Nakryiko struct { 37020a9ad2eSAndrii Nakryiko int __padding1; 37120a9ad2eSAndrii Nakryiko int d; 37220a9ad2eSAndrii Nakryiko int __padding2; 37320a9ad2eSAndrii Nakryiko } d[1][2]; 3745f2eecefSAndrii Nakryiko struct { 3755f2eecefSAndrii Nakryiko int __padding1; 3765f2eecefSAndrii Nakryiko int c; 3775f2eecefSAndrii Nakryiko int __padding2; 3785f2eecefSAndrii Nakryiko } f[][2]; 3795f2eecefSAndrii Nakryiko }; 3805f2eecefSAndrii Nakryiko 3815f2eecefSAndrii Nakryiko struct core_reloc_arrays___equiv_zero_sz_arr { 3825f2eecefSAndrii Nakryiko int a[5]; 3835f2eecefSAndrii Nakryiko char b[2][3][4]; 3845f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 3855f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 3865f2eecefSAndrii Nakryiko /* equivalent to flexible array */ 387385bbf7bSGustavo A. R. Silva struct core_reloc_arrays_substruct f[][2]; 3885f2eecefSAndrii Nakryiko }; 3895f2eecefSAndrii Nakryiko 3905f2eecefSAndrii Nakryiko struct core_reloc_arrays___fixed_arr { 3915f2eecefSAndrii Nakryiko int a[5]; 3925f2eecefSAndrii Nakryiko char b[2][3][4]; 3935f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 3945f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 3955f2eecefSAndrii Nakryiko /* not a flexible array anymore, but within access bounds */ 3965f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[1][2]; 39720a9ad2eSAndrii Nakryiko }; 39820a9ad2eSAndrii Nakryiko 39920a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_too_small { 40020a9ad2eSAndrii Nakryiko int a[2]; /* this one is too small */ 40120a9ad2eSAndrii Nakryiko char b[2][3][4]; 40220a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 40320a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 4045f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[][2]; 40520a9ad2eSAndrii Nakryiko }; 40620a9ad2eSAndrii Nakryiko 40720a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_too_shallow { 40820a9ad2eSAndrii Nakryiko int a[5]; 40920a9ad2eSAndrii Nakryiko char b[2][3]; /* this one lacks one dimension */ 41020a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 41120a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 4125f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[][2]; 41320a9ad2eSAndrii Nakryiko }; 41420a9ad2eSAndrii Nakryiko 41520a9ad2eSAndrii Nakryiko struct core_reloc_arrays___err_non_array { 41620a9ad2eSAndrii Nakryiko int a; /* not an array */ 41720a9ad2eSAndrii Nakryiko char b[2][3][4]; 41820a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 41920a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 4205f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[][2]; 42120a9ad2eSAndrii Nakryiko }; 42220a9ad2eSAndrii Nakryiko 42342765edeSAndrii Nakryiko struct core_reloc_arrays___err_wrong_val_type { 42420a9ad2eSAndrii Nakryiko int a[5]; 42520a9ad2eSAndrii Nakryiko char b[2][3][4]; 42620a9ad2eSAndrii Nakryiko int c[3]; /* value is not a struct */ 42720a9ad2eSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 4285f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[][2]; 4295f2eecefSAndrii Nakryiko }; 4305f2eecefSAndrii Nakryiko 4315f2eecefSAndrii Nakryiko struct core_reloc_arrays___err_bad_zero_sz_arr { 4325f2eecefSAndrii Nakryiko /* zero-sized array, but not at the end */ 4335f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct f[0][2]; 4345f2eecefSAndrii Nakryiko int a[5]; 4355f2eecefSAndrii Nakryiko char b[2][3][4]; 4365f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct c[3]; 4375f2eecefSAndrii Nakryiko struct core_reloc_arrays_substruct d[1][2]; 43820a9ad2eSAndrii Nakryiko }; 439d9db3550SAndrii Nakryiko 440d9db3550SAndrii Nakryiko /* 441d9db3550SAndrii Nakryiko * PRIMITIVES 442d9db3550SAndrii Nakryiko */ 443d9db3550SAndrii Nakryiko enum core_reloc_primitives_enum { 444d9db3550SAndrii Nakryiko A = 0, 445d9db3550SAndrii Nakryiko B = 1, 446d9db3550SAndrii Nakryiko }; 447d9db3550SAndrii Nakryiko 448d9db3550SAndrii Nakryiko struct core_reloc_primitives { 449d9db3550SAndrii Nakryiko char a; 450d9db3550SAndrii Nakryiko int b; 451d9db3550SAndrii Nakryiko enum core_reloc_primitives_enum c; 4525705d705SAndrii Nakryiko void *d __bpf_aligned; 4535705d705SAndrii Nakryiko int (*f)(const char *) __bpf_aligned; 454d9db3550SAndrii Nakryiko }; 455d9db3550SAndrii Nakryiko 456d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_enum_def { 457d9db3550SAndrii Nakryiko char a; 458d9db3550SAndrii Nakryiko int b; 4595705d705SAndrii Nakryiko void *d __bpf_aligned; 4605705d705SAndrii Nakryiko int (*f)(const char *) __bpf_aligned; 461d9db3550SAndrii Nakryiko enum { 462d9db3550SAndrii Nakryiko X = 100, 463d9db3550SAndrii Nakryiko Y = 200, 4645705d705SAndrii Nakryiko } c __bpf_aligned; /* inline enum def with differing set of values */ 465d9db3550SAndrii Nakryiko }; 466d9db3550SAndrii Nakryiko 467d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_func_proto { 4685705d705SAndrii Nakryiko void (*f)(int) __bpf_aligned; /* incompatible function prototype */ 4695705d705SAndrii Nakryiko void *d __bpf_aligned; 4705705d705SAndrii Nakryiko enum core_reloc_primitives_enum c __bpf_aligned; 471d9db3550SAndrii Nakryiko int b; 472d9db3550SAndrii Nakryiko char a; 473d9db3550SAndrii Nakryiko }; 474d9db3550SAndrii Nakryiko 475d9db3550SAndrii Nakryiko struct core_reloc_primitives___diff_ptr_type { 4765705d705SAndrii Nakryiko const char * const d __bpf_aligned; /* different pointee type + modifiers */ 4775705d705SAndrii Nakryiko char a __bpf_aligned; 478d9db3550SAndrii Nakryiko int b; 479d9db3550SAndrii Nakryiko enum core_reloc_primitives_enum c; 4805705d705SAndrii Nakryiko int (*f)(const char *) __bpf_aligned; 481d9db3550SAndrii Nakryiko }; 482d9db3550SAndrii Nakryiko 483d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_enum { 484d9db3550SAndrii Nakryiko char a[1]; 485d9db3550SAndrii Nakryiko int b; 486d9db3550SAndrii Nakryiko int c; /* int instead of enum */ 4875705d705SAndrii Nakryiko void *d __bpf_aligned; 4885705d705SAndrii Nakryiko int (*f)(const char *) __bpf_aligned; 489d9db3550SAndrii Nakryiko }; 490d9db3550SAndrii Nakryiko 491d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_int { 492d9db3550SAndrii Nakryiko char a[1]; 4935705d705SAndrii Nakryiko int *b __bpf_aligned; /* ptr instead of int */ 4945705d705SAndrii Nakryiko enum core_reloc_primitives_enum c __bpf_aligned; 4955705d705SAndrii Nakryiko void *d __bpf_aligned; 4965705d705SAndrii Nakryiko int (*f)(const char *) __bpf_aligned; 497d9db3550SAndrii Nakryiko }; 498d9db3550SAndrii Nakryiko 499d9db3550SAndrii Nakryiko struct core_reloc_primitives___err_non_ptr { 500d9db3550SAndrii Nakryiko char a[1]; 501d9db3550SAndrii Nakryiko int b; 502d9db3550SAndrii Nakryiko enum core_reloc_primitives_enum c; 503d9db3550SAndrii Nakryiko int d; /* int instead of ptr */ 5045705d705SAndrii Nakryiko int (*f)(const char *) __bpf_aligned; 505d9db3550SAndrii Nakryiko }; 5069654e2aeSAndrii Nakryiko 5079654e2aeSAndrii Nakryiko /* 5089654e2aeSAndrii Nakryiko * MODS 5099654e2aeSAndrii Nakryiko */ 5109654e2aeSAndrii Nakryiko struct core_reloc_mods_output { 5119654e2aeSAndrii Nakryiko int a, b, c, d, e, f, g, h; 5129654e2aeSAndrii Nakryiko }; 5139654e2aeSAndrii Nakryiko 5149654e2aeSAndrii Nakryiko typedef const int int_t; 5155705d705SAndrii Nakryiko typedef const char *char_ptr_t __bpf_aligned; 5169654e2aeSAndrii Nakryiko typedef const int arr_t[7]; 5179654e2aeSAndrii Nakryiko 5189654e2aeSAndrii Nakryiko struct core_reloc_mods_substruct { 5199654e2aeSAndrii Nakryiko int x; 5209654e2aeSAndrii Nakryiko int y; 5219654e2aeSAndrii Nakryiko }; 5229654e2aeSAndrii Nakryiko 5239654e2aeSAndrii Nakryiko typedef struct { 5249654e2aeSAndrii Nakryiko int x; 5259654e2aeSAndrii Nakryiko int y; 5269654e2aeSAndrii Nakryiko } core_reloc_mods_substruct_t; 5279654e2aeSAndrii Nakryiko 5289654e2aeSAndrii Nakryiko struct core_reloc_mods { 5299654e2aeSAndrii Nakryiko int a; 5309654e2aeSAndrii Nakryiko int_t b; 5315705d705SAndrii Nakryiko char *c __bpf_aligned; 5329654e2aeSAndrii Nakryiko char_ptr_t d; 5335705d705SAndrii Nakryiko int e[3] __bpf_aligned; 5349654e2aeSAndrii Nakryiko arr_t f; 5359654e2aeSAndrii Nakryiko struct core_reloc_mods_substruct g; 5369654e2aeSAndrii Nakryiko core_reloc_mods_substruct_t h; 5379654e2aeSAndrii Nakryiko }; 5389654e2aeSAndrii Nakryiko 5399654e2aeSAndrii Nakryiko /* a/b, c/d, e/f, and g/h pairs are swapped */ 5409654e2aeSAndrii Nakryiko struct core_reloc_mods___mod_swap { 5419654e2aeSAndrii Nakryiko int b; 5429654e2aeSAndrii Nakryiko int_t a; 5435705d705SAndrii Nakryiko char *d __bpf_aligned; 5449654e2aeSAndrii Nakryiko char_ptr_t c; 5455705d705SAndrii Nakryiko int f[3] __bpf_aligned; 5469654e2aeSAndrii Nakryiko arr_t e; 5479654e2aeSAndrii Nakryiko struct { 5489654e2aeSAndrii Nakryiko int y; 5499654e2aeSAndrii Nakryiko int x; 5509654e2aeSAndrii Nakryiko } h; 5519654e2aeSAndrii Nakryiko core_reloc_mods_substruct_t g; 5529654e2aeSAndrii Nakryiko }; 5539654e2aeSAndrii Nakryiko 5549654e2aeSAndrii Nakryiko typedef int int1_t; 5559654e2aeSAndrii Nakryiko typedef int1_t int2_t; 5569654e2aeSAndrii Nakryiko typedef int2_t int3_t; 5579654e2aeSAndrii Nakryiko 5589654e2aeSAndrii Nakryiko typedef int arr1_t[5]; 5599654e2aeSAndrii Nakryiko typedef arr1_t arr2_t; 5609654e2aeSAndrii Nakryiko typedef arr2_t arr3_t; 5619654e2aeSAndrii Nakryiko typedef arr3_t arr4_t; 5629654e2aeSAndrii Nakryiko 5635705d705SAndrii Nakryiko typedef const char * const volatile fancy_char_ptr_t __bpf_aligned; 5649654e2aeSAndrii Nakryiko 5659654e2aeSAndrii Nakryiko typedef core_reloc_mods_substruct_t core_reloc_mods_substruct_tt; 5669654e2aeSAndrii Nakryiko 5679654e2aeSAndrii Nakryiko /* we need more typedefs */ 5689654e2aeSAndrii Nakryiko struct core_reloc_mods___typedefs { 5699654e2aeSAndrii Nakryiko core_reloc_mods_substruct_tt g; 5709654e2aeSAndrii Nakryiko core_reloc_mods_substruct_tt h; 5719654e2aeSAndrii Nakryiko arr4_t f; 5729654e2aeSAndrii Nakryiko arr4_t e; 5739654e2aeSAndrii Nakryiko fancy_char_ptr_t d; 5749654e2aeSAndrii Nakryiko fancy_char_ptr_t c; 5755705d705SAndrii Nakryiko int3_t b __bpf_aligned; 5769654e2aeSAndrii Nakryiko int3_t a; 5779654e2aeSAndrii Nakryiko }; 578d698f9dbSAndrii Nakryiko 579d698f9dbSAndrii Nakryiko /* 580d698f9dbSAndrii Nakryiko * PTR_AS_ARR 581d698f9dbSAndrii Nakryiko */ 582d698f9dbSAndrii Nakryiko struct core_reloc_ptr_as_arr { 583d698f9dbSAndrii Nakryiko int a; 584d698f9dbSAndrii Nakryiko }; 585d698f9dbSAndrii Nakryiko 586d698f9dbSAndrii Nakryiko struct core_reloc_ptr_as_arr___diff_sz { 587d698f9dbSAndrii Nakryiko int :32; /* padding */ 588d698f9dbSAndrii Nakryiko char __some_more_padding; 589d698f9dbSAndrii Nakryiko int a; 590d698f9dbSAndrii Nakryiko }; 591c1f5e7ddSAndrii Nakryiko 592c1f5e7ddSAndrii Nakryiko /* 593c1f5e7ddSAndrii Nakryiko * INTS 594c1f5e7ddSAndrii Nakryiko */ 595c1f5e7ddSAndrii Nakryiko struct core_reloc_ints { 596c1f5e7ddSAndrii Nakryiko uint8_t u8_field; 597c1f5e7ddSAndrii Nakryiko int8_t s8_field; 598c1f5e7ddSAndrii Nakryiko uint16_t u16_field; 599c1f5e7ddSAndrii Nakryiko int16_t s16_field; 600c1f5e7ddSAndrii Nakryiko uint32_t u32_field; 601c1f5e7ddSAndrii Nakryiko int32_t s32_field; 602c1f5e7ddSAndrii Nakryiko uint64_t u64_field; 603c1f5e7ddSAndrii Nakryiko int64_t s64_field; 604c1f5e7ddSAndrii Nakryiko }; 605c1f5e7ddSAndrii Nakryiko 606c1f5e7ddSAndrii Nakryiko /* signed/unsigned types swap */ 607c1f5e7ddSAndrii Nakryiko struct core_reloc_ints___reverse_sign { 608c1f5e7ddSAndrii Nakryiko int8_t u8_field; 609c1f5e7ddSAndrii Nakryiko uint8_t s8_field; 610c1f5e7ddSAndrii Nakryiko int16_t u16_field; 611c1f5e7ddSAndrii Nakryiko uint16_t s16_field; 612c1f5e7ddSAndrii Nakryiko int32_t u32_field; 613c1f5e7ddSAndrii Nakryiko uint32_t s32_field; 614c1f5e7ddSAndrii Nakryiko int64_t u64_field; 615c1f5e7ddSAndrii Nakryiko uint64_t s64_field; 616c1f5e7ddSAndrii Nakryiko }; 617c1f5e7ddSAndrii Nakryiko 618c1f5e7ddSAndrii Nakryiko struct core_reloc_ints___bool { 619c1f5e7ddSAndrii Nakryiko bool u8_field; /* bool instead of uint8 */ 620c1f5e7ddSAndrii Nakryiko int8_t s8_field; 621c1f5e7ddSAndrii Nakryiko uint16_t u16_field; 622c1f5e7ddSAndrii Nakryiko int16_t s16_field; 623c1f5e7ddSAndrii Nakryiko uint32_t u32_field; 624c1f5e7ddSAndrii Nakryiko int32_t s32_field; 625c1f5e7ddSAndrii Nakryiko uint64_t u64_field; 626c1f5e7ddSAndrii Nakryiko int64_t s64_field; 627c1f5e7ddSAndrii Nakryiko }; 628c1f5e7ddSAndrii Nakryiko 62929e1c668SAndrii Nakryiko /* 63029e1c668SAndrii Nakryiko * MISC 63129e1c668SAndrii Nakryiko */ 63229e1c668SAndrii Nakryiko struct core_reloc_misc_output { 63329e1c668SAndrii Nakryiko int a, b, c; 63429e1c668SAndrii Nakryiko }; 63529e1c668SAndrii Nakryiko 63629e1c668SAndrii Nakryiko struct core_reloc_misc___a { 63729e1c668SAndrii Nakryiko int a1; 63829e1c668SAndrii Nakryiko int a2; 63929e1c668SAndrii Nakryiko }; 64029e1c668SAndrii Nakryiko 64129e1c668SAndrii Nakryiko struct core_reloc_misc___b { 64229e1c668SAndrii Nakryiko int b1; 64329e1c668SAndrii Nakryiko int b2; 64429e1c668SAndrii Nakryiko }; 64529e1c668SAndrii Nakryiko 64629e1c668SAndrii Nakryiko /* this one extends core_reloc_misc_extensible struct from BPF prog */ 64729e1c668SAndrii Nakryiko struct core_reloc_misc_extensible { 64829e1c668SAndrii Nakryiko int a; 64929e1c668SAndrii Nakryiko int b; 65029e1c668SAndrii Nakryiko int c; 65129e1c668SAndrii Nakryiko int d; 65229e1c668SAndrii Nakryiko }; 653c7566a69SAndrii Nakryiko 654c7566a69SAndrii Nakryiko /* 655c7566a69SAndrii Nakryiko * EXISTENCE 656c7566a69SAndrii Nakryiko */ 657c7566a69SAndrii Nakryiko struct core_reloc_existence_output { 658c7566a69SAndrii Nakryiko int a_exists; 659c7566a69SAndrii Nakryiko int a_value; 660c7566a69SAndrii Nakryiko int b_exists; 661c7566a69SAndrii Nakryiko int b_value; 662c7566a69SAndrii Nakryiko int c_exists; 663c7566a69SAndrii Nakryiko int c_value; 664c7566a69SAndrii Nakryiko int arr_exists; 665c7566a69SAndrii Nakryiko int arr_value; 666c7566a69SAndrii Nakryiko int s_exists; 667c7566a69SAndrii Nakryiko int s_value; 668c7566a69SAndrii Nakryiko }; 669c7566a69SAndrii Nakryiko 670c7566a69SAndrii Nakryiko struct core_reloc_existence { 671c7566a69SAndrii Nakryiko int a; 672c7566a69SAndrii Nakryiko struct { 673c7566a69SAndrii Nakryiko int b; 674c7566a69SAndrii Nakryiko }; 675c7566a69SAndrii Nakryiko int c; 676c7566a69SAndrii Nakryiko int arr[1]; 677c7566a69SAndrii Nakryiko struct { 678c7566a69SAndrii Nakryiko int x; 679c7566a69SAndrii Nakryiko } s; 680c7566a69SAndrii Nakryiko }; 681c7566a69SAndrii Nakryiko 682c7566a69SAndrii Nakryiko struct core_reloc_existence___minimal { 683c7566a69SAndrii Nakryiko int a; 684c7566a69SAndrii Nakryiko }; 685c7566a69SAndrii Nakryiko 686c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_int_sz { 687c7566a69SAndrii Nakryiko short a; 688c7566a69SAndrii Nakryiko }; 689c7566a69SAndrii Nakryiko 690c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_int_type { 691c7566a69SAndrii Nakryiko int b[1]; 692c7566a69SAndrii Nakryiko }; 693c7566a69SAndrii Nakryiko 694c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_int_kind { 695c7566a69SAndrii Nakryiko struct{ int x; } c; 696c7566a69SAndrii Nakryiko }; 697c7566a69SAndrii Nakryiko 698c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_arr_kind { 699c7566a69SAndrii Nakryiko int arr; 700c7566a69SAndrii Nakryiko }; 701c7566a69SAndrii Nakryiko 702c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_arr_value_type { 703c7566a69SAndrii Nakryiko short arr[1]; 704c7566a69SAndrii Nakryiko }; 705c7566a69SAndrii Nakryiko 706c7566a69SAndrii Nakryiko struct core_reloc_existence___err_wrong_struct_type { 707c7566a69SAndrii Nakryiko int s; 708c7566a69SAndrii Nakryiko }; 7098b1cb1c9SAndrii Nakryiko 7108b1cb1c9SAndrii Nakryiko /* 7118b1cb1c9SAndrii Nakryiko * BITFIELDS 7128b1cb1c9SAndrii Nakryiko */ 7138b1cb1c9SAndrii Nakryiko /* bitfield read results, all as plain integers */ 7148b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields_output { 7158b1cb1c9SAndrii Nakryiko int64_t ub1; 7168b1cb1c9SAndrii Nakryiko int64_t ub2; 7178b1cb1c9SAndrii Nakryiko int64_t ub7; 7188b1cb1c9SAndrii Nakryiko int64_t sb4; 7198b1cb1c9SAndrii Nakryiko int64_t sb20; 7208b1cb1c9SAndrii Nakryiko int64_t u32; 7218b1cb1c9SAndrii Nakryiko int64_t s32; 7228b1cb1c9SAndrii Nakryiko }; 7238b1cb1c9SAndrii Nakryiko 7248b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields { 7258b1cb1c9SAndrii Nakryiko /* unsigned bitfields */ 7268b1cb1c9SAndrii Nakryiko uint8_t ub1: 1; 7278b1cb1c9SAndrii Nakryiko uint8_t ub2: 2; 7288b1cb1c9SAndrii Nakryiko uint32_t ub7: 7; 7298b1cb1c9SAndrii Nakryiko /* signed bitfields */ 7308b1cb1c9SAndrii Nakryiko int8_t sb4: 4; 7318b1cb1c9SAndrii Nakryiko int32_t sb20: 20; 7328b1cb1c9SAndrii Nakryiko /* non-bitfields */ 7338b1cb1c9SAndrii Nakryiko uint32_t u32; 7348b1cb1c9SAndrii Nakryiko int32_t s32; 7358b1cb1c9SAndrii Nakryiko }; 7368b1cb1c9SAndrii Nakryiko 7378b1cb1c9SAndrii Nakryiko /* different bit sizes (both up and down) */ 7388b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___bit_sz_change { 7398b1cb1c9SAndrii Nakryiko /* unsigned bitfields */ 7408b1cb1c9SAndrii Nakryiko uint16_t ub1: 3; /* 1 -> 3 */ 7418b1cb1c9SAndrii Nakryiko uint32_t ub2: 20; /* 2 -> 20 */ 7428b1cb1c9SAndrii Nakryiko uint8_t ub7: 1; /* 7 -> 1 */ 7438b1cb1c9SAndrii Nakryiko /* signed bitfields */ 7448b1cb1c9SAndrii Nakryiko int8_t sb4: 1; /* 4 -> 1 */ 7458b1cb1c9SAndrii Nakryiko int32_t sb20: 30; /* 20 -> 30 */ 7468b1cb1c9SAndrii Nakryiko /* non-bitfields */ 7478b1cb1c9SAndrii Nakryiko uint16_t u32; /* 32 -> 16 */ 7485705d705SAndrii Nakryiko int64_t s32 __bpf_aligned; /* 32 -> 64 */ 7498b1cb1c9SAndrii Nakryiko }; 7508b1cb1c9SAndrii Nakryiko 7518b1cb1c9SAndrii Nakryiko /* turn bitfield into non-bitfield and vice versa */ 7528b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___bitfield_vs_int { 7538b1cb1c9SAndrii Nakryiko uint64_t ub1; /* 3 -> 64 non-bitfield */ 7548b1cb1c9SAndrii Nakryiko uint8_t ub2; /* 20 -> 8 non-bitfield */ 7555705d705SAndrii Nakryiko int64_t ub7 __bpf_aligned; /* 7 -> 64 non-bitfield signed */ 7565705d705SAndrii Nakryiko int64_t sb4 __bpf_aligned; /* 4 -> 64 non-bitfield signed */ 7575705d705SAndrii Nakryiko uint64_t sb20 __bpf_aligned; /* 20 -> 16 non-bitfield unsigned */ 7588b1cb1c9SAndrii Nakryiko int32_t u32: 20; /* 32 non-bitfield -> 20 bitfield */ 7595705d705SAndrii Nakryiko uint64_t s32: 60 __bpf_aligned; /* 32 non-bitfield -> 60 bitfield */ 7608b1cb1c9SAndrii Nakryiko }; 7618b1cb1c9SAndrii Nakryiko 7628b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___just_big_enough { 7638b1cb1c9SAndrii Nakryiko uint64_t ub1: 4; 7648b1cb1c9SAndrii Nakryiko uint64_t ub2: 60; /* packed tightly */ 7658b1cb1c9SAndrii Nakryiko uint32_t ub7; 7668b1cb1c9SAndrii Nakryiko uint32_t sb4; 7678b1cb1c9SAndrii Nakryiko uint32_t sb20; 7688b1cb1c9SAndrii Nakryiko uint32_t u32; 7698b1cb1c9SAndrii Nakryiko uint32_t s32; 7708b1cb1c9SAndrii Nakryiko } __attribute__((packed)) ; 7718b1cb1c9SAndrii Nakryiko 7728b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields___err_too_big_bitfield { 7738b1cb1c9SAndrii Nakryiko uint64_t ub1: 4; 7748b1cb1c9SAndrii Nakryiko uint64_t ub2: 61; /* packed tightly */ 7758b1cb1c9SAndrii Nakryiko uint32_t ub7; 7768b1cb1c9SAndrii Nakryiko uint32_t sb4; 7778b1cb1c9SAndrii Nakryiko uint32_t sb20; 7788b1cb1c9SAndrii Nakryiko uint32_t u32; 7798b1cb1c9SAndrii Nakryiko uint32_t s32; 7808b1cb1c9SAndrii Nakryiko } __attribute__((packed)) ; 7810b163565SAndrii Nakryiko 7820b163565SAndrii Nakryiko /* 7830b163565SAndrii Nakryiko * SIZE 7840b163565SAndrii Nakryiko */ 7850b163565SAndrii Nakryiko struct core_reloc_size_output { 7860b163565SAndrii Nakryiko int int_sz; 7870b163565SAndrii Nakryiko int struct_sz; 7880b163565SAndrii Nakryiko int union_sz; 7890b163565SAndrii Nakryiko int arr_sz; 7900b163565SAndrii Nakryiko int arr_elem_sz; 7910b163565SAndrii Nakryiko int ptr_sz; 7920b163565SAndrii Nakryiko int enum_sz; 7930b163565SAndrii Nakryiko }; 7940b163565SAndrii Nakryiko 7950b163565SAndrii Nakryiko struct core_reloc_size { 7960b163565SAndrii Nakryiko int int_field; 7970b163565SAndrii Nakryiko struct { int x; } struct_field; 7980b163565SAndrii Nakryiko union { int x; } union_field; 7990b163565SAndrii Nakryiko int arr_field[4]; 8000b163565SAndrii Nakryiko void *ptr_field; 8010b163565SAndrii Nakryiko enum { VALUE = 123 } enum_field; 8020b163565SAndrii Nakryiko }; 8030b163565SAndrii Nakryiko 8040b163565SAndrii Nakryiko struct core_reloc_size___diff_sz { 8050b163565SAndrii Nakryiko uint64_t int_field; 8060b163565SAndrii Nakryiko struct { int x; int y; int z; } struct_field; 8070b163565SAndrii Nakryiko union { int x; char bla[123]; } union_field; 8080b163565SAndrii Nakryiko char arr_field[10]; 8090b163565SAndrii Nakryiko void *ptr_field; 8100b163565SAndrii Nakryiko enum { OTHER_VALUE = 0xFFFFFFFFFFFFFFFF } enum_field; 8110b163565SAndrii Nakryiko }; 812