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