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 | char: 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 | |
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 | |