brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.3 KiB · fb961f3 Raw
157 lines · cpp
1// Check we use tail padding if it is known to be safe2 3// Configs that have cheap unaligned access4// Little Endian5// RUN: %clang_cc1 -triple=aarch64-apple-darwin %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s6// RUN: %clang_cc1 -triple=aarch64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s7// RUN: %clang_cc1 -triple=arm-apple-darwin %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT-DWN32 %s8// RUN: %clang_cc1 -triple=arm-none-eabi %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s9// RUN: %clang_cc1 -triple=i686-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s10// RUN: %clang_cc1 -triple=loongarch64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s11// RUN: %clang_cc1 -triple=powerpcle-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s12// RUN: %clang_cc1 -triple=ve-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s13// RUN: %clang_cc1 -triple=wasm32 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s14// RUN: %clang_cc1 -triple=wasm64 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s15// RUN: %clang_cc1 -triple=x86_64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s16 17// Big Endian18// RUN: %clang_cc1 -triple=powerpc-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s19// RUN: %clang_cc1 -triple=powerpc64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s20// RUN: %clang_cc1 -triple=systemz %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s21 22// Configs that have expensive unaligned access23// Little Endian24// RUN: %clang_cc1 -triple=amdgcn-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s25// RUN: %clang_cc1 -triple=arc-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s26// RUN: %clang_cc1 -triple=bpf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s27// RUN: %clang_cc1 -triple=csky %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s28// RUN: %clang_cc1 -triple=hexagon-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s29// RUN: %clang_cc1 -triple=loongarch32-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s30// RUN: %clang_cc1 -triple=nvptx-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s31// RUN: %clang_cc1 -triple=riscv32 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s32// RUN: %clang_cc1 -triple=riscv64 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s33// RUN: %clang_cc1 -triple=spir-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s34// RUN: %clang_cc1 -triple=xcore-none-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s35 36// Big endian37// RUN: %clang_cc1 -triple=lanai-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s38// RUN: %clang_cc1 -triple=m68k-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s39// RUN: %clang_cc1 -triple=mips-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s40// RUN: %clang_cc1 -triple=mips64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT64 %s41// RUN: %clang_cc1 -triple=sparc-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s42// RUN: %clang_cc1 -triple=tce-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT,LAYOUT32 %s43 44// Can use tail padding45struct Pod {46  int a : 16;47  int b : 8;48} P;49// CHECK-LABEL: LLVMType:%struct.Pod =50// LAYOUT-SAME: type { i32 }51// LAYOUT-DWN32-SAME: type <{ i16, i8 }>52// CHECK-NEXT: NonVirtualBaseLLVMType:%struct.Pod =53// CHECK: BitFields:[54// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:32 StorageOffset:055// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:32 StorageOffset:056 57// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:058// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:259// CHECK-NEXT: ]>60 61// No tail padding62struct __attribute__((packed)) PPod {63  int a : 16;64  int b : 8;65} PP;66// CHECK-LABEL: LLVMType:%struct.PPod =67// LAYOUT-SAME: type <{ i16, i8 }>68// LAYOUT-DWN32-SAME: type <{ i16, i8 }>69// CHECK-NEXT: NonVirtualBaseLLVMType:%struct.PPod =70// CHECK: BitFields:[71// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:072// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:273 74// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:075// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:276// CHECK-NEXT: ]>77 78// Cannot use tail padding79struct NonPod {80  ~NonPod();81  int a : 16;82  int b : 8;83} NP;84// CHECK-LABEL: LLVMType:%struct.NonPod =85// LAYOUT-SAME: type <{ i16, i8, i8 }>86// LAYOUT-DWN32-SAME: type <{ i16, i8 }>87// CHECK-NEXT: NonVirtualBaseLLVMType:%struct.88// LAYOUT-SAME: NonPod.base = type <{ i16, i8 }>89// LAYOUT-DWN32-SAME: NonPod = type <{ i16, i8 }>90// CHECK: BitFields:[91// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:092// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:293 94// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:095// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:296// CHECK-NEXT: ]>97 98// No tail padding99struct __attribute__((packed)) PNonPod {100  ~PNonPod();101  int a : 16;102  int b : 8;103} PNP;104// CHECK-LABEL: LLVMType:%struct.PNonPod =105// LAYOUT-SAME: type <{ i16, i8 }>106// LAYOUT-DWN32-SAME: type <{ i16, i8 }>107// CHECK-NEXT: NonVirtualBaseLLVMType:%struct.PNonPod =108// CHECK: BitFields:[109// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0110// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2111 112// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0113// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2114// CHECK-NEXT: ]>115 116struct __attribute__((aligned(4))) Empty {} empty;117 118struct Char { char a; } cbase;119struct D : virtual Char {120  [[no_unique_address]] Empty e0;121  [[no_unique_address]] Empty e1;122  unsigned a : 24; // keep as 24bits123} d;124// CHECK-LABEL: LLVMType:%struct.D =125// LAYOUT64-SAME: type <{ ptr, [3 x i8], %struct.Char, [4 x i8] }>126// LAYOUT32-SAME: type { ptr, [3 x i8], %struct.Char }127// LAYOUT-DWN32-SAME: type { ptr, [3 x i8], %struct.Char }128// CHECK-NEXT: NonVirtualBaseLLVMType:129// LAYOUT64-SAME: %struct.D.base = type <{ ptr, i32 }>130// LAYOUT32-SAME: %struct.D = type { ptr, [3 x i8], %struct.Char }131// LAYOUT-DWN32-SAME: %struct.D = type { ptr, [3 x i8], %struct.Char }132// CHECK: BitFields:[133// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:24 IsSigned:0 StorageSize:24 StorageOffset:{{(4|8)}}134 135// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:24 IsSigned:0 StorageSize:24 StorageOffset:{{(4|8)}}136// CHECK-NEXT: ]>137 138struct Int { int a; } ibase;139struct E : virtual Int {140  [[no_unique_address]] Empty e0;141  [[no_unique_address]] Empty e1;142  unsigned a : 24; // expand to 32143} e;144// CHECK-LABEL: LLVMType:%struct.E =145// LAYOUT64-SAME: type <{ ptr, i32, %struct.Int }>146// LAYOUT32-SAME: type { ptr, i32, %struct.Int }147// LAYOUT-DWN32-SAME: type { ptr, i32, %struct.Int }148// CHECK-NEXT: NonVirtualBaseLLVMType:%struct.E.base =149// LAYOUT64-SAME: type <{ ptr, i32 }>150// LAYOUT32-SAME: type { ptr, i32 }151// LAYOUT-DWN32-SAME: type { ptr, i32 }152// CHECK: BitFields:[153// LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:24 IsSigned:0 StorageSize:32 StorageOffset:{{(4|8)}}154 155// LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:24 IsSigned:0 StorageSize:32 StorageOffset:{{(4|8)}}156// CHECK-NEXT: ]>157