// SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) /* * BTF-to-C dumper tests for implicit and explicit padding between fields and * at the end of a struct. * * Copyright (c) 2019 Facebook */ /* ----- START-EXPECTED-OUTPUT ----- */ struct padded_implicitly { int a; long b; char c; }; /* ------ END-EXPECTED-OUTPUT ------ */ /* ----- START-EXPECTED-OUTPUT ----- */ /* *struct padded_explicitly { * int a; * long: 0; * int b; *}; * */ /* ------ END-EXPECTED-OUTPUT ------ */ struct padded_explicitly { int a; int: 1; /* algo will emit aligning `long: 0;` here */ int b; }; /* ----- START-EXPECTED-OUTPUT ----- */ struct padded_a_lot { int a; long: 64; long: 64; int b; }; /* ------ END-EXPECTED-OUTPUT ------ */ /* ----- START-EXPECTED-OUTPUT ----- */ /* *struct padded_cache_line { * int a; * long: 64; * long: 64; * long: 64; * int b; * long: 64; * long: 64; * long: 64; *}; * */ /* ------ END-EXPECTED-OUTPUT ------ */ struct padded_cache_line { int a; int b __attribute__((aligned(32))); }; /* ----- START-EXPECTED-OUTPUT ----- */ /* *struct zone_padding { * char x[0]; *}; * *struct zone { * int a; * short b; * long: 0; * struct zone_padding __pad__; *}; * */ /* ------ END-EXPECTED-OUTPUT ------ */ struct zone_padding { char x[0]; } __attribute__((__aligned__(8))); struct zone { int a; short b; struct zone_padding __pad__; }; /* ----- START-EXPECTED-OUTPUT ----- */ struct padding_wo_named_members { long: 64; long: 64; }; struct padding_weird_1 { int a; long: 64; short: 16; short b; }; /* ------ END-EXPECTED-OUTPUT ------ */ /* ----- START-EXPECTED-OUTPUT ----- */ /* *struct padding_weird_2 { * long: 56; * char a; * long: 56; * char b; * char: 8; *}; * */ /* ------ END-EXPECTED-OUTPUT ------ */ struct padding_weird_2 { int: 32; /* these paddings will be collapsed into `long: 56;` */ short: 16; char: 8; char a; int: 32; /* these paddings will be collapsed into `long: 56;` */ short: 16; char: 8; char b; char: 8; }; /* ----- START-EXPECTED-OUTPUT ----- */ struct exact_1byte { char x; }; struct padded_1byte { char: 8; }; struct exact_2bytes { short x; }; struct padded_2bytes { short: 16; }; struct exact_4bytes { int x; }; struct padded_4bytes { int: 32; }; struct exact_8bytes { long x; }; struct padded_8bytes { long: 64; }; struct ff_periodic_effect { int: 32; short magnitude; long: 0; short phase; long: 0; int: 32; int custom_len; short *custom_data; }; struct ib_wc { long: 64; long: 64; int: 32; int byte_len; void *qp; union {} ex; long: 64; int slid; int wc_flags; long: 64; char smac[6]; long: 0; char network_hdr_type; }; struct acpi_object_method { long: 64; char: 8; char type; short reference_count; char flags; short: 0; char: 8; char sync_level; long: 64; void *node; void *aml_start; union {} dispatch; long: 64; int aml_length; }; struct nested_unpacked { int x; }; struct nested_packed { struct nested_unpacked a; char c; } __attribute__((packed)); struct outer_mixed_but_unpacked { struct nested_packed b1; short a1; struct nested_packed b2; }; /* ------ END-EXPECTED-OUTPUT ------ */ int f(struct { struct padded_implicitly _1; struct padded_explicitly _2; struct padded_a_lot _3; struct padded_cache_line _4; struct zone _5; struct padding_wo_named_members _6; struct padding_weird_1 _7; struct padding_weird_2 _8; struct exact_1byte _100; struct padded_1byte _101; struct exact_2bytes _102; struct padded_2bytes _103; struct exact_4bytes _104; struct padded_4bytes _105; struct exact_8bytes _106; struct padded_8bytes _107; struct ff_periodic_effect _200; struct ib_wc _201; struct acpi_object_method _202; struct outer_mixed_but_unpacked _203; } *_) { return 0; }