| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,231 @@ | ||
| // 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: ]> | ||
|
|
||
|
|
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,11 +1,25 @@ | ||
| // RUN: %clang_cc1 -triple aarch64_be-linux-gnu -ffreestanding -emit-llvm -O0 -o %t -fdump-record-layouts-simple %s | FileCheck %s --check-prefix=LAYOUT | ||
| // RUN: FileCheck %s --check-prefix=IR <%t | ||
|
|
||
| struct bt3 { signed b2:10; signed b3:10; } b16; | ||
|
|
||
| // Get the high 32-bits and then shift appropriately for big-endian. | ||
| signed callee_b0f(struct bt3 bp11) { | ||
| // IR: callee_b0f(i64 [[ARG:%.*]]) | ||
| // IR: [[BP11:%.*]] = alloca %struct.bt3, align 4 | ||
| // IR: [[COERCE_DIVE:%.*]] = getelementptr inbounds %struct.bt3, ptr [[BP11]], i32 0, i32 0 | ||
| // IR: [[COERCE_HIGHBITS:%.*]] = lshr i64 [[ARG]], 32 | ||
| // IR: [[COERCE_VAL_II:%.*]] = trunc i64 [[COERCE_HIGHBITS]] to i32 | ||
| // IR: store i32 [[COERCE_VAL_II]], ptr [[COERCE_DIVE]], align 4 | ||
| // IR: [[BF_LOAD:%.*]] = load i32, ptr [[BP11]], align 4 | ||
| // IR: [[BF_ASHR:%.*]] = ashr i32 [[BF_LOAD]], 22 | ||
| // IR: ret i32 [[BF_ASHR]] | ||
| return bp11.b2; | ||
| } | ||
|
|
||
| // LAYOUT-LABEL: LLVMType:%struct.bt3 = | ||
| // LAYOUT-SAME: type { i32 } | ||
| // LAYOUT: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:22 Size:10 IsSigned:1 StorageSize:32 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:12 Size:10 IsSigned:1 StorageSize:32 StorageOffset:0 | ||
| // LAYOUT-NEXT: ]> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,25 +1,70 @@ | ||
| // RUN: %clang_cc1 %s -emit-llvm -o /dev/null -triple=i686-apple-darwin9 -fdump-record-layouts-simple | FileCheck %s | ||
|
|
||
| // Test struct layout for x86-darwin target | ||
|
|
||
| struct STest1 {int x; short y[4]; double z; } st1; | ||
| struct STest2 {short a,b; int c,d; } st2; | ||
| struct STest3 {char a; short b; int c; } st3; | ||
|
|
||
| // Bitfields | ||
| struct STestB1 {char a; char b:2; } stb1; | ||
| struct STestB2 {char a; char b:5; char c:4; } stb2; | ||
| struct STestB3 {char a; char b:2; } stb3; | ||
| struct STestB4 {char a; short b:2; char c; } stb4; | ||
| struct STestB5 {char a; short b:10; char c; } stb5; | ||
| struct STestB6 {int a:1; char b; int c:13; } stb6; | ||
|
|
||
| // Packed struct STestP1 {char a; short b; int c; } __attribute__((__packed__)) stp1; | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STest1 = | ||
| // CHECK-SAME: type { i32, [4 x i16], double } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STest2 = | ||
| // CHECK-SAME: type { i16, i16, i32, i32 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STest3 = | ||
| // CHECK-SAME: type { i8, i16, i32 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STestB1 = | ||
| // CHECK-SAME: type { i8, i8 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:2 IsSigned:1 StorageSize:8 StorageOffset:1 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STestB2 = | ||
| // CHECK-SAME: type <{ i8, i16 }> | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:5 IsSigned:1 StorageSize:16 StorageOffset:1 | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:8 Size:4 IsSigned:1 StorageSize:16 StorageOffset:1 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STestB3 = | ||
| // CHECK-SAME: type { i8, i8 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:2 IsSigned:1 StorageSize:8 StorageOffset:1 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STestB4 = | ||
| // CHECK-SAME: type { i8, i8, i8, i8 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:2 IsSigned:1 StorageSize:8 StorageOffset:1 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STestB5 = | ||
| // CHECK-SAME: type { i8, i16, i8 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:10 IsSigned:1 StorageSize:16 StorageOffset:2 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // CHECK-LABEL: LLVMType:%struct.STestB6 = | ||
| // CHECK-SAME: type { i8, i8, i16 } | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:1 IsSigned:1 StorageSize:8 StorageOffset:0 | ||
| // CHECK-NEXT: <CGBitFieldInfo Offset:0 Size:13 IsSigned:1 StorageSize:16 StorageOffset:2 | ||
| // CHECK-NEXT: ]> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,150 @@ | ||
| // Check if we can merge bitfields across empty members | ||
|
|
||
| // Configs that have cheap unaligned access | ||
| // Little Endian | ||
| // RUN: %clang_cc1 -triple=aarch64-apple-darwin %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=aarch64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=arm-apple-darwin %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT-DWN32 %s | ||
| // RUN: %clang_cc1 -triple=arm-none-eabi %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=i686-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=loongarch64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=powerpcle-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=ve-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=wasm32 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=wasm64 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=x86_64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Big Endian | ||
| // RUN: %clang_cc1 -triple=powerpc-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=powerpc64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=systemz %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Configs that have expensive unaligned access | ||
| // Little Endian | ||
| // RUN: %clang_cc1 -triple=amdgcn-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=arc-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=bpf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=csky %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=hexagon-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=le64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=loongarch32-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=nvptx-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=riscv32 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=riscv64 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=spir-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=xcore-none-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Big endian | ||
| // RUN: %clang_cc1 -triple=lanai-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=m68k-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=mips-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=mips64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=sparc-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=tce-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| struct Empty {}; | ||
|
|
||
| struct P1 { | ||
| unsigned a : 16; | ||
| [[no_unique_address]] Empty e; | ||
| unsigned b : 16; | ||
| } p1; | ||
| // CHECK-LABEL: LLVMType:%struct.P1 = | ||
| // LAYOUT-SAME: type { i16, i16 } | ||
| // LAYOUT-DWN32-SAME: type { i16, i16 } | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P1 = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:2 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:2 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| struct P2 { | ||
| unsigned a : 15; | ||
| [[no_unique_address]] Empty e; | ||
| unsigned b : 15; | ||
| } p2; | ||
| // CHECK-LABEL: LLVMType:%struct.P2 = | ||
| // LAYOUT-SAME: type { i16, i16 } | ||
| // LAYOUT-DWN32-SAME: type { i16, i16 } | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P2 = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:15 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:15 IsSigned:0 StorageSize:16 StorageOffset:2 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:15 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:15 IsSigned:0 StorageSize:16 StorageOffset:2 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| struct P3 { | ||
| unsigned a : 16; | ||
| Empty e; | ||
| unsigned b : 16; | ||
| } p3; | ||
| // CHECK-LABEL: LLVMType:%struct.P3 = | ||
| // LAYOUT-SAME: type { i16, %struct.Empty, i16, [2 x i8] } | ||
| // LAYOUT-DWN32-SAME: type <{ i16, %struct.Empty, i16 }> | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P3 = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:4 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:3 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| struct P4 { | ||
| unsigned : 0; | ||
| } p4; | ||
| // CHECK-LABEL: LLVMType:%struct.P4 = | ||
| // LAYOUT-SAME: type { {{.+}} } | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P4 = | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| struct P5 { | ||
| ~P5(); | ||
| unsigned : 0; | ||
| } p5; | ||
| // CHECK-LABEL: LLVMType:%struct.P5 = | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P5.base = type {} | ||
| // CHECK: BitFields:[ | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| struct P6 { | ||
| unsigned a : 16; | ||
| unsigned b : 8; | ||
| [[no_unique_address]] Empty e; | ||
| unsigned c; | ||
| } p6; | ||
| // CHECK-LABEL: LLVMType:%struct.P6 = | ||
| // LAYOUT-SAME: type { i32, i32 } | ||
| // LAYOUT-DWN32-SAME: type { i32, i32 } | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P6 = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:32 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:0 StorageSize:32 StorageOffset:0 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:32 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:0 StorageSize:32 StorageOffset:0 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| struct P7 { | ||
| unsigned a : 16; | ||
| unsigned b : 8; | ||
| Empty e; | ||
| unsigned c; | ||
| } p7; | ||
| // CHECK-LABEL: LLVMType:%struct.P7 = | ||
| // LAYOUT-SAME: type { i16, i8, %struct.Empty, i32 } | ||
| // LAYOUT-DWN32-SAME: type { i16, i8, %struct.Empty, i32 } | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.P7 = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:0 StorageSize:8 StorageOffset:2 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:0 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:0 StorageSize:8 StorageOffset:2 | ||
| // CHECK-NEXT: ]> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| // Check we use tail padding if it is known to be safe | ||
|
|
||
| // Configs that have cheap unaligned access | ||
| // Little Endian | ||
| // RUN: %clang_cc1 -triple=aarch64-apple-darwin %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=aarch64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=arm-apple-darwin %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT-DWN32 %s | ||
| // RUN: %clang_cc1 -triple=arm-none-eabi %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=i686-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=loongarch64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=powerpcle-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=ve-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=wasm32 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=wasm64 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=x86_64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Big Endian | ||
| // RUN: %clang_cc1 -triple=powerpc-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=powerpc64-linux-gnu %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=systemz %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Configs that have expensive unaligned access | ||
| // Little Endian | ||
| // RUN: %clang_cc1 -triple=amdgcn-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=arc-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=bpf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=csky %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=hexagon-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=le64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=loongarch32-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=nvptx-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=riscv32 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=riscv64 %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=spir-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=xcore-none-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Big endian | ||
| // RUN: %clang_cc1 -triple=lanai-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=m68k-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=mips-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=mips64-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=sparc-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
| // RUN: %clang_cc1 -triple=tce-elf %s -emit-llvm -o /dev/null -fdump-record-layouts-simple | FileCheck --check-prefixes CHECK,LAYOUT %s | ||
|
|
||
| // Can use tail padding | ||
| struct Pod { | ||
| int a : 16; | ||
| int b : 8; | ||
| } P; | ||
| // CHECK-LABEL: LLVMType:%struct.Pod = | ||
| // LAYOUT-SAME: type { i32 } | ||
| // LAYOUT-DWN32-SAME: type <{ i16, i8 }> | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.Pod = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:32 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:32 StorageOffset:0 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // No tail padding | ||
| struct __attribute__((packed)) PPod { | ||
| int a : 16; | ||
| int b : 8; | ||
| } PP; | ||
| // CHECK-LABEL: LLVMType:%struct.PPod = | ||
| // LAYOUT-SAME: type <{ i16, i8 }> | ||
| // LAYOUT-DWN32-SAME: type <{ i16, i8 }> | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.PPod = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // Cannot use tail padding | ||
| struct NonPod { | ||
| ~NonPod(); | ||
| int a : 16; | ||
| int b : 8; | ||
| } NP; | ||
| // CHECK-LABEL: LLVMType:%struct.NonPod = | ||
| // LAYOUT-SAME: type <{ i16, i8, i8 }> | ||
| // LAYOUT-DWN32-SAME: type <{ i16, i8 }> | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct. | ||
| // LAYOUT-SAME: NonPod.base = type <{ i16, i8 }> | ||
| // LAYOUT-DWN32-SAME: NonPod = type <{ i16, i8 }> | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
| // CHECK-NEXT: ]> | ||
|
|
||
| // No tail padding | ||
| struct __attribute__((packed)) PNonPod { | ||
| ~PNonPod(); | ||
| int a : 16; | ||
| int b : 8; | ||
| } PNP; | ||
| // CHECK-LABEL: LLVMType:%struct.PNonPod = | ||
| // LAYOUT-SAME: type <{ i16, i8 }> | ||
| // LAYOUT-DWN32-SAME: type <{ i16, i8 }> | ||
| // CHECK-NEXT: NonVirtualBaseLLVMType:%struct.PNonPod = | ||
| // CHECK: BitFields:[ | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
|
|
||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:16 IsSigned:1 StorageSize:16 StorageOffset:0 | ||
| // LAYOUT-DWN32-NEXT: <CGBitFieldInfo Offset:{{[0-9]+}} Size:8 IsSigned:1 StorageSize:8 StorageOffset:2 | ||
| // CHECK-NEXT: ]> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,101 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2 | ||
| // RUN: %clang_cc1 -triple x86_64-linux-gnu -O2 -emit-llvm -o - %s | FileCheck %s | ||
|
|
||
| struct Tail { | ||
| ~Tail(); | ||
| int a : 16; | ||
| int b : 8; | ||
| }; | ||
|
|
||
| struct Char { | ||
| int a : 16; | ||
| int b : 8; | ||
| char c; | ||
| }; | ||
|
|
||
| struct Int { | ||
| int a : 16; | ||
| int b : 8; | ||
| int c; | ||
| }; | ||
|
|
||
|
|
||
| // CHECK-LABEL: define dso_local void @_Z1AP4Tail | ||
| // CHECK-SAME: (ptr nocapture noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[BF_LOAD:%.*]] = load i16, ptr [[P]], align 4 | ||
| // CHECK-NEXT: [[INC:%.*]] = add i16 [[BF_LOAD]], 1 | ||
| // CHECK-NEXT: store i16 [[INC]], ptr [[P]], align 4 | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void A (Tail *p) { | ||
| p->a++; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local void @_Z1BP4Tail | ||
| // CHECK-SAME: (ptr nocapture noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 2 | ||
| // CHECK-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 2 | ||
| // CHECK-NEXT: [[INC:%.*]] = add i8 [[BF_LOAD]], 1 | ||
| // CHECK-NEXT: store i8 [[INC]], ptr [[B]], align 2 | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void B (Tail *p) { | ||
| p->b++; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local void @_Z1AP4Char | ||
| // CHECK-SAME: (ptr nocapture noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[BF_LOAD:%.*]] = load i16, ptr [[P]], align 4 | ||
| // CHECK-NEXT: [[INC:%.*]] = add i16 [[BF_LOAD]], 1 | ||
| // CHECK-NEXT: store i16 [[INC]], ptr [[P]], align 4 | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void A (Char *p) { | ||
| p->a++; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local void @_Z1BP4Char | ||
| // CHECK-SAME: (ptr nocapture noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[P]], i64 2 | ||
| // CHECK-NEXT: [[BF_LOAD:%.*]] = load i8, ptr [[B]], align 2 | ||
| // CHECK-NEXT: [[INC:%.*]] = add i8 [[BF_LOAD]], 1 | ||
| // CHECK-NEXT: store i8 [[INC]], ptr [[B]], align 2 | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void B (Char *p) { | ||
| p->b++; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local void @_Z1AP3Int | ||
| // CHECK-SAME: (ptr nocapture noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[BF_LOAD:%.*]] = load i32, ptr [[P]], align 4 | ||
| // CHECK-NEXT: [[INC:%.*]] = add i32 [[BF_LOAD]], 1 | ||
| // CHECK-NEXT: [[BF_VALUE:%.*]] = and i32 [[INC]], 65535 | ||
| // CHECK-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -65536 | ||
| // CHECK-NEXT: [[BF_SET:%.*]] = or disjoint i32 [[BF_VALUE]], [[BF_CLEAR]] | ||
| // CHECK-NEXT: store i32 [[BF_SET]], ptr [[P]], align 4 | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void A (Int *p) { | ||
| p->a++; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local void @_Z1BP3Int | ||
| // CHECK-SAME: (ptr nocapture noundef [[P:%.*]]) local_unnamed_addr #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[BF_LOAD:%.*]] = load i32, ptr [[P]], align 4 | ||
| // CHECK-NEXT: [[BF_VALUE:%.*]] = add i32 [[BF_LOAD]], 65536 | ||
| // CHECK-NEXT: [[BF_SHL2:%.*]] = and i32 [[BF_VALUE]], 16711680 | ||
| // CHECK-NEXT: [[BF_CLEAR:%.*]] = and i32 [[BF_LOAD]], -16711681 | ||
| // CHECK-NEXT: [[BF_SET:%.*]] = or disjoint i32 [[BF_SHL2]], [[BF_CLEAR]] | ||
| // CHECK-NEXT: store i32 [[BF_SET]], ptr [[P]], align 4 | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void B (Int *p) { | ||
| p->b++; | ||
| } |