
Reimplement bitfield access unit computation for SysV ABIs. Considers expense of unaligned and non-power-of-2 accesses.
232 lines
7.7 KiB
C
232 lines
7.7 KiB
C
// 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
|
|
// 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
|
|
|
|
// 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
|
|
// 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
|
|
|
|
struct st0 {
|
|
short c : 7;
|
|
} st0;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st0 =
|
|
// LAYOUT-SAME: type { i8, i8 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st1 {
|
|
int a : 10;
|
|
short c : 6;
|
|
} st1;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st1 =
|
|
// LAYOUT-SAME: type { i16, [2 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:10 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:6 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st2 {
|
|
int a : 10;
|
|
short c : 7;
|
|
} st2;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st2 =
|
|
// LAYOUT-SAME: type { i32 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:10 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st3 {
|
|
volatile short c : 7;
|
|
} st3;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st3 =
|
|
// LAYOUT-SAME: type { i8, i8 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:7 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st4 {
|
|
int b : 9;
|
|
volatile char c : 5;
|
|
} st4;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st4 =
|
|
// LAYOUT-SAME: type { i16, [2 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:9 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st5 {
|
|
int a : 12;
|
|
volatile char c : 5;
|
|
} st5;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st5 =
|
|
// LAYOUT-SAME: type { i32 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:12 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st6 {
|
|
int a : 12;
|
|
char b;
|
|
int c : 5;
|
|
} st6;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st6 =
|
|
// LAYOUT-SAME: type { i16, i8, i8 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:12 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:8 StorageOffset:3
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st7a {
|
|
char a;
|
|
int b : 5;
|
|
} st7a;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st7a =
|
|
// LAYOUT-SAME: type { i8, i8, [2 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:5 IsSigned:1 StorageSize:8 StorageOffset:1
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st7b {
|
|
char x;
|
|
volatile struct st7a y;
|
|
} st7b;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st7b =
|
|
// LAYOUT-SAME: type { i8, [3 x i8], %struct.st7a }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st8 {
|
|
unsigned f : 16;
|
|
} st8;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st8 =
|
|
// LAYOUT-SAME: type { i16, [2 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st9{
|
|
int f : 8;
|
|
} st9;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st9 =
|
|
// LAYOUT-SAME: type { i8, [3 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st10{
|
|
int e : 1;
|
|
int f : 8;
|
|
} st10;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st10 =
|
|
// LAYOUT-SAME: type { i16, [2 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:1 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st11{
|
|
char e;
|
|
int f : 16;
|
|
} st11;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st11 =
|
|
// LAYOUT-SAME: type <{ i8, i16, i8 }>
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:1
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st12{
|
|
int e : 8;
|
|
int f : 16;
|
|
} st12;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st12 =
|
|
// LAYOUT-SAME: type { i32 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st13 {
|
|
char a : 8;
|
|
int b : 32;
|
|
} __attribute__((packed)) st13;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st13 =
|
|
// LAYOUT-SAME: type <{ i8, i32 }>
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:1
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st14 {
|
|
char a : 8;
|
|
} __attribute__((packed)) st14;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st14 =
|
|
// LAYOUT-SAME: type { i8 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st15 {
|
|
short a : 8;
|
|
} __attribute__((packed)) st15;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st15 =
|
|
// LAYOUT-SAME: type { i8 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st16 {
|
|
int a : 32;
|
|
int b : 16;
|
|
int c : 32;
|
|
int d : 16;
|
|
} st16;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st16 =
|
|
// LAYOUT-SAME: type { i32, i16, i32, i16 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:4
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:8
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:12
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct st17 {
|
|
int b : 32;
|
|
char c : 8;
|
|
} __attribute__((packed)) st17;
|
|
// LAYOUT-LABEL: LLVMType:%struct.st17 =
|
|
// LAYOUT-SAME: type <{ i32, i8 }>
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:32 IsSigned:1 StorageSize:32 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:4
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct zero_bitfield {
|
|
int a : 8;
|
|
char : 0;
|
|
int b : 8;
|
|
} st18;
|
|
// LAYOUT-LABEL: LLVMType:%struct.zero_bitfield =
|
|
// LAYOUT-SAME: type { i8, i8, [2 x i8] }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:1
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
struct zero_bitfield_ok {
|
|
short a : 8;
|
|
char a1 : 8;
|
|
long : 0;
|
|
int b : 24;
|
|
} st19;
|
|
// LAYOUT-LABEL: LLVMType:%struct.zero_bitfield_ok =
|
|
// LAYOUT-SAME: type { i16, i32 }
|
|
// LAYOUT: BitFields:[
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:16 StorageOffset:0
|
|
// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:24 IsSigned:1 StorageSize:32 StorageOffset:4
|
|
// LAYOUT-NEXT: ]>
|
|
|
|
|