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