116 lines · cpp
1// RUN: %clang_cc1 -malign-double -triple i386-unknown-linux -emit-llvm %s -o - \2// RUN: | FileCheck --check-prefix=CHECK-ON --check-prefix=CHECK %s3 4// RUN: %clang_cc1 -triple i386-unknown-linux -emit-llvm %s -o - \5// RUN: | FileCheck --check-prefix=CHECK-OFF --check-prefix=CHECK %s6 7/* Structs S1, S2, S3, S4, and union U5 are taken from Intel, "IA-648 Software Conventions and Runtime Architecture Guide", version of9 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 12struct S1 {13 char c;14};15 16unsigned S1_align = __alignof(struct S1);17unsigned S1_size = sizeof(struct S1);18// CHECK: @S1_align ={{.*}} global i32 1, align 419// CHECK: @S1_size ={{.*}} global i32 1, align 420 21unsigned S1_c_offset = (unsigned) &((struct S1*) 0)->c;22// CHECK: @S1_c_offset ={{.*}} global i32 0, align 423 24struct S2{25 char c;26 char d;27 short s;28 int n;29};30 31unsigned S2_align = __alignof(struct S2);32unsigned S2_size = sizeof(struct S2);33// CHECK: @S2_align ={{.*}} global i32 4, align 434// CHECK: @S2_size ={{.*}} global i32 8, align 435 36unsigned S2_c_offset = (unsigned) &((struct S2*) 0)->c;37unsigned S2_d_offset = (unsigned) &((struct S2*) 0)->d;38unsigned S2_s_offset = (unsigned) &((struct S2*) 0)->s;39unsigned S2_n_offset = (unsigned) &((struct S2*) 0)->n;40// CHECK: @S2_c_offset ={{.*}} global i32 0, align 441// CHECK: @S2_d_offset ={{.*}} global i32 1, align 442// CHECK: @S2_s_offset ={{.*}} global i32 2, align 443// CHECK: @S2_n_offset ={{.*}} global i32 4, align 444 45struct S3 {46 char c;47 short s;48};49 50unsigned S3_align = __alignof(struct S3);51unsigned S3_size = sizeof(struct S3);52// CHECK: @S3_align ={{.*}} global i32 2, align 453// CHECK: @S3_size ={{.*}} global i32 4, align 454 55unsigned S3_c_offset = (unsigned) &((struct S3*) 0)->c;56unsigned S3_s_offset = (unsigned) &((struct S3*) 0)->s;57// CHECK: @S3_c_offset ={{.*}} global i32 0, align 458// CHECK: @S3_s_offset ={{.*}} global i32 2, align 459 60struct S4 {61 char c;62 double d;63 short s;64};65 66unsigned S4_align = __alignof(struct S4);67unsigned S4_size = sizeof(struct S4);68// CHECK-ON: @S4_align ={{.*}} global i32 8, align 469// CHECK-ON: @S4_size ={{.*}} global i32 24, align 470// CHECK-OFF: @S4_align ={{.*}} global i32 4, align 471// CHECK-OFF: @S4_size ={{.*}} global i32 16, align 472 73unsigned S4_c_offset = (unsigned) &((struct S4*) 0)->c;74unsigned S4_d_offset = (unsigned) &((struct S4*) 0)->d;75unsigned S4_s_offset = (unsigned) &((struct S4*) 0)->s;76// CHECK: @S4_c_offset ={{.*}} global i32 0, align 477// CHECK-ON: @S4_d_offset ={{.*}} global i32 8, align 478// CHECK-ON: @S4_s_offset ={{.*}} global i32 16, align 479// CHECK-OFF: @S4_d_offset ={{.*}} global i32 4, align 480// CHECK-OFF: @S4_s_offset ={{.*}} global i32 12, align 481 82union S5 {83 char c;84 short s;85 int j;86};87 88unsigned S5_align = __alignof(union S5);89unsigned S5_size = sizeof(union S5);90// CHECK: @S5_align ={{.*}} global i32 4, align 491// CHECK: @S5_size ={{.*}} global i32 4, align 492 93unsigned S5_c_offset = (unsigned) &((union S5*) 0)->c;94unsigned S5_s_offset = (unsigned) &((union S5*) 0)->s;95unsigned S5_j_offset = (unsigned) &((union S5*) 0)->j;96// CHECK: @S5_c_offset ={{.*}} global i32 0, align 497// CHECK: @S5_s_offset ={{.*}} global i32 0, align 498// CHECK: @S5_j_offset ={{.*}} global i32 0, align 499 100union S6 {101 char c;102 double d;103};104 105unsigned S6_align = __alignof(union S6);106unsigned S6_size = sizeof(union S6);107// CHECK-ON: @S6_align ={{.*}} global i32 8, align 4108// CHECK-ON: @S6_size ={{.*}} global i32 8, align 4109// CHECK-OFF: @S6_align ={{.*}} global i32 4, align 4110// CHECK-OFF: @S6_size ={{.*}} global i32 8, align 4111 112unsigned S6_c_offset = (unsigned) &((union S6*) 0)->c;113unsigned S6_d_offset = (unsigned) &((union S6*) 0)->d;114// CHECK: @S6_c_offset ={{.*}} global i32 0, align 4115// CHECK: @S6_d_offset ={{.*}} global i32 0, align 4116