12d2a3ad8SAndrii Nakryiko // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) 22d2a3ad8SAndrii Nakryiko 32d2a3ad8SAndrii Nakryiko /* 42d2a3ad8SAndrii Nakryiko * BTF-to-C dumper tests for bitfield. 52d2a3ad8SAndrii Nakryiko * 62d2a3ad8SAndrii Nakryiko * Copyright (c) 2019 Facebook 72d2a3ad8SAndrii Nakryiko */ 82d2a3ad8SAndrii Nakryiko #include <stdbool.h> 92d2a3ad8SAndrii Nakryiko 102d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 112d2a3ad8SAndrii Nakryiko /* 122d2a3ad8SAndrii Nakryiko *struct bitfields_only_mixed_types { 132d2a3ad8SAndrii Nakryiko * int a: 3; 147e3cbd34SYucong Sun * long b: 2; 152d2a3ad8SAndrii Nakryiko * _Bool c: 1; 162d2a3ad8SAndrii Nakryiko * enum { 172d2a3ad8SAndrii Nakryiko * A = 0, 182d2a3ad8SAndrii Nakryiko * B = 1, 192d2a3ad8SAndrii Nakryiko * } d: 1; 202d2a3ad8SAndrii Nakryiko * short e: 5; 212d2a3ad8SAndrii Nakryiko * int: 20; 222d2a3ad8SAndrii Nakryiko * unsigned int f: 30; 232d2a3ad8SAndrii Nakryiko *}; 242d2a3ad8SAndrii Nakryiko * 252d2a3ad8SAndrii Nakryiko */ 262d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 272d2a3ad8SAndrii Nakryiko 282d2a3ad8SAndrii Nakryiko struct bitfields_only_mixed_types { 292d2a3ad8SAndrii Nakryiko int a: 3; 307e3cbd34SYucong Sun long b: 2; 312d2a3ad8SAndrii Nakryiko bool c: 1; /* it's really a _Bool type */ 322d2a3ad8SAndrii Nakryiko enum { 332d2a3ad8SAndrii Nakryiko A, /* A = 0, dumper is very explicit */ 342d2a3ad8SAndrii Nakryiko B, /* B = 1, same */ 352d2a3ad8SAndrii Nakryiko } d: 1; 362d2a3ad8SAndrii Nakryiko short e: 5; 372d2a3ad8SAndrii Nakryiko /* 20-bit padding here */ 382d2a3ad8SAndrii Nakryiko unsigned f: 30; /* this gets aligned on 4-byte boundary */ 392d2a3ad8SAndrii Nakryiko }; 402d2a3ad8SAndrii Nakryiko 412d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 422d2a3ad8SAndrii Nakryiko /* 432d2a3ad8SAndrii Nakryiko *struct bitfield_mixed_with_others { 442d2a3ad8SAndrii Nakryiko * char: 4; 452d2a3ad8SAndrii Nakryiko * int a: 4; 462d2a3ad8SAndrii Nakryiko * short b; 477e3cbd34SYucong Sun * long c; 487e3cbd34SYucong Sun * long d: 8; 492d2a3ad8SAndrii Nakryiko * int e; 502d2a3ad8SAndrii Nakryiko * int f; 512d2a3ad8SAndrii Nakryiko *}; 522d2a3ad8SAndrii Nakryiko * 532d2a3ad8SAndrii Nakryiko */ 542d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 552d2a3ad8SAndrii Nakryiko struct bitfield_mixed_with_others { 56*ea2ce1baSAndrii Nakryiko char: 4; /* char is enough as a backing field */ 572d2a3ad8SAndrii Nakryiko int a: 4; 582d2a3ad8SAndrii Nakryiko /* 8-bit implicit padding */ 592d2a3ad8SAndrii Nakryiko short b; /* combined with previous bitfield */ 602d2a3ad8SAndrii Nakryiko /* 4 more bytes of implicit padding */ 612d2a3ad8SAndrii Nakryiko long c; 622d2a3ad8SAndrii Nakryiko long d: 8; 632d2a3ad8SAndrii Nakryiko /* 24 bits implicit padding */ 642d2a3ad8SAndrii Nakryiko int e; /* combined with previous bitfield */ 652d2a3ad8SAndrii Nakryiko int f; 662d2a3ad8SAndrii Nakryiko /* 4 bytes of padding */ 672d2a3ad8SAndrii Nakryiko }; 682d2a3ad8SAndrii Nakryiko 692d2a3ad8SAndrii Nakryiko /* ----- START-EXPECTED-OUTPUT ----- */ 702d2a3ad8SAndrii Nakryiko /* 712d2a3ad8SAndrii Nakryiko *struct bitfield_flushed { 722d2a3ad8SAndrii Nakryiko * int a: 4; 732d2a3ad8SAndrii Nakryiko * long: 60; 747e3cbd34SYucong Sun * long b: 16; 752d2a3ad8SAndrii Nakryiko *}; 762d2a3ad8SAndrii Nakryiko * 772d2a3ad8SAndrii Nakryiko */ 782d2a3ad8SAndrii Nakryiko /* ------ END-EXPECTED-OUTPUT ------ */ 792d2a3ad8SAndrii Nakryiko struct bitfield_flushed { 802d2a3ad8SAndrii Nakryiko int a: 4; 812d2a3ad8SAndrii Nakryiko long: 0; /* flush until next natural alignment boundary */ 822d2a3ad8SAndrii Nakryiko long b: 16; 832d2a3ad8SAndrii Nakryiko }; 842d2a3ad8SAndrii Nakryiko f(struct{ struct bitfields_only_mixed_types _1; struct bitfield_mixed_with_others _2; struct bitfield_flushed _3; } * _)852d2a3ad8SAndrii Nakryikoint f(struct { 862d2a3ad8SAndrii Nakryiko struct bitfields_only_mixed_types _1; 872d2a3ad8SAndrii Nakryiko struct bitfield_mixed_with_others _2; 882d2a3ad8SAndrii Nakryiko struct bitfield_flushed _3; 892d2a3ad8SAndrii Nakryiko } *_) 902d2a3ad8SAndrii Nakryiko { 912d2a3ad8SAndrii Nakryiko return 0; 922d2a3ad8SAndrii Nakryiko } 93