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 Nakryiko int 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