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 | |