1 // RUN: %clang_cc1 -triple armv8-none-linux-eabi -fno-aapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT 2 // RUN: %clang_cc1 -triple armebv8-none-linux-eabi -fno-aapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT 3 4 // RUN: %clang_cc1 -triple armv8-none-linux-eabi -faapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT 5 // RUN: %clang_cc1 -triple armebv8-none-linux-eabi -faapcs-bitfield-width -fdump-record-layouts-simple -emit-llvm -o /dev/null %s | FileCheck %s -check-prefixes=LAYOUT 6 7 struct st0 { 8 short c : 7; 9 } st0; 10 // LAYOUT-LABEL: LLVMType:%struct.st0 = 11 // LAYOUT-SAME: type { i8, i8 } 12 // LAYOUT: BitFields:[ 13 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:8 StorageOffset:0 14 // LAYOUT-NEXT: ]> 15 16 struct st1 { 17 int a : 10; 18 short c : 6; 19 } st1; 20 // LAYOUT-LABEL: LLVMType:%struct.st1 = 21 // LAYOUT-SAME: type { i16, [2 x i8] } 22 // LAYOUT: BitFields:[ 23 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:10 IsSigned:1 StorageSize:16 StorageOffset:0 24 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:6 IsSigned:1 StorageSize:16 StorageOffset:0 25 // LAYOUT-NEXT: ]> 26 27 struct st2 { 28 int a : 10; 29 short c : 7; 30 } st2; 31 // LAYOUT-LABEL: LLVMType:%struct.st2 = 32 // LAYOUT-SAME: type { i32 } 33 // LAYOUT: BitFields:[ 34 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:10 IsSigned:1 StorageSize:32 StorageOffset:0 35 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:32 StorageOffset:0 36 // LAYOUT-NEXT: ]> 37 38 struct st3 { 39 volatile short c : 7; 40 } st3; 41 // LAYOUT-LABEL: LLVMType:%struct.st3 = 42 // LAYOUT-SAME: type { i8, i8 } 43 // LAYOUT: BitFields:[ 44 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:8 StorageOffset:0 45 // LAYOUT-NEXT: ]> 46 47 struct st4 { 48 int b : 9; 49 volatile char c : 5; 50 } st4; 51 // LAYOUT-LABEL: LLVMType:%struct.st4 = 52 // LAYOUT-SAME: type { i16, [2 x i8] } 53 // LAYOUT: BitFields:[ 54 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:9 IsSigned:1 StorageSize:16 StorageOffset:0 55 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:16 StorageOffset:0 56 // LAYOUT-NEXT: ]> 57 58 struct st5 { 59 int a : 12; 60 volatile char c : 5; 61 } st5; 62 // LAYOUT-LABEL: LLVMType:%struct.st5 = 63 // LAYOUT-SAME: type { i32 } 64 // LAYOUT: BitFields:[ 65 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:12 IsSigned:1 StorageSize:32 StorageOffset:0 66 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:32 StorageOffset:0 67 // LAYOUT-NEXT: ]> 68 69 struct st6 { 70 int a : 12; 71 char b; 72 int c : 5; 73 } st6; 74 // LAYOUT-LABEL: LLVMType:%struct.st6 = 75 // LAYOUT-SAME: type { i16, i8, i8 } 76 // LAYOUT: BitFields:[ 77 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:12 IsSigned:1 StorageSize:16 StorageOffset:0 78 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:8 StorageOffset:3 79 // LAYOUT-NEXT: ]> 80 81 struct st7a { 82 char a; 83 int b : 5; 84 } st7a; 85 // LAYOUT-LABEL: LLVMType:%struct.st7a = 86 // LAYOUT-SAME: type { i8, i8, [2 x i8] } 87 // LAYOUT: BitFields:[ 88 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:8 StorageOffset:1 89 // LAYOUT-NEXT: ]> 90 91 struct st7b { 92 char x; 93 volatile struct st7a y; 94 } st7b; 95 // LAYOUT-LABEL: LLVMType:%struct.st7b = 96 // LAYOUT-SAME: type { i8, [3 x i8], %struct.st7a } 97 // LAYOUT: BitFields:[ 98 // LAYOUT-NEXT: ]> 99 100 struct st8 { 101 unsigned f : 16; 102 } st8; 103 // LAYOUT-LABEL: LLVMType:%struct.st8 = 104 // LAYOUT-SAME: type { i16, [2 x i8] } 105 // LAYOUT: BitFields:[ 106 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 107 // LAYOUT-NEXT: ]> 108 109 struct st9{ 110 int f : 8; 111 } st9; 112 // LAYOUT-LABEL: LLVMType:%struct.st9 = 113 // LAYOUT-SAME: type { i8, [3 x i8] } 114 // LAYOUT: BitFields:[ 115 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0 116 // LAYOUT-NEXT: ]> 117 118 struct st10{ 119 int e : 1; 120 int f : 8; 121 } st10; 122 // LAYOUT-LABEL: LLVMType:%struct.st10 = 123 // LAYOUT-SAME: type { i16, [2 x i8] } 124 // LAYOUT: BitFields:[ 125 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:1 IsSigned:1 StorageSize:16 StorageOffset:0 126 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:16 StorageOffset:0 127 // LAYOUT-NEXT: ]> 128 129 struct st11{ 130 char e; 131 int f : 16; 132 } st11; 133 // LAYOUT-LABEL: LLVMType:%struct.st11 = 134 // LAYOUT-SAME: type <{ i8, i16, i8 }> 135 // LAYOUT: BitFields:[ 136 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:1 137 // LAYOUT-NEXT: ]> 138 139 struct st12{ 140 int e : 8; 141 int f : 16; 142 } st12; 143 // LAYOUT-LABEL: LLVMType:%struct.st12 = 144 // LAYOUT-SAME: type { i32 } 145 // LAYOUT: BitFields:[ 146 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:32 StorageOffset:0 147 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:32 StorageOffset:0 148 // LAYOUT-NEXT: ]> 149 150 struct st13 { 151 char a : 8; 152 int b : 32; 153 } __attribute__((packed)) st13; 154 // LAYOUT-LABEL: LLVMType:%struct.st13 = 155 // LAYOUT-SAME: type <{ i8, i32 }> 156 // LAYOUT: BitFields:[ 157 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0 158 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:1 159 // LAYOUT-NEXT: ]> 160 161 struct st14 { 162 char a : 8; 163 } __attribute__((packed)) st14; 164 // LAYOUT-LABEL: LLVMType:%struct.st14 = 165 // LAYOUT-SAME: type { i8 } 166 // LAYOUT: BitFields:[ 167 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0 168 // LAYOUT-NEXT: ]> 169 170 struct st15 { 171 short a : 8; 172 } __attribute__((packed)) st15; 173 // LAYOUT-LABEL: LLVMType:%struct.st15 = 174 // LAYOUT-SAME: type { i8 } 175 // LAYOUT: BitFields:[ 176 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0 177 // LAYOUT-NEXT: ]> 178 179 struct st16 { 180 int a : 32; 181 int b : 16; 182 int c : 32; 183 int d : 16; 184 } st16; 185 // LAYOUT-LABEL: LLVMType:%struct.st16 = 186 // LAYOUT-SAME: type { i32, i16, i32, i16 } 187 // LAYOUT: BitFields:[ 188 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:0 189 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:4 190 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:8 191 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:12 192 // LAYOUT-NEXT: ]> 193 194 struct st17 { 195 int b : 32; 196 char c : 8; 197 } __attribute__((packed)) st17; 198 // LAYOUT-LABEL: LLVMType:%struct.st17 = 199 // LAYOUT-SAME: type <{ i32, i8 }> 200 // LAYOUT: BitFields:[ 201 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:0 202 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:4 203 // LAYOUT-NEXT: ]> 204 205 struct zero_bitfield { 206 int a : 8; 207 char : 0; 208 int b : 8; 209 } st18; 210 // LAYOUT-LABEL: LLVMType:%struct.zero_bitfield = 211 // LAYOUT-SAME: type { i8, i8, [2 x i8] } 212 // LAYOUT: BitFields:[ 213 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0 214 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:1 215 // LAYOUT-NEXT: ]> 216 217 struct zero_bitfield_ok { 218 short a : 8; 219 char a1 : 8; 220 long : 0; 221 int b : 24; 222 } st19; 223 // LAYOUT-LABEL: LLVMType:%struct.zero_bitfield_ok = 224 // LAYOUT-SAME: type { i16, i32 } 225 // LAYOUT: BitFields:[ 226 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:16 StorageOffset:0 227 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:16 StorageOffset:0 228 // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:24 IsSigned:1 StorageSize:32 StorageOffset:4 229 // LAYOUT-NEXT: ]> 230 231 232