1 // RUN: %clang_cc1 -malign-double -triple i386-unknown-linux -emit-llvm %s -o - \
2 // RUN:   | FileCheck --check-prefix=CHECK-ON --check-prefix=CHECK %s
3 
4 // RUN: %clang_cc1 -triple i386-unknown-linux -emit-llvm %s -o - \
5 // RUN:   | FileCheck --check-prefix=CHECK-OFF --check-prefix=CHECK %s
6 
7 /* Structs S1, S2, S3, S4, and union U5 are taken from Intel, "IA-64
8    Software Conventions and Runtime Architecture Guide", version of
9    August 1999, Section 4.2, Figures 4-1 through 4-5.
10    A Union containing a double was also thrown in for good measure. */
11 
12 struct S1 {
13   char c;
14 };
15 
16 unsigned S1_align = __alignof(struct S1);
17 unsigned S1_size = sizeof(struct S1);
18 // CHECK: @S1_align = global i32 1, align 4
19 // CHECK: @S1_size = global i32 1, align 4
20 
21 unsigned S1_c_offset = (unsigned) &((struct S1*) 0)->c;
22 // CHECK: @S1_c_offset = global i32 0, align 4
23 
24 struct S2{
25   char c;
26   char d;
27   short s;
28   int n;
29 };
30 
31 unsigned S2_align = __alignof(struct S2);
32 unsigned S2_size = sizeof(struct S2);
33 // CHECK: @S2_align = global i32 4, align 4
34 // CHECK: @S2_size = global i32 8, align 4
35 
36 unsigned S2_c_offset = (unsigned) &((struct S2*) 0)->c;
37 unsigned S2_d_offset = (unsigned) &((struct S2*) 0)->d;
38 unsigned S2_s_offset = (unsigned) &((struct S2*) 0)->s;
39 unsigned S2_n_offset = (unsigned) &((struct S2*) 0)->n;
40 // CHECK: @S2_c_offset = global i32 0, align 4
41 // CHECK: @S2_d_offset = global i32 1, align 4
42 // CHECK: @S2_s_offset = global i32 2, align 4
43 // CHECK: @S2_n_offset = global i32 4, align 4
44 
45 struct S3 {
46   char c;
47   short s;
48 };
49 
50 unsigned S3_align = __alignof(struct S3);
51 unsigned S3_size = sizeof(struct S3);
52 // CHECK: @S3_align = global i32 2, align 4
53 // CHECK: @S3_size = global i32 4, align 4
54 
55 unsigned S3_c_offset = (unsigned) &((struct S3*) 0)->c;
56 unsigned S3_s_offset = (unsigned) &((struct S3*) 0)->s;
57 // CHECK: @S3_c_offset = global i32 0, align 4
58 // CHECK: @S3_s_offset = global i32 2, align 4
59 
60 struct S4 {
61   char c;
62   double d;
63   short s;
64 };
65 
66 unsigned S4_align = __alignof(struct S4);
67 unsigned S4_size = sizeof(struct S4);
68 // CHECK-ON: @S4_align = global i32 8, align 4
69 // CHECK-ON: @S4_size = global i32 24, align 4
70 // CHECK-OFF: @S4_align = global i32 4, align 4
71 // CHECK-OFF: @S4_size = global i32 16, align 4
72 
73 unsigned S4_c_offset = (unsigned) &((struct S4*) 0)->c;
74 unsigned S4_d_offset = (unsigned) &((struct S4*) 0)->d;
75 unsigned S4_s_offset = (unsigned) &((struct S4*) 0)->s;
76 // CHECK: @S4_c_offset = global i32 0, align 4
77 // CHECK-ON: @S4_d_offset = global i32 8, align 4
78 // CHECK-ON: @S4_s_offset = global i32 16, align 4
79 // CHECK-OFF: @S4_d_offset = global i32 4, align 4
80 // CHECK-OFF: @S4_s_offset = global i32 12, align 4
81 
82 union S5 {
83   char c;
84   short s;
85   int j;
86 };
87 
88 unsigned S5_align = __alignof(union S5);
89 unsigned S5_size = sizeof(union S5);
90 // CHECK: @S5_align = global i32 4, align 4
91 // CHECK: @S5_size = global i32 4, align 4
92 
93 unsigned S5_c_offset = (unsigned) &((union S5*) 0)->c;
94 unsigned S5_s_offset = (unsigned) &((union S5*) 0)->s;
95 unsigned S5_j_offset = (unsigned) &((union S5*) 0)->j;
96 // CHECK: @S5_c_offset = global i32 0, align 4
97 // CHECK: @S5_s_offset = global i32 0, align 4
98 // CHECK: @S5_j_offset = global i32 0, align 4
99 
100 union S6 {
101   char c;
102   double d;
103 };
104 
105 unsigned S6_align = __alignof(union S6);
106 unsigned S6_size = sizeof(union S6);
107 // CHECK-ON: @S6_align = global i32 8, align 4
108 // CHECK-ON: @S6_size = global i32 8, align 4
109 // CHECK-OFF: @S6_align = global i32 4, align 4
110 // CHECK-OFF: @S6_size = global i32 8, align 4
111 
112 unsigned S6_c_offset = (unsigned) &((union S6*) 0)->c;
113 unsigned S6_d_offset = (unsigned) &((union S6*) 0)->d;
114 // CHECK: @S6_c_offset = global i32 0, align 4
115 // CHECK: @S6_d_offset = global i32 0, align 4
116