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
28struct 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 ------ */
55struct 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 ------ */
79struct bitfield_flushed {
80	int a: 4;
81	long: 0; /* flush until next natural alignment boundary */
82	long b: 16;
83};
84
85int 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