| // RUN: %clang_cc1 -x c -debug-info-kind=limited -emit-llvm -triple x86_64-apple-darwin -o - %s | FileCheck %s |
| |
| // CHECK: %struct.layout3 = type <{ i8, [3 x i8], %struct.size8_pack4, i8, [3 x i8] }> |
| // CHECK: %struct.layout0 = type { i8, %struct.size8, i8 } |
| // CHECK: %struct.layout1 = type <{ i8, %struct.size8_anon, i8, [2 x i8] }> |
| // CHECK: %struct.layout2 = type <{ i8, %struct.size8_pack1, i8 }> |
| |
| // --------------------------------------------------------------------- |
| // Not packed. |
| // --------------------------------------------------------------------- |
| struct size8 { |
| int i : 4; |
| long long l : 60; |
| }; |
| struct layout0 { |
| char l0_ofs0; |
| struct size8 l0_ofs8; |
| int l0_ofs16 : 1; |
| }; |
| // CHECK: l0_ofs0 |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs8", |
| // CHECK-SAME: {{.*}}size: 64, offset: 64) |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l0_ofs16", |
| // CHECK-SAME: {{.*}}size: 1, offset: 128, flags: DIFlagBitField, extraData: i64 128) |
| |
| |
| // --------------------------------------------------------------------- |
| // Implicitly packed. |
| // --------------------------------------------------------------------- |
| struct size8_anon { |
| int : 4; |
| long long : 60; |
| }; |
| struct layout1 { |
| char l1_ofs0; |
| struct size8_anon l1_ofs1; |
| int l1_ofs9 : 1; |
| }; |
| // CHECK: l1_ofs0 |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs1", |
| // CHECK-SAME: {{.*}}size: 64, offset: 8) |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l1_ofs9", |
| // CHECK-SAME: {{.*}}size: 1, offset: 72, flags: DIFlagBitField, extraData: i64 72) |
| |
| |
| // --------------------------------------------------------------------- |
| // Explicitly packed. |
| // --------------------------------------------------------------------- |
| #pragma pack(1) |
| struct size8_pack1 { |
| int i : 4; |
| long long l : 60; |
| }; |
| struct layout2 { |
| char l2_ofs0; |
| struct size8_pack1 l2_ofs1; |
| int l2_ofs9 : 1; |
| }; |
| #pragma pack() |
| // CHECK: l2_ofs0 |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs1", |
| // CHECK-SAME: {{.*}}size: 64, offset: 8) |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs9", |
| // CHECK-SAME: {{.*}}size: 1, offset: 72, flags: DIFlagBitField, extraData: i64 72) |
| |
| |
| |
| // --------------------------------------------------------------------- |
| // Explicitly packed with different alignment. |
| // --------------------------------------------------------------------- |
| #pragma pack(4) |
| struct size8_pack4 { |
| int i : 4; |
| long long l : 60; |
| }; |
| struct layout3 { |
| char l3_ofs0; |
| struct size8_pack4 l3_ofs4; |
| int l3_ofs12 : 1; |
| }; |
| #pragma pack() |
| // CHECK: l3_ofs0 |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs4", |
| // CHECK-SAME: {{.*}}size: 64, offset: 32) |
| // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs12", |
| // CHECK-SAME: {{.*}}size: 1, offset: 96, flags: DIFlagBitField, extraData: i64 96) |
| |
| struct layout3 l3; |
| struct layout0 l0; |
| struct layout1 l1; |
| struct layout2 l2; |