12d2a3ad8SAndrii Nakryiko // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 22d2a3ad8SAndrii Nakryiko 32d2a3ad8SAndrii Nakryiko /* 42d2a3ad8SAndrii Nakryiko * BTF-to-C dumper tests for struct packing determination. 52d2a3ad8SAndrii Nakryiko * 62d2a3ad8SAndrii Nakryiko * Copyright (c) 2019 Facebook 72d2a3ad8SAndrii Nakryiko */ 82d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 92d2a3ad8SAndrii Nakryiko struct packed_trailing_space { 102d2a3ad8SAndrii Nakryiko int a; 112d2a3ad8SAndrii Nakryiko short b; 122d2a3ad8SAndrii Nakryiko } __attribute__((packed)); 132d2a3ad8SAndrii Nakryiko 142d2a3ad8SAndrii Nakryiko struct non_packed_trailing_space { 152d2a3ad8SAndrii Nakryiko int a; 162d2a3ad8SAndrii Nakryiko short b; 172d2a3ad8SAndrii Nakryiko }; 182d2a3ad8SAndrii Nakryiko 192d2a3ad8SAndrii Nakryiko struct packed_fields { 202d2a3ad8SAndrii Nakryiko short a; 212d2a3ad8SAndrii Nakryiko int b; 222d2a3ad8SAndrii Nakryiko } __attribute__((packed)); 232d2a3ad8SAndrii Nakryiko 242d2a3ad8SAndrii Nakryiko struct non_packed_fields { 252d2a3ad8SAndrii Nakryiko short a; 262d2a3ad8SAndrii Nakryiko int b; 272d2a3ad8SAndrii Nakryiko }; 282d2a3ad8SAndrii Nakryiko 292d2a3ad8SAndrii Nakryiko struct nested_packed { 302d2a3ad8SAndrii Nakryiko char: 4; 312d2a3ad8SAndrii Nakryiko int a: 4; 327e3cbd34SYucong Sun long b; 332d2a3ad8SAndrii Nakryiko struct { 342d2a3ad8SAndrii Nakryiko char c; 352d2a3ad8SAndrii Nakryiko int d; 362d2a3ad8SAndrii Nakryiko } __attribute__((packed)) e; 372d2a3ad8SAndrii Nakryiko } __attribute__((packed)); 382d2a3ad8SAndrii Nakryiko 392d2a3ad8SAndrii Nakryiko union union_is_never_packed { 402d2a3ad8SAndrii Nakryiko int a: 4; 412d2a3ad8SAndrii Nakryiko char b; 422d2a3ad8SAndrii Nakryiko char c: 1; 432d2a3ad8SAndrii Nakryiko }; 442d2a3ad8SAndrii Nakryiko 452d2a3ad8SAndrii Nakryiko union union_does_not_need_packing { 462d2a3ad8SAndrii Nakryiko struct { 477e3cbd34SYucong Sun long a; 482d2a3ad8SAndrii Nakryiko int b; 492d2a3ad8SAndrii Nakryiko } __attribute__((packed)); 502d2a3ad8SAndrii Nakryiko int c; 512d2a3ad8SAndrii Nakryiko }; 522d2a3ad8SAndrii Nakryiko 532d2a3ad8SAndrii Nakryiko union jump_code_union { 542d2a3ad8SAndrii Nakryiko char code[5]; 552d2a3ad8SAndrii Nakryiko struct { 562d2a3ad8SAndrii Nakryiko char jump; 572d2a3ad8SAndrii Nakryiko int offset; 582d2a3ad8SAndrii Nakryiko } __attribute__((packed)); 592d2a3ad8SAndrii Nakryiko }; 602d2a3ad8SAndrii Nakryiko 61b148c8b9SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 62b148c8b9SAndrii Nakryiko /* 63b148c8b9SAndrii Nakryiko *struct nested_packed_but_aligned_struct { 64b148c8b9SAndrii Nakryiko * int x1; 65b148c8b9SAndrii Nakryiko * int x2; 66b148c8b9SAndrii Nakryiko *}; 67b148c8b9SAndrii Nakryiko * 68b148c8b9SAndrii Nakryiko *struct outer_implicitly_packed_struct { 69b148c8b9SAndrii Nakryiko * char y1; 70b148c8b9SAndrii Nakryiko * struct nested_packed_but_aligned_struct y2; 71b148c8b9SAndrii Nakryiko *} __attribute__((packed)); 72b148c8b9SAndrii Nakryiko * 73b148c8b9SAndrii Nakryiko */ 742d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 752d2a3ad8SAndrii Nakryiko 76b148c8b9SAndrii Nakryiko struct nested_packed_but_aligned_struct { 77b148c8b9SAndrii Nakryiko int x1; 78b148c8b9SAndrii Nakryiko int x2; 79b148c8b9SAndrii Nakryiko } __attribute__((packed)); 80b148c8b9SAndrii Nakryiko 81b148c8b9SAndrii Nakryiko struct outer_implicitly_packed_struct { 82b148c8b9SAndrii Nakryiko char y1; 83b148c8b9SAndrii Nakryiko struct nested_packed_but_aligned_struct y2; 84b148c8b9SAndrii Nakryiko }; 85b148c8b9SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 86b148c8b9SAndrii Nakryiko /* 87b148c8b9SAndrii Nakryiko *struct usb_ss_ep_comp_descriptor { 88b148c8b9SAndrii Nakryiko * char: 8; 89b148c8b9SAndrii Nakryiko * char bDescriptorType; 90b148c8b9SAndrii Nakryiko * char bMaxBurst; 91b148c8b9SAndrii Nakryiko * short wBytesPerInterval; 92b148c8b9SAndrii Nakryiko *}; 93b148c8b9SAndrii Nakryiko * 94b148c8b9SAndrii Nakryiko *struct usb_host_endpoint { 95b148c8b9SAndrii Nakryiko * long: 64; 96b148c8b9SAndrii Nakryiko * char: 8; 97b148c8b9SAndrii Nakryiko * struct usb_ss_ep_comp_descriptor ss_ep_comp; 98b148c8b9SAndrii Nakryiko * long: 0; 99b148c8b9SAndrii Nakryiko *} __attribute__((packed)); 100b148c8b9SAndrii Nakryiko * 101b148c8b9SAndrii Nakryiko */ 102b148c8b9SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 103b148c8b9SAndrii Nakryiko 104b148c8b9SAndrii Nakryiko struct usb_ss_ep_comp_descriptor { 105b148c8b9SAndrii Nakryiko char: 8; 106b148c8b9SAndrii Nakryiko char bDescriptorType; 107b148c8b9SAndrii Nakryiko char bMaxBurst; 108b148c8b9SAndrii Nakryiko int: 0; 109b148c8b9SAndrii Nakryiko short wBytesPerInterval; 110b148c8b9SAndrii Nakryiko } __attribute__((packed)); 111b148c8b9SAndrii Nakryiko 112b148c8b9SAndrii Nakryiko struct usb_host_endpoint { 113b148c8b9SAndrii Nakryiko long: 64; 114b148c8b9SAndrii Nakryiko char: 8; 115b148c8b9SAndrii Nakryiko struct usb_ss_ep_comp_descriptor ss_ep_comp; 116b148c8b9SAndrii Nakryiko long: 0; 117b148c8b9SAndrii Nakryiko }; 118b148c8b9SAndrii Nakryiko 119*4fb877aaSAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 120*4fb877aaSAndrii Nakryiko struct nested_packed_struct { 121*4fb877aaSAndrii Nakryiko int a; 122*4fb877aaSAndrii Nakryiko char b; 123*4fb877aaSAndrii Nakryiko } __attribute__((packed)); 124*4fb877aaSAndrii Nakryiko 125*4fb877aaSAndrii Nakryiko struct outer_nonpacked_struct { 126*4fb877aaSAndrii Nakryiko short a; 127*4fb877aaSAndrii Nakryiko struct nested_packed_struct b; 128*4fb877aaSAndrii Nakryiko }; 129*4fb877aaSAndrii Nakryiko 130*4fb877aaSAndrii Nakryiko struct outer_packed_struct { 131*4fb877aaSAndrii Nakryiko short a; 132*4fb877aaSAndrii Nakryiko struct nested_packed_struct b; 133*4fb877aaSAndrii Nakryiko } __attribute__((packed)); 134*4fb877aaSAndrii Nakryiko 135*4fb877aaSAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 136b148c8b9SAndrii Nakryiko f(struct{ struct packed_trailing_space _1; struct non_packed_trailing_space _2; struct packed_fields _3; struct non_packed_fields _4; struct nested_packed _5; union union_is_never_packed _6; union union_does_not_need_packing _7; union jump_code_union _8; struct outer_implicitly_packed_struct _9; struct usb_host_endpoint _10; struct outer_nonpacked_struct _11; struct outer_packed_struct _12; } * _)1372d2a3ad8SAndrii Nakryikoint f(struct { 1382d2a3ad8SAndrii Nakryiko struct packed_trailing_space _1; 1392d2a3ad8SAndrii Nakryiko struct non_packed_trailing_space _2; 1402d2a3ad8SAndrii Nakryiko struct packed_fields _3; 1412d2a3ad8SAndrii Nakryiko struct non_packed_fields _4; 1422d2a3ad8SAndrii Nakryiko struct nested_packed _5; 1432d2a3ad8SAndrii Nakryiko union union_is_never_packed _6; 1442d2a3ad8SAndrii Nakryiko union union_does_not_need_packing _7; 1452d2a3ad8SAndrii Nakryiko union jump_code_union _8; 146b148c8b9SAndrii Nakryiko struct outer_implicitly_packed_struct _9; 147b148c8b9SAndrii Nakryiko struct usb_host_endpoint _10; 148*4fb877aaSAndrii Nakryiko struct outer_nonpacked_struct _11; 149*4fb877aaSAndrii Nakryiko struct outer_packed_struct _12; 1502d2a3ad8SAndrii Nakryiko } *_) 1512d2a3ad8SAndrii Nakryiko { 1522d2a3ad8SAndrii Nakryiko return 0; 1532d2a3ad8SAndrii Nakryiko } 154