1 | // RUN: %clang_cc1 -x c -debug-info-kind=limited -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s |
2 | |
3 | // CHECK: %struct.layout3 = type <{ i8, [3 x i8], %struct.size8_pack4, i8, [3 x i8] }> |
4 | // CHECK: %struct.layout0 = type { i8, %struct.size8, i8 } |
5 | // CHECK: %struct.layout1 = type <{ i8, %struct.size8_anon, i8, [2 x i8] }> |
6 | // CHECK: %struct.layout2 = type <{ i8, %struct.size8_pack1, i8 }> |
7 | |
8 | // --------------------------------------------------------------------- |
9 | // Not packed. |
10 | // --------------------------------------------------------------------- |
11 | struct size8 { |
12 | int i : 4; |
13 | long long l : 60; |
14 | }; |
15 | struct layout0 { |
16 | char l0_ofs0; |
17 | struct size8 l0_ofs8; |
18 | int l0_ofs16 : 1; |
19 | }; |
20 | // CHECK: l0_ofs0 |
21 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs8", |
22 | // CHECK-SAME: {{.*}}size: 64, offset: 64) |
23 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs16", |
24 | // CHECK-SAME: {{.*}}size: 1, offset: 128, flags: DIFlagBitField, extraData: i64 128) |
25 | |
26 | |
27 | // --------------------------------------------------------------------- |
28 | // Implicitly packed. |
29 | // --------------------------------------------------------------------- |
30 | struct size8_anon { |
31 | int : 4; |
32 | long long : 60; |
33 | }; |
34 | struct layout1 { |
35 | char l1_ofs0; |
36 | struct size8_anon l1_ofs1; |
37 | int l1_ofs9 : 1; |
38 | }; |
39 | // CHECK: l1_ofs0 |
40 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs1", |
41 | // CHECK-SAME: {{.*}}size: 64, offset: 8) |
42 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs9", |
43 | // CHECK-SAME: {{.*}}size: 1, offset: 72, flags: DIFlagBitField, extraData: i64 72) |
44 | |
45 | |
46 | // --------------------------------------------------------------------- |
47 | // Explicitly packed. |
48 | // --------------------------------------------------------------------- |
49 | #pragma pack(1) |
50 | struct size8_pack1 { |
51 | int i : 4; |
52 | long long l : 60; |
53 | }; |
54 | struct layout2 { |
55 | char l2_ofs0; |
56 | struct size8_pack1 l2_ofs1; |
57 | int l2_ofs9 : 1; |
58 | }; |
59 | #pragma pack() |
60 | // CHECK: l2_ofs0 |
61 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs1", |
62 | // CHECK-SAME: {{.*}}size: 64, offset: 8) |
63 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs9", |
64 | // CHECK-SAME: {{.*}}size: 1, offset: 72, flags: DIFlagBitField, extraData: i64 72) |
65 | |
66 | |
67 | |
68 | // --------------------------------------------------------------------- |
69 | // Explicitly packed with different alignment. |
70 | // --------------------------------------------------------------------- |
71 | #pragma pack(4) |
72 | struct size8_pack4 { |
73 | int i : 4; |
74 | long long l : 60; |
75 | }; |
76 | struct layout3 { |
77 | char l3_ofs0; |
78 | struct size8_pack4 l3_ofs4; |
79 | int l3_ofs12 : 1; |
80 | }; |
81 | #pragma pack() |
82 | // CHECK: l3_ofs0 |
83 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs4", |
84 | // CHECK-SAME: {{.*}}size: 64, offset: 32) |
85 | // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs12", |
86 | // CHECK-SAME: {{.*}}size: 1, offset: 96, flags: DIFlagBitField, extraData: i64 96) |
87 | |
88 | struct layout3 l3; |
89 | struct layout0 l0; |
90 | struct layout1 l1; |
91 | struct layout2 l2; |
92 | |