1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mms-bitfields -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck --input-file=%t.cir %s --check-prefix=CIR
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mms-bitfields -fclangir -emit-llvm %s -o %t-cir.ll
// RUN: FileCheck --input-file=%t-cir.ll %s --check-prefix=LLVM
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -mms-bitfields -emit-llvm %s -o %t.ll
// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG
struct s1 {
int f32 : 2;
long long f64 : 30;
} s1;
// CIR-DAG: !rec_s1 = !cir.record<struct "s1" {!s32i, !s64i}>
// LLVM-DAG: %struct.s1 = type { i32, i64 }
// OGCG-DAG: %struct.s1 = type { i32, i64 }
struct s2 {
int a : 24;
char b;
int c : 30;
} Clip;
// CIR-DAG: !rec_s2 = !cir.record<struct "s2" {!s32i, !s8i, !s32i}>
// LLVM-DAG: %struct.s2 = type { i32, i8, i32 }
// OGCG-DAG: %struct.s2 = type { i32, i8, i32 }
struct s3 {
int a : 18;
int : 0;
int c : 14;
} zero_bit;
// CIR-DAG: !rec_s3 = !cir.record<struct "s3" {!s32i, !s32i}>
// LLVM-DAG: %struct.s3 = type { i32, i32 }
// OGCG-DAG: %struct.s3 = type { i32, i32 }
#pragma pack (push,1)
struct Inner {
unsigned int A : 1;
unsigned int B : 1;
unsigned int C : 1;
unsigned int D : 30;
} Inner;
#pragma pack (pop)
// CIR-DAG: !rec_Inner = !cir.record<struct "Inner" {!u32i, !u32i}>
// LLVM-DAG: %struct.Inner = type { i32, i32 }
// OGCG-DAG: %struct.Inner = type { i32, i32 }
#pragma pack(push, 1)
union HEADER {
struct A {
int : 3; // Bits 2:0
int a : 9; // Bits 11:3
int : 12; // Bits 23:12
int b : 17; // Bits 40:24
int : 7; // Bits 47:41
int c : 4; // Bits 51:48
int : 4; // Bits 55:52
int d : 3; // Bits 58:56
int : 5; // Bits 63:59
} Bits;
} HEADER;
#pragma pack(pop)
// CIR-DAG: !rec_A = !cir.record<struct "A" {!s32i, !s32i, !s32i}>
// CIR-DAG: !rec_HEADER = !cir.record<union "HEADER" {!rec_A}>
// LLVM-DAG: %struct.A = type { i32, i32, i32 }
// LLVM-DAG: %union.HEADER = type { %struct.A }
// OGCG-DAG: %struct.A = type { i32, i32, i32 }
// OGCG-DAG: %union.HEADER = type { %struct.A }
|