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