1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
2
3 /*
4 * BTF-to-C dumper tests for bitfield.
5 *
6 * Copyright (c) 2019 Facebook
7 */
8 #include <stdbool.h>
9
10 /* ----- START-EXPECTED-OUTPUT ----- */
11 /*
12 *struct bitfields_only_mixed_types {
13 * int a: 3;
14 * long b: 2;
15 * _Bool c: 1;
16 * enum {
17 * A = 0,
18 * B = 1,
19 * } d: 1;
20 * short e: 5;
21 * int: 20;
22 * unsigned int f: 30;
23 *};
24 *
25 */
26 /* ------ END-EXPECTED-OUTPUT ------ */
27
28 struct bitfields_only_mixed_types {
29 int a: 3;
30 long b: 2;
31 bool c: 1; /* it's really a _Bool type */
32 enum {
33 A, /* A = 0, dumper is very explicit */
34 B, /* B = 1, same */
35 } d: 1;
36 short e: 5;
37 /* 20-bit padding here */
38 unsigned f: 30; /* this gets aligned on 4-byte boundary */
39 };
40
41 /* ----- START-EXPECTED-OUTPUT ----- */
42 /*
43 *struct bitfield_mixed_with_others {
44 * char: 4;
45 * int a: 4;
46 * short b;
47 * long c;
48 * long d: 8;
49 * int e;
50 * int f;
51 *};
52 *
53 */
54 /* ------ END-EXPECTED-OUTPUT ------ */
55 struct bitfield_mixed_with_others {
56 long: 4; /* char is enough as a backing field */
57 int a: 4;
58 /* 8-bit implicit padding */
59 short b; /* combined with previous bitfield */
60 /* 4 more bytes of implicit padding */
61 long c;
62 long d: 8;
63 /* 24 bits implicit padding */
64 int e; /* combined with previous bitfield */
65 int f;
66 /* 4 bytes of padding */
67 };
68
69 /* ----- START-EXPECTED-OUTPUT ----- */
70 /*
71 *struct bitfield_flushed {
72 * int a: 4;
73 * long: 60;
74 * long b: 16;
75 *};
76 *
77 */
78 /* ------ END-EXPECTED-OUTPUT ------ */
79 struct bitfield_flushed {
80 int a: 4;
81 long: 0; /* flush until next natural alignment boundary */
82 long b: 16;
83 };
84
f(struct{ struct bitfields_only_mixed_types _1; struct bitfield_mixed_with_others _2; struct bitfield_flushed _3; } * _)85 int f(struct {
86 struct bitfields_only_mixed_types _1;
87 struct bitfield_mixed_with_others _2;
88 struct bitfield_flushed _3;
89 } *_)
90 {
91 return 0;
92 }
93