Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -emit-llvm -o - -triple x86_64-apple-darwin9 %s | FileCheck %s
      2 // RUN: %clang_cc1 -emit-llvm -o - -triple thumbv7-apple-ios -target-abi apcs-gnu %s | FileCheck %s -check-prefix=CHECK-ARM
      3 
      4 // rdar://8823265
      5 
      6 // Note that we're declaring global variables with these types,
      7 // triggering both Sema and IRGen struct layout.
      8 
      9 #define ATTR __attribute__((__ms_struct__))
     10 
     11 struct
     12 {
     13    char foo;
     14    long : 0;
     15    char bar;
     16 } ATTR t1;
     17 int s1 = sizeof(t1);
     18 // CHECK: @s1 = global i32 2
     19 // CHECK-ARM: @s1 = global i32 2
     20 
     21 struct
     22 {
     23    char foo;
     24    long : 0;
     25    char : 0;
     26    int : 0;
     27    char bar;
     28 } ATTR t2;
     29 int s2 = sizeof(t2);
     30 // CHECK: @s2 = global i32 2
     31 // CHECK-ARM: @s2 = global i32 2
     32 
     33 struct
     34 {
     35    char foo;
     36    long : 0;
     37    char : 0;
     38    int : 0;
     39    char bar;
     40    long : 0;
     41    char : 0;
     42 } ATTR t3;
     43 int s3 = sizeof(t3);
     44 // CHECK: @s3 = global i32 2
     45 // CHECK-ARM: @s3 = global i32 2
     46 
     47 struct
     48 {
     49    long : 0;
     50    char bar;
     51 } ATTR t4;
     52 int s4 = sizeof(t4);
     53 // CHECK: @s4 = global i32 1
     54 // CHECK-ARM: @s4 = global i32 1
     55 
     56 struct
     57 {
     58    long : 0;
     59    long : 0;
     60    char : 0;
     61    char bar;
     62 } ATTR t5;
     63 int s5 = sizeof(t5);
     64 // CHECK: @s5 = global i32 1
     65 // CHECK-ARM: @s5 = global i32 1
     66 
     67 struct
     68 {
     69    long : 0;
     70    long : 0;
     71    char : 0;
     72    char bar;
     73 } ATTR t6;
     74 int s6 = sizeof(t6);
     75 // CHECK: @s6 = global i32 1
     76 // CHECK-ARM: @s6 = global i32 1
     77 
     78 struct
     79 {
     80    char foo;
     81    long : 0;
     82    int : 0;
     83    char bar;
     84    char bar1;
     85    long : 0;
     86    char bar2;
     87    char bar3;
     88    char : 0;
     89    char bar4;
     90    char bar5;
     91    char : 0;
     92    char bar6;
     93    char bar7;
     94 } ATTR t7;
     95 int s7 = sizeof(t7);
     96 // CHECK: @s7 = global i32 9
     97 // CHECK-ARM: @s7 = global i32 9
     98 
     99 struct
    100 {
    101    long : 0;
    102    long : 0;
    103    char : 0;
    104 } ATTR t8;
    105 int s8 = sizeof(t8);
    106 // CHECK: @s8 = global i32 0
    107 // CHECK-ARM: @s8 = global i32 0
    108 
    109 struct
    110 {
    111    char foo;
    112    long : 0;
    113    int : 0;
    114    char bar;
    115    char bar1;
    116    long : 0;
    117    char bar2;
    118    char bar3;
    119    char : 0;
    120    char bar4;
    121    char bar5;
    122    char : 0;
    123    char bar6;
    124    char bar7;
    125    int  i1;
    126    char : 0;
    127    long : 0;
    128    char :4;
    129    char bar8;
    130    char : 0;
    131    char bar9;
    132    char bar10;
    133    int  i2;
    134    char : 0;
    135    long : 0;
    136    char :4;
    137 } ATTR t9;
    138 int s9 = sizeof(t9);
    139 // CHECK: @s9 = global i32 28
    140 // CHECK-ARM: @s9 = global i32 28
    141 
    142 struct
    143 {
    144    char foo: 8;
    145    long : 0;
    146    char bar;
    147 } ATTR t10;
    148 int s10 = sizeof(t10);
    149 // CHECK: @s10 = global i32 16
    150 // CHECK-ARM: @s10 = global i32 8
    151 
    152 // rdar://16041826 - ensure that ms_structs work correctly on a
    153 // !useBitFieldTypeAlignment() target
    154 struct {
    155   unsigned int a : 31;
    156   unsigned int b : 2;
    157   unsigned int c;
    158 } ATTR t11;
    159 int s11 = sizeof(t11);
    160 // CHECK: @s11 = global i32 12
    161 // CHECK-ARM: @s11 = global i32 12
    162 
    163 struct {
    164   unsigned char a : 3;
    165   unsigned char b : 4;
    166   unsigned short c : 6;
    167 } ATTR t12;
    168 int s12 = sizeof(t12);
    169 // CHECK: @s12 = global i32 4
    170 // CHECK-ARM: @s12 = global i32 4
    171 
    172 struct {
    173   unsigned char a : 3;
    174   unsigned char b : 4;
    175   __attribute__((packed)) unsigned short c : 6;
    176 } ATTR t13;
    177 int s13 = sizeof(t13);
    178 // CHECK: @s13 = global i32 4
    179 // CHECK-ARM: @s13 = global i32 4
    180