12d2a3ad8SAndrii Nakryiko // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 22d2a3ad8SAndrii Nakryiko 32d2a3ad8SAndrii Nakryiko /* 42d2a3ad8SAndrii Nakryiko * BTF-to-C dumper tests for implicit and explicit padding between fields and 52d2a3ad8SAndrii Nakryiko * at the end of a struct. 62d2a3ad8SAndrii Nakryiko * 72d2a3ad8SAndrii Nakryiko * Copyright (c) 2019 Facebook 82d2a3ad8SAndrii Nakryiko */ 92d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 102d2a3ad8SAndrii Nakryiko struct padded_implicitly { 112d2a3ad8SAndrii Nakryiko int a; 127e3cbd34SYucong Sun long b; 132d2a3ad8SAndrii Nakryiko char c; 142d2a3ad8SAndrii Nakryiko }; 152d2a3ad8SAndrii Nakryiko 162d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 172d2a3ad8SAndrii Nakryiko 182d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 192d2a3ad8SAndrii Nakryiko /* 202d2a3ad8SAndrii Nakryiko *struct padded_explicitly { 212d2a3ad8SAndrii Nakryiko * int a; 22ea2ce1baSAndrii Nakryiko * long: 0; 232d2a3ad8SAndrii Nakryiko * int b; 242d2a3ad8SAndrii Nakryiko *}; 252d2a3ad8SAndrii Nakryiko * 262d2a3ad8SAndrii Nakryiko */ 272d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 282d2a3ad8SAndrii Nakryiko 292d2a3ad8SAndrii Nakryiko struct padded_explicitly { 302d2a3ad8SAndrii Nakryiko int a; 31ea2ce1baSAndrii Nakryiko int: 1; /* algo will emit aligning `long: 0;` here */ 322d2a3ad8SAndrii Nakryiko int b; 332d2a3ad8SAndrii Nakryiko }; 342d2a3ad8SAndrii Nakryiko 352d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 362d2a3ad8SAndrii Nakryiko struct padded_a_lot { 372d2a3ad8SAndrii Nakryiko int a; 382d2a3ad8SAndrii Nakryiko long: 64; 392d2a3ad8SAndrii Nakryiko long: 64; 402d2a3ad8SAndrii Nakryiko int b; 412d2a3ad8SAndrii Nakryiko }; 422d2a3ad8SAndrii Nakryiko 43ea2ce1baSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 44ea2ce1baSAndrii Nakryiko 452d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 462d2a3ad8SAndrii Nakryiko /* 472d2a3ad8SAndrii Nakryiko *struct padded_cache_line { 482d2a3ad8SAndrii Nakryiko * int a; 492d2a3ad8SAndrii Nakryiko * long: 64; 502d2a3ad8SAndrii Nakryiko * long: 64; 512d2a3ad8SAndrii Nakryiko * long: 64; 522d2a3ad8SAndrii Nakryiko * int b; 5376790c7cSAndrii Nakryiko * long: 64; 5476790c7cSAndrii Nakryiko * long: 64; 5576790c7cSAndrii Nakryiko * long: 64; 562d2a3ad8SAndrii Nakryiko *}; 572d2a3ad8SAndrii Nakryiko * 582d2a3ad8SAndrii Nakryiko */ 592d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 602d2a3ad8SAndrii Nakryiko 612d2a3ad8SAndrii Nakryiko struct padded_cache_line { 622d2a3ad8SAndrii Nakryiko int a; 632d2a3ad8SAndrii Nakryiko int b __attribute__((aligned(32))); 642d2a3ad8SAndrii Nakryiko }; 652d2a3ad8SAndrii Nakryiko 662d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 672d2a3ad8SAndrii Nakryiko /* 682d2a3ad8SAndrii Nakryiko *struct zone_padding { 692d2a3ad8SAndrii Nakryiko * char x[0]; 702d2a3ad8SAndrii Nakryiko *}; 712d2a3ad8SAndrii Nakryiko * 722d2a3ad8SAndrii Nakryiko *struct zone { 732d2a3ad8SAndrii Nakryiko * int a; 742d2a3ad8SAndrii Nakryiko * short b; 75ea2ce1baSAndrii Nakryiko * long: 0; 762d2a3ad8SAndrii Nakryiko * struct zone_padding __pad__; 772d2a3ad8SAndrii Nakryiko *}; 782d2a3ad8SAndrii Nakryiko * 792d2a3ad8SAndrii Nakryiko */ 802d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 812d2a3ad8SAndrii Nakryiko 822d2a3ad8SAndrii Nakryiko struct zone_padding { 832d2a3ad8SAndrii Nakryiko char x[0]; 842d2a3ad8SAndrii Nakryiko } __attribute__((__aligned__(8))); 852d2a3ad8SAndrii Nakryiko 862d2a3ad8SAndrii Nakryiko struct zone { 872d2a3ad8SAndrii Nakryiko int a; 882d2a3ad8SAndrii Nakryiko short b; 892d2a3ad8SAndrii Nakryiko struct zone_padding __pad__; 902d2a3ad8SAndrii Nakryiko }; 912d2a3ad8SAndrii Nakryiko 92d503f117SEduard Zingerman /* ----- START-EXPECTED-OUTPUT ----- */ 93d503f117SEduard Zingerman struct padding_wo_named_members { 94d503f117SEduard Zingerman long: 64; 95d503f117SEduard Zingerman long: 64; 96d503f117SEduard Zingerman }; 97d503f117SEduard Zingerman 98ea2ce1baSAndrii Nakryiko struct padding_weird_1 { 99ea2ce1baSAndrii Nakryiko int a; 100ea2ce1baSAndrii Nakryiko long: 64; 101ea2ce1baSAndrii Nakryiko short: 16; 102ea2ce1baSAndrii Nakryiko short b; 103ea2ce1baSAndrii Nakryiko }; 104ea2ce1baSAndrii Nakryiko 105ea2ce1baSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 106ea2ce1baSAndrii Nakryiko 107ea2ce1baSAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 108ea2ce1baSAndrii Nakryiko /* 109ea2ce1baSAndrii Nakryiko *struct padding_weird_2 { 110ea2ce1baSAndrii Nakryiko * long: 56; 111ea2ce1baSAndrii Nakryiko * char a; 112ea2ce1baSAndrii Nakryiko * long: 56; 113ea2ce1baSAndrii Nakryiko * char b; 114ea2ce1baSAndrii Nakryiko * char: 8; 115ea2ce1baSAndrii Nakryiko *}; 116ea2ce1baSAndrii Nakryiko * 117ea2ce1baSAndrii Nakryiko */ 118ea2ce1baSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 119ea2ce1baSAndrii Nakryiko struct padding_weird_2 { 120ea2ce1baSAndrii Nakryiko int: 32; /* these paddings will be collapsed into `long: 56;` */ 121ea2ce1baSAndrii Nakryiko short: 16; 122ea2ce1baSAndrii Nakryiko char: 8; 123ea2ce1baSAndrii Nakryiko char a; 124ea2ce1baSAndrii Nakryiko int: 32; /* these paddings will be collapsed into `long: 56;` */ 125ea2ce1baSAndrii Nakryiko short: 16; 126ea2ce1baSAndrii Nakryiko char: 8; 127ea2ce1baSAndrii Nakryiko char b; 128ea2ce1baSAndrii Nakryiko char: 8; 129ea2ce1baSAndrii Nakryiko }; 130ea2ce1baSAndrii Nakryiko 131*b148c8b9SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 132*b148c8b9SAndrii Nakryiko struct exact_1byte { 133*b148c8b9SAndrii Nakryiko char x; 134*b148c8b9SAndrii Nakryiko }; 135*b148c8b9SAndrii Nakryiko 136*b148c8b9SAndrii Nakryiko struct padded_1byte { 137*b148c8b9SAndrii Nakryiko char: 8; 138*b148c8b9SAndrii Nakryiko }; 139*b148c8b9SAndrii Nakryiko 140*b148c8b9SAndrii Nakryiko struct exact_2bytes { 141*b148c8b9SAndrii Nakryiko short x; 142*b148c8b9SAndrii Nakryiko }; 143*b148c8b9SAndrii Nakryiko 144*b148c8b9SAndrii Nakryiko struct padded_2bytes { 145*b148c8b9SAndrii Nakryiko short: 16; 146*b148c8b9SAndrii Nakryiko }; 147*b148c8b9SAndrii Nakryiko 148*b148c8b9SAndrii Nakryiko struct exact_4bytes { 149*b148c8b9SAndrii Nakryiko int x; 150*b148c8b9SAndrii Nakryiko }; 151*b148c8b9SAndrii Nakryiko 152*b148c8b9SAndrii Nakryiko struct padded_4bytes { 153*b148c8b9SAndrii Nakryiko int: 32; 154*b148c8b9SAndrii Nakryiko }; 155*b148c8b9SAndrii Nakryiko 156*b148c8b9SAndrii Nakryiko struct exact_8bytes { 157*b148c8b9SAndrii Nakryiko long x; 158*b148c8b9SAndrii Nakryiko }; 159*b148c8b9SAndrii Nakryiko 160*b148c8b9SAndrii Nakryiko struct padded_8bytes { 161*b148c8b9SAndrii Nakryiko long: 64; 162*b148c8b9SAndrii Nakryiko }; 163*b148c8b9SAndrii Nakryiko 164*b148c8b9SAndrii Nakryiko struct ff_periodic_effect { 165*b148c8b9SAndrii Nakryiko int: 32; 166*b148c8b9SAndrii Nakryiko short magnitude; 167*b148c8b9SAndrii Nakryiko long: 0; 168*b148c8b9SAndrii Nakryiko short phase; 169*b148c8b9SAndrii Nakryiko long: 0; 170*b148c8b9SAndrii Nakryiko int: 32; 171*b148c8b9SAndrii Nakryiko int custom_len; 172*b148c8b9SAndrii Nakryiko short *custom_data; 173*b148c8b9SAndrii Nakryiko }; 174*b148c8b9SAndrii Nakryiko 175*b148c8b9SAndrii Nakryiko struct ib_wc { 176*b148c8b9SAndrii Nakryiko long: 64; 177*b148c8b9SAndrii Nakryiko long: 64; 178*b148c8b9SAndrii Nakryiko int: 32; 179*b148c8b9SAndrii Nakryiko int byte_len; 180*b148c8b9SAndrii Nakryiko void *qp; 181*b148c8b9SAndrii Nakryiko union {} ex; 182*b148c8b9SAndrii Nakryiko long: 64; 183*b148c8b9SAndrii Nakryiko int slid; 184*b148c8b9SAndrii Nakryiko int wc_flags; 185*b148c8b9SAndrii Nakryiko long: 64; 186*b148c8b9SAndrii Nakryiko char smac[6]; 187*b148c8b9SAndrii Nakryiko long: 0; 188*b148c8b9SAndrii Nakryiko char network_hdr_type; 189*b148c8b9SAndrii Nakryiko }; 190*b148c8b9SAndrii Nakryiko 191*b148c8b9SAndrii Nakryiko struct acpi_object_method { 192*b148c8b9SAndrii Nakryiko long: 64; 193*b148c8b9SAndrii Nakryiko char: 8; 194*b148c8b9SAndrii Nakryiko char type; 195*b148c8b9SAndrii Nakryiko short reference_count; 196*b148c8b9SAndrii Nakryiko char flags; 197*b148c8b9SAndrii Nakryiko short: 0; 198*b148c8b9SAndrii Nakryiko char: 8; 199*b148c8b9SAndrii Nakryiko char sync_level; 200*b148c8b9SAndrii Nakryiko long: 64; 201*b148c8b9SAndrii Nakryiko void *node; 202*b148c8b9SAndrii Nakryiko void *aml_start; 203*b148c8b9SAndrii Nakryiko union {} dispatch; 204*b148c8b9SAndrii Nakryiko long: 64; 205*b148c8b9SAndrii Nakryiko int aml_length; 206*b148c8b9SAndrii Nakryiko }; 207*b148c8b9SAndrii Nakryiko 208*b148c8b9SAndrii Nakryiko struct nested_unpacked { 209*b148c8b9SAndrii Nakryiko int x; 210*b148c8b9SAndrii Nakryiko }; 211*b148c8b9SAndrii Nakryiko 212*b148c8b9SAndrii Nakryiko struct nested_packed { 213*b148c8b9SAndrii Nakryiko struct nested_unpacked a; 214*b148c8b9SAndrii Nakryiko char c; 215*b148c8b9SAndrii Nakryiko } __attribute__((packed)); 216*b148c8b9SAndrii Nakryiko 217*b148c8b9SAndrii Nakryiko struct outer_mixed_but_unpacked { 218*b148c8b9SAndrii Nakryiko struct nested_packed b1; 219*b148c8b9SAndrii Nakryiko short a1; 220*b148c8b9SAndrii Nakryiko struct nested_packed b2; 221*b148c8b9SAndrii Nakryiko }; 222*b148c8b9SAndrii Nakryiko 223d503f117SEduard Zingerman /* ------ END-EXPECTED-OUTPUT ------ */ 224d503f117SEduard Zingerman f(struct{ struct padded_implicitly _1; struct padded_explicitly _2; struct padded_a_lot _3; struct padded_cache_line _4; struct zone _5; struct padding_wo_named_members _6; struct padding_weird_1 _7; struct padding_weird_2 _8; struct exact_1byte _100; struct padded_1byte _101; struct exact_2bytes _102; struct padded_2bytes _103; struct exact_4bytes _104; struct padded_4bytes _105; struct exact_8bytes _106; struct padded_8bytes _107; struct ff_periodic_effect _200; struct ib_wc _201; struct acpi_object_method _202; struct outer_mixed_but_unpacked _203; } * _)2252d2a3ad8SAndrii Nakryikoint f(struct { 2262d2a3ad8SAndrii Nakryiko struct padded_implicitly _1; 2272d2a3ad8SAndrii Nakryiko struct padded_explicitly _2; 2282d2a3ad8SAndrii Nakryiko struct padded_a_lot _3; 2292d2a3ad8SAndrii Nakryiko struct padded_cache_line _4; 2302d2a3ad8SAndrii Nakryiko struct zone _5; 231d503f117SEduard Zingerman struct padding_wo_named_members _6; 232ea2ce1baSAndrii Nakryiko struct padding_weird_1 _7; 233ea2ce1baSAndrii Nakryiko struct padding_weird_2 _8; 234*b148c8b9SAndrii Nakryiko struct exact_1byte _100; 235*b148c8b9SAndrii Nakryiko struct padded_1byte _101; 236*b148c8b9SAndrii Nakryiko struct exact_2bytes _102; 237*b148c8b9SAndrii Nakryiko struct padded_2bytes _103; 238*b148c8b9SAndrii Nakryiko struct exact_4bytes _104; 239*b148c8b9SAndrii Nakryiko struct padded_4bytes _105; 240*b148c8b9SAndrii Nakryiko struct exact_8bytes _106; 241*b148c8b9SAndrii Nakryiko struct padded_8bytes _107; 242*b148c8b9SAndrii Nakryiko struct ff_periodic_effect _200; 243*b148c8b9SAndrii Nakryiko struct ib_wc _201; 244*b148c8b9SAndrii Nakryiko struct acpi_object_method _202; 245*b148c8b9SAndrii Nakryiko struct outer_mixed_but_unpacked _203; 2462d2a3ad8SAndrii Nakryiko } *_) 2472d2a3ad8SAndrii Nakryiko { 2482d2a3ad8SAndrii Nakryiko return 0; 2492d2a3ad8SAndrii Nakryiko } 250