Home | History | Annotate | Download | only in CodeGen
      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