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