diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-08 17:13:11 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-08 17:13:11 +0000 |
| commit | 0a5fb09b599c1bdea3cd11168bb8f4ff4040316e (patch) | |
| tree | 5e94367d1a8032322c6871cfe16714c0982fd61a /test | |
| parent | f0c0337bbfb63d1f9edf145aab535bdf82c20454 (diff) | |
Notes
Diffstat (limited to 'test')
39 files changed, 1219 insertions, 173 deletions
diff --git a/test/CodeGen/aarch64-args.cpp b/test/CodeGen/aarch64-args.cpp new file mode 100644 index 000000000000..409773627261 --- /dev/null +++ b/test/CodeGen/aarch64-args.cpp @@ -0,0 +1,67 @@ +// RUN: %clang_cc1 -triple arm64-apple-ios7.0 -target-abi darwinpcs -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple aarch64-linux-gnu -emit-llvm -o - -x c %s | FileCheck %s --check-prefix=CHECK-GNU-C +// RUN: %clang_cc1 -triple aarch64-linux-gnu -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-GNU-CXX + +// Empty structs are ignored for PCS purposes on Darwin and in C mode elsewhere. +// In C++ mode on ELF they consume a register slot though. Functions are +// slightly bigger than minimal to make confirmation against actual GCC +// behaviour easier. + +#if __cplusplus +#define EXTERNC extern "C" +#else +#define EXTERNC +#endif + +struct Empty {}; + +// CHECK: define i32 @empty_arg(i32 %a) +// CHECK-GNU-C: define i32 @empty_arg(i32 %a) +// CHECK-GNU-CXX: define i32 @empty_arg(i8 %e.coerce, i32 %a) +EXTERNC int empty_arg(struct Empty e, int a) { + return a; +} + +// CHECK: define void @empty_ret() +// CHECK-GNU-C: define void @empty_ret() +// CHECK-GNU-CXX: define void @empty_ret() +EXTERNC struct Empty empty_ret() { + struct Empty e; + return e; +} + +// However, what counts as "empty" is a baroque mess. This is super-empty, it's +// ignored even in C++ mode. It also has sizeof == 0, violating C++, but that's +// legacy for you: + +struct SuperEmpty { + int arr[0]; +}; + +// CHECK: define i32 @super_empty_arg(i32 %a) +// CHECK-GNU-C: define i32 @super_empty_arg(i32 %a) +// CHECK-GNU-CXX: define i32 @super_empty_arg(i32 %a) +EXTERNC int super_empty_arg(struct SuperEmpty e, int a) { + return a; +} + +// This is not empty. It has 0 size but consumes a register slot for GCC. + +struct SortOfEmpty { + struct SuperEmpty e; +}; + +// CHECK: define i32 @sort_of_empty_arg(i32 %a) +// CHECK-GNU-C: define i32 @sort_of_empty_arg(i32 %a) +// CHECK-GNU-CXX: define i32 @sort_of_empty_arg(i8 %e.coerce, i32 %a) +EXTERNC int sort_of_empty_arg(struct Empty e, int a) { + return a; +} + +// CHECK: define void @sort_of_empty_ret() +// CHECK-GNU-C: define void @sort_of_empty_ret() +// CHECK-GNU-CXX: define void @sort_of_empty_ret() +EXTERNC struct SortOfEmpty sort_of_empty_ret() { + struct SortOfEmpty e; + return e; +} diff --git a/test/CodeGen/arm_acle.c b/test/CodeGen/arm_acle.c index b4f39bef1572..7c8a5aa8adb0 100644 --- a/test/CodeGen/arm_acle.c +++ b/test/CodeGen/arm_acle.c @@ -76,7 +76,7 @@ void test_dbg(void) { // AArch32: call i32 @llvm.arm.strex // AArch64: call i64 @llvm.aarch64.ldxr // AArch64: call i32 @llvm.aarch64.stxr -uint32_t test_swp(uint32_t x, volatile void *p) { +void test_swp(uint32_t x, volatile void *p) { __swp(x, p); } @@ -118,6 +118,7 @@ void test_nop(void) { } /* 9 DATA-PROCESSING INTRINSICS */ + /* 9.2 Miscellaneous data-processing intrinsics */ // ARM-LABEL: test_ror // ARM: lshr @@ -266,8 +267,7 @@ uint64_t test_rbitll(uint64_t t) { } /* 9.4 Saturating intrinsics */ -#ifdef __ARM_32BIT_STATE - +#ifdef __ARM_FEATURE_SAT /* 9.4.1 Width-specified saturation intrinsics */ // AArch32-LABEL: test_ssat // AArch32: call i32 @llvm.arm.ssat(i32 %t, i32 1) @@ -277,11 +277,13 @@ int32_t test_ssat(int32_t t) { // AArch32-LABEL: test_usat // AArch32: call i32 @llvm.arm.usat(i32 %t, i32 2) -int32_t test_usat(int32_t t) { +uint32_t test_usat(int32_t t) { return __usat(t, 2); } +#endif /* 9.4.2 Saturating addition and subtraction intrinsics */ +#ifdef __ARM_FEATURE_DSP // AArch32-LABEL: test_qadd // AArch32: call i32 @llvm.arm.qadd(i32 %a, i32 %b) int32_t test_qadd(int32_t a, int32_t b) { @@ -304,6 +306,389 @@ int32_t test_qdbl() { } #endif +/* + * 9.3 16-bit multiplications + */ +#if __ARM_FEATURE_DSP +// AArch32-LABEL: test_smulbb +// AArch32: call i32 @llvm.arm.smulbb +int32_t test_smulbb(int32_t a, int32_t b) { + return __smulbb(a, b); +} +// AArch32-LABEL: test_smulbt +// AArch32: call i32 @llvm.arm.smulbt +int32_t test_smulbt(int32_t a, int32_t b) { + return __smulbt(a, b); +} +// AArch32-LABEL: test_smultb +// AArch32: call i32 @llvm.arm.smultb +int32_t test_smultb(int32_t a, int32_t b) { + return __smultb(a, b); +} +// AArch32-LABEL: test_smultt +// AArch32: call i32 @llvm.arm.smultt +int32_t test_smultt(int32_t a, int32_t b) { + return __smultt(a, b); +} +// AArch32-LABEL: test_smulwb +// AArch32: call i32 @llvm.arm.smulwb +int32_t test_smulwb(int32_t a, int32_t b) { + return __smulwb(a, b); +} +// AArch32-LABEL: test_smulwt +// AArch32: call i32 @llvm.arm.smulwt +int32_t test_smulwt(int32_t a, int32_t b) { + return __smulwt(a, b); +} +#endif + +/* 9.4.3 Accumultating multiplications */ +#if __ARM_FEATURE_DSP +// AArch32-LABEL: test_smlabb +// AArch32: call i32 @llvm.arm.smlabb(i32 %a, i32 %b, i32 %c) +int32_t test_smlabb(int32_t a, int32_t b, int32_t c) { + return __smlabb(a, b, c); +} +// AArch32-LABEL: test_smlabt +// AArch32: call i32 @llvm.arm.smlabt(i32 %a, i32 %b, i32 %c) +int32_t test_smlabt(int32_t a, int32_t b, int32_t c) { + return __smlabt(a, b, c); +} +// AArch32-LABEL: test_smlatb +// AArch32: call i32 @llvm.arm.smlatb(i32 %a, i32 %b, i32 %c) +int32_t test_smlatb(int32_t a, int32_t b, int32_t c) { + return __smlatb(a, b, c); +} +// AArch32-LABEL: test_smlatt +// AArch32: call i32 @llvm.arm.smlatt(i32 %a, i32 %b, i32 %c) +int32_t test_smlatt(int32_t a, int32_t b, int32_t c) { + return __smlatt(a, b, c); +} +// AArch32-LABEL: test_smlawb +// AArch32: call i32 @llvm.arm.smlawb(i32 %a, i32 %b, i32 %c) +int32_t test_smlawb(int32_t a, int32_t b, int32_t c) { + return __smlawb(a, b, c); +} +// AArch32-LABEL: test_smlawt +// AArch32: call i32 @llvm.arm.smlawt(i32 %a, i32 %b, i32 %c) +int32_t test_smlawt(int32_t a, int32_t b, int32_t c) { + return __smlawt(a, b, c); +} +#endif + +/* 9.5.4 Parallel 16-bit saturation */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_ssat16 +// AArch32: call i32 @llvm.arm.ssat16 +int16x2_t test_ssat16(int16x2_t a) { + return __ssat16(a, 15); +} +// AArch32-LABEL: test_usat16 +// AArch32: call i32 @llvm.arm.usat16 +uint16x2_t test_usat16(int16x2_t a) { + return __usat16(a, 15); +} +#endif + +/* 9.5.5 Packing and unpacking */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_sxtab16 +// AArch32: call i32 @llvm.arm.sxtab16 +int16x2_t test_sxtab16(int16x2_t a, int8x4_t b) { + return __sxtab16(a, b); +} +// AArch32-LABEL: test_sxtb16 +// AArch32: call i32 @llvm.arm.sxtb16 +int16x2_t test_sxtb16(int8x4_t a) { + return __sxtb16(a); +} +// AArch32-LABEL: test_uxtab16 +// AArch32: call i32 @llvm.arm.uxtab16 +int16x2_t test_uxtab16(int16x2_t a, int8x4_t b) { + return __uxtab16(a, b); +} +// AArch32-LABEL: test_uxtb16 +// AArch32: call i32 @llvm.arm.uxtb16 +int16x2_t test_uxtb16(int8x4_t a) { + return __uxtb16(a); +} +#endif + +/* 9.5.6 Parallel selection */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_sel +// AArch32: call i32 @llvm.arm.sel +uint8x4_t test_sel(uint8x4_t a, uint8x4_t b) { + return __sel(a, b); +} +#endif + +/* 9.5.7 Parallel 8-bit addition and subtraction */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_qadd8 +// AArch32: call i32 @llvm.arm.qadd8 +int16x2_t test_qadd8(int8x4_t a, int8x4_t b) { + return __qadd8(a, b); +} +// AArch32-LABEL: test_qsub8 +// AArch32: call i32 @llvm.arm.qsub8 +int8x4_t test_qsub8(int8x4_t a, int8x4_t b) { + return __qsub8(a, b); +} +// AArch32-LABEL: test_sadd8 +// AArch32: call i32 @llvm.arm.sadd8 +int8x4_t test_sadd8(int8x4_t a, int8x4_t b) { + return __sadd8(a, b); +} +// AArch32-LABEL: test_shadd8 +// AArch32: call i32 @llvm.arm.shadd8 +int8x4_t test_shadd8(int8x4_t a, int8x4_t b) { + return __shadd8(a, b); +} +// AArch32-LABEL: test_shsub8 +// AArch32: call i32 @llvm.arm.shsub8 +int8x4_t test_shsub8(int8x4_t a, int8x4_t b) { + return __shsub8(a, b); +} +// AArch32-LABEL: test_ssub8 +// AArch32: call i32 @llvm.arm.ssub8 +int8x4_t test_ssub8(int8x4_t a, int8x4_t b) { + return __ssub8(a, b); +} +// AArch32-LABEL: test_uadd8 +// AArch32: call i32 @llvm.arm.uadd8 +uint8x4_t test_uadd8(uint8x4_t a, uint8x4_t b) { + return __uadd8(a, b); +} +// AArch32-LABEL: test_uhadd8 +// AArch32: call i32 @llvm.arm.uhadd8 +uint8x4_t test_uhadd8(uint8x4_t a, uint8x4_t b) { + return __uhadd8(a, b); +} +// AArch32-LABEL: test_uhsub8 +// AArch32: call i32 @llvm.arm.uhsub8 +uint8x4_t test_uhsub8(uint8x4_t a, uint8x4_t b) { + return __uhsub8(a, b); +} +// AArch32-LABEL: test_uqadd8 +// AArch32: call i32 @llvm.arm.uqadd8 +uint8x4_t test_uqadd8(uint8x4_t a, uint8x4_t b) { + return __uqadd8(a, b); +} +// AArch32-LABEL: test_uqsub8 +// AArch32: call i32 @llvm.arm.uqsub8 +uint8x4_t test_uqsub8(uint8x4_t a, uint8x4_t b) { + return __uqsub8(a, b); +} +// AArch32-LABEL: test_usub8 +// AArch32: call i32 @llvm.arm.usub8 +uint8x4_t test_usub8(uint8x4_t a, uint8x4_t b) { + return __usub8(a, b); +} +#endif + +/* 9.5.8 Sum of 8-bit absolute differences */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_usad8 +// AArch32: call i32 @llvm.arm.usad8 +uint32_t test_usad8(uint8x4_t a, uint8x4_t b) { + return __usad8(a, b); +} +// AArch32-LABEL: test_usada8 +// AArch32: call i32 @llvm.arm.usada8 +uint32_t test_usada8(uint8_t a, uint8_t b, uint8_t c) { + return __usada8(a, b, c); +} +#endif + +/* 9.5.9 Parallel 16-bit addition and subtraction */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_qadd16 +// AArch32: call i32 @llvm.arm.qadd16 +int16x2_t test_qadd16(int16x2_t a, int16x2_t b) { + return __qadd16(a, b); +} +// AArch32-LABEL: test_qasx +// AArch32: call i32 @llvm.arm.qasx +int16x2_t test_qasx(int16x2_t a, int16x2_t b) { + return __qasx(a, b); +} +// AArch32-LABEL: test_qsax +// AArch32: call i32 @llvm.arm.qsax +int16x2_t test_qsax(int16x2_t a, int16x2_t b) { + return __qsax(a, b); +} +// AArch32-LABEL: test_qsub16 +// AArch32: call i32 @llvm.arm.qsub16 +int16x2_t test_qsub16(int16x2_t a, int16x2_t b) { + return __qsub16(a, b); +} +// AArch32-LABEL: test_sadd16 +// AArch32: call i32 @llvm.arm.sadd16 +int16x2_t test_sadd16(int16x2_t a, int16x2_t b) { + return __sadd16(a, b); +} +// AArch32-LABEL: test_sasx +// AArch32: call i32 @llvm.arm.sasx +int16x2_t test_sasx(int16x2_t a, int16x2_t b) { + return __sasx(a, b); +} +// AArch32-LABEL: test_shadd16 +// AArch32: call i32 @llvm.arm.shadd16 +int16x2_t test_shadd16(int16x2_t a, int16x2_t b) { + return __shadd16(a, b); +} +// AArch32-LABEL: test_shasx +// AArch32: call i32 @llvm.arm.shasx +int16x2_t test_shasx(int16x2_t a, int16x2_t b) { + return __shasx(a, b); +} +// AArch32-LABEL: test_shsax +// AArch32: call i32 @llvm.arm.shsax +int16x2_t test_shsax(int16x2_t a, int16x2_t b) { + return __shsax(a, b); +} +// AArch32-LABEL: test_shsub16 +// AArch32: call i32 @llvm.arm.shsub16 +int16x2_t test_shsub16(int16x2_t a, int16x2_t b) { + return __shsub16(a, b); +} +// AArch32-LABEL: test_ssax +// AArch32: call i32 @llvm.arm.ssax +int16x2_t test_ssax(int16x2_t a, int16x2_t b) { + return __ssax(a, b); +} +// AArch32-LABEL: test_ssub16 +// AArch32: call i32 @llvm.arm.ssub16 +int16x2_t test_ssub16(int16x2_t a, int16x2_t b) { + return __ssub16(a, b); +} +// AArch32-LABEL: test_uadd16 +// AArch32: call i32 @llvm.arm.uadd16 +uint16x2_t test_uadd16(uint16x2_t a, uint16x2_t b) { + return __uadd16(a, b); +} +// AArch32-LABEL: test_uasx +// AArch32: call i32 @llvm.arm.uasx +uint16x2_t test_uasx(uint16x2_t a, uint16x2_t b) { + return __uasx(a, b); +} +// AArch32-LABEL: test_uhadd16 +// AArch32: call i32 @llvm.arm.uhadd16 +uint16x2_t test_uhadd16(uint16x2_t a, uint16x2_t b) { + return __uhadd16(a, b); +} +// AArch32-LABEL: test_uhasx +// AArch32: call i32 @llvm.arm.uhasx +uint16x2_t test_uhasx(uint16x2_t a, uint16x2_t b) { + return __uhasx(a, b); +} +// AArch32-LABEL: test_uhsax +// AArch32: call i32 @llvm.arm.uhsax +uint16x2_t test_uhsax(uint16x2_t a, uint16x2_t b) { + return __uhsax(a, b); +} +// AArch32-LABEL: test_uhsub16 +// AArch32: call i32 @llvm.arm.uhsub16 +uint16x2_t test_uhsub16(uint16x2_t a, uint16x2_t b) { + return __uhsub16(a, b); +} +// AArch32-LABEL: test_uqadd16 +// AArch32: call i32 @llvm.arm.uqadd16 +uint16x2_t test_uqadd16(uint16x2_t a, uint16x2_t b) { + return __uqadd16(a, b); +} +// AArch32-LABEL: test_uqasx +// AArch32: call i32 @llvm.arm.uqasx +uint16x2_t test_uqasx(uint16x2_t a, uint16x2_t b) { + return __uqasx(a, b); +} +// AArch32-LABEL: test_uqsax +// AArch32: call i32 @llvm.arm.uqsax +uint16x2_t test_uqsax(uint16x2_t a, uint16x2_t b) { + return __uqsax(a, b); +} +// AArch32-LABEL: test_uqsub16 +// AArch32: call i32 @llvm.arm.uqsub16 +uint16x2_t test_uqsub16(uint16x2_t a, uint16x2_t b) { + return __uqsub16(a, b); +} +// AArch32-LABEL: test_usax +// AArch32: call i32 @llvm.arm.usax +uint16x2_t test_usax(uint16x2_t a, uint16x2_t b) { + return __usax(a, b); +} +// AArch32-LABEL: test_usub16 +// AArch32: call i32 @llvm.arm.usub16 +uint16x2_t test_usub16(uint16x2_t a, uint16x2_t b) { + return __usub16(a, b); +} +#endif + +/* 9.5.10 Parallel 16-bit multiplications */ +#if __ARM_FEATURE_SIMD32 +// AArch32-LABEL: test_smlad +// AArch32: call i32 @llvm.arm.smlad +int32_t test_smlad(int16x2_t a, int16x2_t b, int32_t c) { + return __smlad(a, b, c); +} +// AArch32-LABEL: test_smladx +// AArch32: call i32 @llvm.arm.smladx +int32_t test_smladx(int16x2_t a, int16x2_t b, int32_t c) { + return __smladx(a, b, c); +} +// AArch32-LABEL: test_smlald +// AArch32: call i64 @llvm.arm.smlald +int64_t test_smlald(int16x2_t a, int16x2_t b, int64_t c) { + return __smlald(a, b, c); +} +// AArch32-LABEL: test_smlaldx +// AArch32: call i64 @llvm.arm.smlaldx +int64_t test_smlaldx(int16x2_t a, int16x2_t b, int64_t c) { + return __smlaldx(a, b, c); +} +// AArch32-LABEL: test_smlsd +// AArch32: call i32 @llvm.arm.smlsd +int32_t test_smlsd(int16x2_t a, int16x2_t b, int32_t c) { + return __smlsd(a, b, c); +} +// AArch32-LABEL: test_smlsdx +// AArch32: call i32 @llvm.arm.smlsdx +int32_t test_smlsdx(int16x2_t a, int16x2_t b, int32_t c) { + return __smlsdx(a, b, c); +} +// AArch32-LABEL: test_smlsld +// AArch32: call i64 @llvm.arm.smlsld +int64_t test_smlsld(int16x2_t a, int16x2_t b, int64_t c) { + return __smlsld(a, b, c); +} +// AArch32-LABEL: test_smlsldx +// AArch32: call i64 @llvm.arm.smlsldx +int64_t test_smlsldx(int16x2_t a, int16x2_t b, int64_t c) { + return __smlsldx(a, b, c); +} +// AArch32-LABEL: test_smuad +// AArch32: call i32 @llvm.arm.smuad +int32_t test_smuad(int16x2_t a, int16x2_t b) { + return __smuad(a, b); +} +// AArch32-LABEL: test_smuadx +// AArch32: call i32 @llvm.arm.smuadx +int32_t test_smuadx(int16x2_t a, int16x2_t b) { + return __smuadx(a, b); +} +// AArch32-LABEL: test_smusd +// AArch32: call i32 @llvm.arm.smusd +int32_t test_smusd(int16x2_t a, int16x2_t b) { + return __smusd(a, b); +} +// AArch32-LABEL: test_smusdx +// AArch32: call i32 @llvm.arm.smusdx +int32_t test_smusdx(int16x2_t a, int16x2_t b) { + return __smusdx(a, b); +} +#endif + /* 9.7 CRC32 intrinsics */ // ARM-LABEL: test_crc32b // AArch32: call i32 @llvm.arm.crc32b diff --git a/test/CodeGen/lwp-builtins.c b/test/CodeGen/lwp-builtins.c new file mode 100644 index 000000000000..c689c3974d4b --- /dev/null +++ b/test/CodeGen/lwp-builtins.c @@ -0,0 +1,39 @@ +// RUN: %clang_cc1 -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +lwp -emit-llvm -o - -Wall -Werror | FileCheck %s + +#include <x86intrin.h> + +void test_llwpcb(void *ptr) { + // CHECK-LABEL: @test_llwpcb + // CHECK: call void @llvm.x86.llwpcb(i8* %{{.*}}) + __llwpcb(ptr); +} + +void* test_slwpcb() { + // CHECK-LABEL: @test_slwpcb + // CHECK: call i8* @llvm.x86.slwpcb() + return __slwpcb(); +} + +unsigned char test_lwpins32(unsigned val2, unsigned val1) { + // CHECK-LABEL: @test_lwpins32 + // CHECK: call i8 @llvm.x86.lwpins32(i32 + return __lwpins32(val2, val1, 0x01234); +} + +unsigned char test_lwpins64(unsigned long long val2, unsigned val1) { + // CHECK-LABEL: @test_lwpins64 + // CHECK: call i8 @llvm.x86.lwpins64(i64 + return __lwpins64(val2, val1, 0x56789); +} + +void test_lwpval32(unsigned val2, unsigned val1) { + // CHECK-LABEL: @test_lwpval32 + // CHECK: call void @llvm.x86.lwpval32(i32 + __lwpval32(val2, val1, 0x01234); +} + +void test_lwpval64(unsigned long long val2, unsigned val1) { + // CHECK-LABEL: @test_lwpval64 + // CHECK: call void @llvm.x86.lwpval64(i64 + __lwpval64(val2, val1, 0xABCDEF); +} diff --git a/test/CodeGen/mozilla-ms-inline-asm.c b/test/CodeGen/mozilla-ms-inline-asm.c index 3335a87fefe5..26e8ebce1e28 100644 --- a/test/CodeGen/mozilla-ms-inline-asm.c +++ b/test/CodeGen/mozilla-ms-inline-asm.c @@ -18,25 +18,25 @@ void invoke(void* that, unsigned methodIndex, // CHECK: store i32 %2, i32* %7, align 4 // CHECK: store i8* %3, i8** %8, align 4 // CHECK: call void asm sideeffect inteldialect -// CHECK: mov edx,dword ptr $1 -// CHECK: test edx,edx -// CHECK: jz {{[^_]*}}__MSASMLABEL_.${:uid}__noparams -// ^ Can't use {{.*}} here because the matching is greedy. -// CHECK: mov eax,edx -// CHECK: shl eax,$$3 -// CHECK: sub esp,eax -// CHECK: mov ecx,esp -// CHECK: push dword ptr $0 -// CHECK: call dword ptr $2 -// CHECK: {{.*}}__MSASMLABEL_.${:uid}__noparams: -// CHECK: mov ecx,dword ptr $3 -// CHECK: push ecx -// CHECK: mov edx,[ecx] -// CHECK: mov eax,dword ptr $4 -// CHECK: call dword ptr[edx+eax*$$4] -// CHECK: mov esp,ebp -// CHECK: pop ebp -// CHECK: ret +// CHECK-SAME: mov edx,$1 +// CHECK-SAME: test edx,edx +// CHECK-SAME: jz {{[^_]*}}__MSASMLABEL_.${:uid}__noparams +// ^ Can't use {{.*}} here because the matching is greedy. +// CHECK-SAME: mov eax,edx +// CHECK-SAME: shl eax,$$3 +// CHECK-SAME: sub esp,eax +// CHECK-SAME: mov ecx,esp +// CHECK-SAME: push $0 +// CHECK-SAME: call dword ptr $2 +// CHECK-SAME: {{.*}}__MSASMLABEL_.${:uid}__noparams: +// CHECK-SAME: mov ecx,$3 +// CHECK-SAME: push ecx +// CHECK-SAME: mov edx,[ecx] +// CHECK-SAME: mov eax,$4 +// CHECK-SAME: call dword ptr[edx+eax*$$4] +// CHECK-SAME: mov esp,ebp +// CHECK-SAME: pop ebp +// CHECK-SAME: ret // CHECK: "=*m,*m,*m,*m,*m,~{eax},~{ebp},~{ecx},~{edx},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}" // CHECK: (i8** %8, i32* %7, void (...)* bitcast (void ()* @invoke_copy_to_stack to void (...)*), i8** %5, i32* %6) // CHECK: ret void diff --git a/test/CodeGen/ms-inline-asm-64.c b/test/CodeGen/ms-inline-asm-64.c index d6f6e2ee0e0e..69828feb3623 100644 --- a/test/CodeGen/ms-inline-asm-64.c +++ b/test/CodeGen/ms-inline-asm-64.c @@ -5,14 +5,18 @@ void t1() { int var = 10; __asm mov rax, offset var ; rax = address of myvar // CHECK: t1 -// CHECK: call void asm sideeffect inteldialect "mov rax, $0", "r,~{rax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov rax, $0 +// CHECK-SAME: "r,~{rax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) } void t2() { int var = 10; __asm mov [eax], offset var // CHECK: t2 -// CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov [eax], $0 +// CHECK-SAME: "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) } struct t3_type { int a, b; }; @@ -28,7 +32,11 @@ int t3() { } return foo.b; // CHECK: t3 -// CHECK: call void asm sideeffect inteldialect "lea ebx, qword ptr $0\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(%struct.t3_type* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: lea ebx, $0 +// CHECK-SAME: mov eax, [ebx].0 +// CHECK-SAME: mov [ebx].4, ecx +// CHECK-SAME: "*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(%struct.t3_type* %{{.*}}) } int t4() { @@ -44,5 +52,9 @@ int t4() { } return foo.b; // CHECK: t4 -// CHECK: call void asm sideeffect inteldialect "lea ebx, qword ptr $0\0A\09mov eax, [ebx].0\0A\09mov [ebx].4, ecx", "*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(%struct.t3_type* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: lea ebx, $0 +// CHECK-SAME: mov eax, [ebx].0 +// CHECK-SAME: mov [ebx].4, ecx +// CHECK-SAME: "*m,~{eax},~{ebx},~{dirflag},~{fpsr},~{flags}"(%struct.t3_type* %{{.*}}) } diff --git a/test/CodeGen/ms-inline-asm-avx512.c b/test/CodeGen/ms-inline-asm-avx512.c index c1b783a2107c..6189e50d2116 100644 --- a/test/CodeGen/ms-inline-asm-avx512.c +++ b/test/CodeGen/ms-inline-asm-avx512.c @@ -1,5 +1,5 @@ // REQUIRES: x86-registered-target -// RUN: %clang_cc1 %s -triple x86_64-pc-windows-msvc -target-cpu knl -fasm-blocks -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -triple x86_64-pc-windows-msvc -target-cpu skylake-avx512 -fasm-blocks -emit-llvm -o - | FileCheck %s void t1() { // CHECK: @t1 @@ -19,3 +19,16 @@ void t2() { vaddpd zmm8 {k1}, zmm27, zmm6 } } + +void ignore_fe_size() { + // CHECK-LABEL: define void @ignore_fe_size() + char c; + // CHECK: vaddps xmm1, xmm2, $1{1to4} + __asm vaddps xmm1, xmm2, [c]{1to4} + // CHECK: vaddps xmm1, xmm2, $2 + __asm vaddps xmm1, xmm2, [c] + // CHECK: mov eax, $3 + __asm mov eax, [c] + // CHECK: mov $0, rax + __asm mov [c], rax +} diff --git a/test/CodeGen/ms-inline-asm.c b/test/CodeGen/ms-inline-asm.c index c4fe08a3e13b..5182d7f2e81a 100644 --- a/test/CodeGen/ms-inline-asm.c +++ b/test/CodeGen/ms-inline-asm.c @@ -92,7 +92,11 @@ void t9() { __asm { pop ebx } } // CHECK: t9 -// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx\0A\09", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: push ebx +// CHECK-SAME: mov ebx, $$0x07 +// CHECK-SAME: pop ebx +// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() } unsigned t10(void) { @@ -107,7 +111,10 @@ unsigned t10(void) { // CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4 // CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4 // CHECK: store i32 1, i32* [[I]], align 4 -// CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax", "=*m,={eax},*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) +// CHECK: call i32 asm sideeffect inteldialect +// CHECK-SAME: mov eax, $2 +// CHECK-SAME: mov $0, eax +// CHECK-SAME: "=*m,={eax},*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}) // CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32, i32* [[J]], align 4 // CHECK: ret i32 [[RET]] } @@ -128,7 +135,12 @@ unsigned t12(void) { } return j + m; // CHECK: t12 -// CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $3\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $4\0A\09mov dword ptr $1, eax", "=*m,=*m,={eax},*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) +// CHECK: call i32 asm sideeffect inteldialect +// CHECK-SAME: mov eax, $3 +// CHECK-SAME: mov $0, eax +// CHECK-SAME: mov eax, $4 +// CHECK-SAME: mov $1, eax +// CHECK-SAME: "=*m,=*m,={eax},*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}) } void t13() { @@ -136,8 +148,23 @@ void t13() { short j = 2; __asm movzx eax, i __asm movzx eax, j -// CHECK: t13 -// CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0\0A\09movzx eax, word ptr $1", "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}i, i16* %{{.*}}j) +// CHECK-LABEL: define void @t13() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: movzx eax, byte ptr $0 +// CHECK-SAME: movzx eax, word ptr $1 +// CHECK-SAME: "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}i, i16* %{{.*}}j) +} + +void t13_brac() { + char i = 1; + short j = 2; + __asm movzx eax, [i] + __asm movzx eax, [j] +// CHECK-LABEL: define void @t13_brac() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: movzx eax, byte ptr $0 +// CHECK-SAME: movzx eax, word ptr $1 +// CHECK-SAME: "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}i, i16* %{{.*}}j) } void t14() { @@ -150,7 +177,7 @@ void t14() { .endif } // CHECK: t14 -// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) } int gvar = 10; @@ -158,7 +185,7 @@ void t15() { // CHECK: t15 int lvar = 10; __asm mov eax, lvar ; eax = 10 -// CHECK: mov eax, dword ptr $0 +// CHECK: mov eax, $0 __asm mov eax, offset lvar ; eax = address of lvar // CHECK: mov eax, $1 __asm mov eax, offset gvar ; eax = address of gvar @@ -236,7 +263,11 @@ void t21() { __asm pop ebx } // CHECK: t21 -// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$07H\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: push ebx +// CHECK-SAME: mov ebx, $$07H +// CHECK-SAME: pop ebx +// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() } extern void t22_helper(int x); @@ -252,9 +283,15 @@ void t22() { __asm pop ebx } // CHECK: t22 -// CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: push ebx +// CHECK-SAME: mov ebx, esp +// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() // CHECK: call void @t22_helper -// CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov esp, ebx +// CHECK-SAME: pop ebx +// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"() } void t23() { @@ -342,9 +379,9 @@ int *t30() { int *res; __asm lea edi, results -// CHECK: lea edi, dword ptr $2 +// CHECK: lea edi, $2 __asm mov res, edi -// CHECK: mov dword ptr $0, edi +// CHECK: mov $0, edi return res; // CHECK: "=*m,={eax},*m,~{edi},~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}, [2 x i32]* @{{.*}}) } @@ -362,7 +399,7 @@ void t32() { // CHECK: t32 int i; __asm mov eax, i -// CHECK: mov eax, dword ptr $0 +// CHECK: mov eax, $0 __asm mov eax, dword ptr i // CHECK: mov eax, dword ptr $1 __asm mov ax, word ptr i @@ -376,7 +413,7 @@ void t33() { // CHECK: t33 int i; __asm mov eax, [i] -// CHECK: mov eax, dword ptr $0 +// CHECK: mov eax, $0 __asm mov eax, dword ptr [i] // CHECK: mov eax, dword ptr $1 __asm mov ax, word ptr [i] @@ -409,31 +446,31 @@ void t36() { int arr[4]; // Work around PR20368: These should be single line blocks __asm { mov eax, 4[arr] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4[arr + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 8[arr + 4 + 32*2 - 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 12[4 + arr] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4[4 + arr + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4[64 + arr + (2*32)] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4[64 + arr - 2*32] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, [arr + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, [arr + 4 + 32*2 - 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, [4 + arr] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, [4 + arr + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, [64 + arr + (2*32)] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, [64 + arr - 2*32] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) } void t37() { @@ -464,21 +501,21 @@ void t38() { int arr[4]; // Work around PR20368: These should be single line blocks __asm { mov eax, 4+4[arr] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, (4+4)[arr + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 8*2[arr + 4 + 32*2 - 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 12+20[4 + arr] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4*16+4[4 + arr + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4*4[64 + arr + (2*32)] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 4*(4-2)[64 + arr - 2*32] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) __asm { mov eax, 32*(4-2)[arr - 2*32] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}}) } void cpuid() { @@ -554,7 +591,7 @@ void t42() { // CHECK-LABEL: define void @t42 int flags; __asm mov flags, eax -// CHECK: mov dword ptr $0, eax +// CHECK: mov $0, eax // CHECK: "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %flags) } @@ -563,31 +600,31 @@ void t43() { C strct; // Work around PR20368: These should be single line blocks __asm { mov eax, 4[strct.c1] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, 4[strct.c3 + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, 8[strct.c2.a + 4 + 32*2 - 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, 12[4 + strct.c2.b] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, 4[4 + strct.c4.b2.b + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, 4[64 + strct.c1 + (2*32)] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, 4[64 + strct.c2.a - 2*32] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, [strct.c4.b1 + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, [strct.c4.b2.a + 4 + 32*2 - 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, [4 + strct.c1] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, [4 + strct.c2.b + 4] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, [64 + strct.c3 + (2*32)] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) __asm { mov eax, [64 + strct.c4.b2.b - 2*32] } -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) +// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}) } void call_clobber() { @@ -662,7 +699,7 @@ void mxcsr() { __asm fxrstor buf } // CHECK-LABEL: define void @mxcsr -// CHECK: call void asm sideeffect inteldialect "fxrstor byte ptr $0", "=*m,~{dirflag},~{fpsr},~{flags}" +// CHECK: call void asm sideeffect inteldialect "fxrstor $0", "=*m,~{dirflag},~{fpsr},~{flags}" typedef union _LARGE_INTEGER { struct { @@ -680,7 +717,7 @@ int test_indirect_field(LARGE_INTEGER LargeInteger) { __asm mov eax, LargeInteger.LowPart } // CHECK-LABEL: define i32 @test_indirect_field( -// CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $1", +// CHECK: call i32 asm sideeffect inteldialect "mov eax, $1", // MS ASM containing labels must not be duplicated (PR23715). // CHECK: attributes [[ATTR1]] = { diff --git a/test/CodeGen/ms-inline-asm.cpp b/test/CodeGen/ms-inline-asm.cpp index 424c1992cc2c..a435e4b826d8 100644 --- a/test/CodeGen/ms-inline-asm.cpp +++ b/test/CodeGen/ms-inline-asm.cpp @@ -14,15 +14,21 @@ struct Foo { }; void t1() { +// CHECK-LABEL: define void @_Z2t1v() Foo::ptr = (int *)0xDEADBEEF; Foo::Bar::ptr = (int *)0xDEADBEEF; +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov eax, $0 +// CHECK-SAME: mov eax, $1 +// CHECK-SAME: mov eax, $2 +// CHECK-SAME: mov eax, dword ptr $3 +// CHECK-SAME: mov eax, dword ptr $4 +// CHECK-SAME: "*m,*m,*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE) __asm mov eax, Foo ::ptr __asm mov eax, Foo :: Bar :: ptr __asm mov eax, [Foo:: ptr] __asm mov eax, dword ptr [Foo :: ptr] __asm mov eax, dword ptr [Foo :: ptr] -// CHECK: @_Z2t1v -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0\0A\09mov eax, dword ptr $1\0A\09mov eax, dword ptr $2\0A\09mov eax, dword ptr $3\0A\09mov eax, dword ptr $4", "*m,*m,*m,*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3ptrE) } int gvar = 10; @@ -30,8 +36,11 @@ void t2() { int lvar = 10; __asm mov eax, offset Foo::ptr __asm mov eax, offset Foo::Bar::ptr -// CHECK: t2 -// CHECK: call void asm sideeffect inteldialect "mov eax, $0\0A\09mov eax, $1", "r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE) +// CHECK-LABEL: define void @_Z2t2v() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov eax, $0 +// CHECK-SAME: mov eax, $1 +// CHECK-SAME: "r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32** @_ZN3Foo3ptrE, i32** @_ZN3Foo3Bar3ptrE) } // CHECK-LABEL: define void @_Z2t3v() @@ -50,7 +59,20 @@ void t3() { __asm mov eax, SIZE Foo::Bar::ptr __asm mov eax, SIZE Foo::arr __asm mov eax, SIZE Foo::Bar::arr -// CHECK: call void asm sideeffect inteldialect "mov eax, $$1\0A\09mov eax, $$1\0A\09mov eax, $$4\0A\09mov eax, $$2\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$1\0A\09mov eax, $$4\0A\09mov eax, $$4\0A\09mov eax, $$16\0A\09mov eax, $$2", "~{eax},~{dirflag},~{fpsr},~{flags}"() +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov eax, $$1 +// CHECK-SAME: mov eax, $$1 +// CHECK-SAME: mov eax, $$4 +// CHECK-SAME: mov eax, $$2 +// CHECK-SAME: mov eax, $$4 +// CHECK-SAME: mov eax, $$4 +// CHECK-SAME: mov eax, $$4 +// CHECK-SAME: mov eax, $$1 +// CHECK-SAME: mov eax, $$4 +// CHECK-SAME: mov eax, $$4 +// CHECK-SAME: mov eax, $$16 +// CHECK-SAME: mov eax, $$2 +// CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"() } @@ -67,7 +89,10 @@ void T4::test() { // CHECK: [[X:%.*]] = getelementptr inbounds [[T4]], [[T4]]* [[THIS]], i32 0, i32 0 __asm mov eax, x; __asm mov y, eax; -// CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $1\0A\09mov dword ptr $0, eax", "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @_ZN2T41yE, i32* {{.*}}) +// CHECK: call void asm sideeffect inteldialect +// CHECK-SAME: mov eax, $1 +// CHECK-SAME: mov $0, eax +// CHECK-SAME: "=*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* @_ZN2T41yE, i32* {{.*}}) } template <class T> struct T5 { @@ -82,7 +107,11 @@ void test5() { __asm push y __asm call T5<int>::create<float> __asm mov x, eax - // CHECK: call void asm sideeffect inteldialect "push dword ptr $0\0A\09call dword ptr $2\0A\09mov dword ptr $1, eax", "=*m,=*m,*m,~{esp},~{dirflag},~{fpsr},~{flags}"(i32* %y, i32* %x, i32 (float)* @_ZN2T5IiE6createIfEEiT_) + // CHECK: call void asm sideeffect inteldialect + // CHECK-SAME: push $0 + // CHECK-SAME: call dword ptr $2 + // CHECK-SAME: mov $1, eax + // CHECK-SAME: "=*m,=*m,*m,~{esp},~{dirflag},~{fpsr},~{flags}"(i32* %y, i32* %x, i32 (float)* @_ZN2T5IiE6createIfEEiT_) } // Just verify this doesn't emit an error. @@ -100,7 +129,9 @@ void t7_struct() { }; __asm mov eax, [eax].A.b // CHECK-LABEL: define void @_Z9t7_structv - // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() + // CHECK: call void asm sideeffect inteldialect + // CHECK-SAME: mov eax, [eax].4 + // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"() } void t7_typedef() { @@ -110,7 +141,9 @@ void t7_typedef() { } A; __asm mov eax, [eax].A.b // CHECK-LABEL: define void @_Z10t7_typedefv - // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() + // CHECK: call void asm sideeffect inteldialect + // CHECK-SAME: mov eax, [eax].4 + // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"() } void t7_using() { @@ -120,20 +153,28 @@ void t7_using() { }; __asm mov eax, [eax].A.b // CHECK-LABEL: define void @_Z8t7_usingv - // CHECK: call void asm sideeffect inteldialect "mov eax, [eax].4", "~{eax},~{dirflag},~{fpsr},~{flags}"() + // CHECK: call void asm sideeffect inteldialect + // CHECK-SAME: mov eax, [eax].4 + // CHECK-SAME: "~{eax},~{dirflag},~{fpsr},~{flags}"() } void t8() { __asm some_label: // CHECK-LABEL: define void @_Z2t8v() - // CHECK: call void asm sideeffect inteldialect "L__MSASMLABEL_.${:uid}__some_label:", "~{dirflag},~{fpsr},~{flags}"() + // CHECK: call void asm sideeffect inteldialect + // CHECK-SAME: L__MSASMLABEL_.${:uid}__some_label: + // CHECK-SAME: "~{dirflag},~{fpsr},~{flags}"() struct A { static void g() { __asm jmp some_label ; This should jump forwards __asm some_label: __asm nop // CHECK-LABEL: define internal void @_ZZ2t8vEN1A1gEv() - // CHECK: call void asm sideeffect inteldialect "jmp L__MSASMLABEL_.${:uid}__some_label\0A\09L__MSASMLABEL_.${:uid}__some_label:\0A\09nop", "~{dirflag},~{fpsr},~{flags}"() + // CHECK: call void asm sideeffect inteldialect + // CHECK-SAME: jmp L__MSASMLABEL_.${:uid}__some_label + // CHECK-SAME: L__MSASMLABEL_.${:uid}__some_label: + // CHECK-SAME: nop + // CHECK-SAME: "~{dirflag},~{fpsr},~{flags}"() } }; A::g(); diff --git a/test/CodeGen/thinlto_backend.ll b/test/CodeGen/thinlto_backend.ll index ac0b3b76ef7d..813bb62c1a29 100644 --- a/test/CodeGen/thinlto_backend.ll +++ b/test/CodeGen/thinlto_backend.ll @@ -35,8 +35,12 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" declare void @f2() +declare i8* @f3() define void @f1() { call void @f2() + ; Make sure that the backend can handle undefined references. + ; Do an indirect call so that the undefined ref shows up in the combined index. + call void bitcast (i8*()* @f3 to void()*)() ret void } diff --git a/test/CodeGenCXX/ms-inline-asm-fields.cpp b/test/CodeGenCXX/ms-inline-asm-fields.cpp index 6f329330bda4..5ee6acf57466 100644 --- a/test/CodeGenCXX/ms-inline-asm-fields.cpp +++ b/test/CodeGenCXX/ms-inline-asm-fields.cpp @@ -17,14 +17,14 @@ A a_global; extern "C" int test_param_field(A p) { // CHECK: define i32 @test_param_field(%struct.A* byval align 4 %p) // CHECK: getelementptr inbounds %struct.A, %struct.A* %p, i32 0, i32 0 -// CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $1" +// CHECK: call i32 asm sideeffect inteldialect "mov eax, $1" // CHECK: ret i32 __asm mov eax, p.a1 } extern "C" int test_namespace_global() { // CHECK: define i32 @test_namespace_global() -// CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $1", "{{.*}}"(i32* getelementptr inbounds (%struct.A, %struct.A* @_ZN4asdf8a_globalE, i32 0, i32 2, i32 1)) +// CHECK: call i32 asm sideeffect inteldialect "mov eax, $1", "{{.*}}"(i32* getelementptr inbounds (%struct.A, %struct.A* @_ZN4asdf8a_globalE, i32 0, i32 2, i32 1)) // CHECK: ret i32 __asm mov eax, asdf::a_global.a3.b2 } diff --git a/test/CodeGenObjC/arc-foreach.m b/test/CodeGenObjC/arc-foreach.m index e34445704e37..e3b3f1aa5ce4 100644 --- a/test/CodeGenObjC/arc-foreach.m +++ b/test/CodeGenObjC/arc-foreach.m @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -triple x86_64-apple-darwin -emit-llvm %s -o %t-64.s -// RUN: FileCheck -check-prefix CHECK-LP64 --input-file=%t-64.s %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin -fblocks -fobjc-arc -fobjc-runtime-has-weak -emit-llvm %s -o - | FileCheck -check-prefix CHECK-LP64 %s +// RUN: %clang_cc1 -triple x86_64-apple-darwin -O1 -fblocks -fobjc-arc -fobjc-runtime-has-weak -emit-llvm %s -o - | FileCheck -check-prefix CHECK-LP64-OPT %s // rdar://9503326 // rdar://9606600 @@ -29,6 +29,11 @@ void test0(NSArray *array) { // CHECK-LP64-NEXT: [[BUFFER:%.*]] = alloca [16 x i8*], align 8 // CHECK-LP64-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]], +// CHECK-LP64-OPT-LABEL: define void @test0 +// CHECK-LP64-OPT: [[STATE:%.*]] = alloca [[STATE_T:%.*]], align 8 +// CHECK-LP64-OPT-NEXT: [[BUFFER:%.*]] = alloca [16 x i8*], align 8 +// CHECK-LP64-OPT-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]], align 8 + // Initialize 'array'. // CHECK-LP64-NEXT: store [[ARRAY_T]]* null, [[ARRAY_T]]** [[ARRAY]] // CHECK-LP64-NEXT: [[ZERO:%.*]] = bitcast [[ARRAY_T]]** [[ARRAY]] to i8** @@ -66,8 +71,12 @@ void test0(NSArray *array) { // CHECK-LP64-NEXT: store i8* [[T1]], i8** [[T0]] // CHECK-LP64-NEXT: [[BLOCK1:%.*]] = bitcast [[BLOCK_T]]* [[BLOCK]] // CHECK-LP64-NEXT: call void @use_block(void ()* [[BLOCK1]]) -// CHECK-LP64-NEXT: [[CAPTURE:%.*]] = load i8*, i8** [[D0]] -// CHECK-LP64: call void (...) @clang.arc.use(i8* [[CAPTURE]]) +// CHECK-LP64-NEXT: call void @objc_storeStrong(i8** [[D0]], i8* null) +// CHECK-LP64-NOT: call void (...) @clang.arc.use(i8* [[CAPTURE]]) + +// CHECK-LP64-OPT: [[D0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i64 0, i32 5 +// CHECK-LP64-OPT: [[CAPTURE:%.*]] = load i8*, i8** [[D0]] +// CHECK-LP64-OPT: call void (...) @clang.arc.use(i8* [[CAPTURE]]) // CHECK-LP64: [[T0:%.*]] = load i8*, i8** @OBJC_SELECTOR_REFERENCES_ // CHECK-LP64-NEXT: [[T1:%.*]] = bitcast [[ARRAY_T]]* [[SAVED_ARRAY]] to i8* @@ -200,15 +209,24 @@ NSArray *array4; // CHECK-LP64: [[T0:%.*]] = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>* [[BLOCK]], i32 0, i32 5 // CHECK-LP64: [[BC:%.*]] = getelementptr inbounds <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>, <{ i8*, i32, i32, i8*, %struct.__block_descriptor*, [[TY]]* }>* [[BLOCK]], i32 0, i32 5 // CHECK-LP64: [[T1:%.*]] = load [[TY]]*, [[TY]]** [[SELF_ADDR]] -// CHECK-LP64: store [[TY]]* [[T1]], [[TY]]** [[BC]] +// CHECK-LP64: store [[TY]]* [[T1]], [[TY]]** [[BC]], align 8 -// CHECK-LP64: [[T5:%.*]] = load [[TY]]*, [[TY]]** [[T0]] -// CHECK-LP64: call void (...) @clang.arc.use([[TY]]* [[T5]]) +// CHECK-LP64-OPT-LABEL: define internal void @"\01-[I1 foo2]"( +// CHECK-LP64-OPT: [[TY:%.*]]* %self +// CHECK-LP64-OPT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]], +// CHECK-LP64-OPT: [[T0:%.*]] = getelementptr inbounds [[BLOCK_T]], [[BLOCK_T]]* [[BLOCK]], i64 0, i32 5 + +// CHECK-LP64: [[T5:%.*]] = bitcast [[TY]]** [[T0]] to i8** +// CHECK-LP64: call void @objc_storeStrong(i8** [[T5]], i8* null) +// CHECK-LP64-NOT: call void (...) @clang.arc.use([[TY]]* [[T5]]) // CHECK-LP64: switch i32 {{%.*}}, label %[[UNREACHABLE:.*]] [ // CHECK-LP64-NEXT: i32 0, label %[[CLEANUP_CONT:.*]] // CHECK-LP64-NEXT: i32 2, label %[[FORCOLL_END:.*]] // CHECK-LP64-NEXT: ] +// CHECK-LP64-OPT: [[T5:%.*]] = load [[TY]]*, [[TY]]** [[T0]] +// CHECK-LP64-OPT: call void (...) @clang.arc.use([[TY]]* [[T5]]) + // CHECK-LP64: {{^|:}}[[CLEANUP_CONT]] // CHECK-LP64-NEXT: br label %[[FORCOLL_END]] diff --git a/test/CodeGenOpenCL/kernel-attributes.cl b/test/CodeGenOpenCL/kernel-attributes.cl index 4a116dd08551..e61a75f7b537 100644 --- a/test/CodeGenOpenCL/kernel-attributes.cl +++ b/test/CodeGenOpenCL/kernel-attributes.cl @@ -8,7 +8,11 @@ kernel __attribute__((vec_type_hint(int))) __attribute__((reqd_work_group_size( kernel __attribute__((vec_type_hint(uint4))) __attribute__((work_group_size_hint(8,16,32))) void kernel2(int a) {} // CHECK: define void @kernel2(i32 {{[^%]*}}%a) {{[^{]+}} !vec_type_hint ![[MD3:[0-9]+]] !work_group_size_hint ![[MD4:[0-9]+]] +kernel __attribute__((intel_reqd_sub_group_size(8))) void kernel3(int a) {} +// CHECK: define void @kernel3(i32 {{[^%]*}}%a) {{[^{]+}} !intel_reqd_sub_group_size ![[MD5:[0-9]+]] + // CHECK: [[MD1]] = !{i32 undef, i32 1} // CHECK: [[MD2]] = !{i32 1, i32 2, i32 4} // CHECK: [[MD3]] = !{<4 x i32> undef, i32 0} // CHECK: [[MD4]] = !{i32 8, i32 16, i32 32} +// CHECK: [[MD5]] = !{i32 8} diff --git a/test/Driver/android-ndk-standalone.cpp b/test/Driver/android-ndk-standalone.cpp index 7fe6d3c3c2ca..86ab85269f76 100644 --- a/test/Driver/android-ndk-standalone.cpp +++ b/test/Driver/android-ndk-standalone.cpp @@ -172,6 +172,20 @@ // CHECK-ARMV7THUMB-NOT: "-L{{.*}}/lib/gcc/arm-linux-androideabi/4.9/../{{[^ ]*}}/lib/armv7-a" // CHECK-ARMV7THUMB-NOT: "-L{{.*}}/lib/gcc/arm-linux-androideabi/4.9/../{{[^ ]*}}/lib" // CHECK-ARMV7THUMB: "-L{{.*}}/sysroot/usr/lib" + +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target arm-linux-androideabi -stdlib=libstdc++ \ +// RUN: -march=armv7-a -mthumb \ +// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ +// RUN: -print-multi-lib \ +// RUN: | FileCheck --check-prefix=CHECK-ARM-MULTILIBS %s + +// CHECK-ARM-MULTILIBS: thumb;@mthumb +// CHECK-ARM-MULTILIBS-NEXT: armv7-a;@march=armv7-a +// CHECK-ARM-MULTILIBS-NEXT: armv7-a/thumb;@march=armv7-a@mthumb +// CHECK-ARM-MULTILIBS-NEXT: .; + // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target armv7a-none-linux-androideabi -stdlib=libstdc++ \ diff --git a/test/Driver/darwin-version.c b/test/Driver/darwin-version.c index 009f8483a000..8f08bb9dec4a 100644 --- a/test/Driver/darwin-version.c +++ b/test/Driver/darwin-version.c @@ -29,9 +29,13 @@ // RUN: FileCheck --check-prefix=CHECK-VERSION-OSX10 %s // RUN: %clang -target x86_64-apple-macosx -mmacosx-version-min=10.10 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-OSX10 %s +// RUN: %clang -target x86_64-apple-macosx -mmacos-version-min=10.10 -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-OSX10 %s // CHECK-VERSION-OSX10: "x86_64-apple-macosx10.10.0" // RUN: %clang -target x86_64-apple-macosx -mmacosx-version-min= -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-MISSING %s +// RUN: %clang -target x86_64-apple-macosx -mmacos-version-min= -c %s -### 2>&1 | \ +// RUN: FileCheck --check-prefix=CHECK-VERSION-MISSING %s // CHECK-VERSION-MISSING: invalid version number // RUN: %clang -target armv7k-apple-darwin -mwatchos-version-min=2.0 -c %s -### 2>&1 | \ // RUN: FileCheck --check-prefix=CHECK-VERSION-WATCHOS20 %s diff --git a/test/Driver/fsanitize-coverage.c b/test/Driver/fsanitize-coverage.c index 22c26be99b69..cf0941477bba 100644 --- a/test/Driver/fsanitize-coverage.c +++ b/test/Driver/fsanitize-coverage.c @@ -80,6 +80,10 @@ // CHECK-EXTEND-LEGACY: -fsanitize-coverage-type=1 // CHECK-EXTEND-LEGACY: -fsanitize-coverage-trace-cmp +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=no-prune,trace-pc %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_NOPRUNE +// RUN: %clang -target x86_64-linux-gnu -fsanitize-coverage=no-prune,func,trace-pc-guard %s -### 2>&1 | FileCheck %s --check-prefix=CHECK_NOPRUNE +// CHECK_NOPRUNE: -fsanitize-coverage-no-prune + // RUN: %clang_cl --target=i386-pc-win32 -fsanitize=address -fsanitize-coverage=func,trace-pc-guard -c -### -- %s 2>&1 | FileCheck %s -check-prefix=CLANG-CL-COVERAGE // CLANG-CL-COVERAGE-NOT: error: // CLANG-CL-COVERAGE-NOT: warning: diff --git a/test/Driver/windows-cross.c b/test/Driver/windows-cross.c index de6fcba7a504..90fefbadfea1 100644 --- a/test/Driver/windows-cross.c +++ b/test/Driver/windows-cross.c @@ -1,12 +1,17 @@ -// RUN: %clang -### -target armv7-windows-itanium --sysroot %S/Inputs/Windows/ARM/8.1 -B %S/Inputs/Windows/ARM/8.1/usr/bin -fuse-ld=ld -stdlib=libstdc++ -rtlib=platform -o /dev/null %s 2>&1 \ -// RUN: | FileCheck %s --check-prefix CHECK-BASIC +// RUN: %clang -### --driver-mode=g++ -target armv7-windows-itanium --sysroot %S/Inputs/Windows/ARM/8.1 -B %S/Inputs/Windows/ARM/8.1/usr/bin -fuse-ld=ld -stdlib=libstdc++ -rtlib=platform -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix CHECK-BASIC-LIBSTDCXX -// CHECK-BASIC: armv7-windows-itanium-ld" "--sysroot={{.*}}/Inputs/Windows/ARM/8.1" "-m" "thumb2pe" "-Bdynamic" "--entry" "mainCRTStartup" "--allow-multiple-definition" "-o" "{{[^"]*}}" "-L{{.*}}/Inputs/Windows/ARM/8.1/usr/lib" "-L{{.*}}/Inputs/Windows/ARM/8.1/usr/lib/gcc" "{{.*}}.o" "-lmsvcrt" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// CHECK-BASIC-LIBSTDCXX: armv7-windows-itanium-ld" "--sysroot={{.*}}/Inputs/Windows/ARM/8.1" "-m" "thumb2pe" "-Bdynamic" "--entry" "mainCRTStartup" "--allow-multiple-definition" "-o" "{{[^"]*}}" "-L{{.*}}/Inputs/Windows/ARM/8.1/usr/lib" "-L{{.*}}/Inputs/Windows/ARM/8.1/usr/lib/gcc" "{{.*}}.o" "-lstdc++" "-lmingw32" "-lmingwex" "-lgcc" "-lmoldname" "-lmingw32" "-lmsvcrt" "-lgcc_s" "-lgcc" + +// RUN: %clang -### -target armv7-windows-itanium --sysroot %S/Inputs/Windows/ARM/8.1 -B %S/Inputs/Windows/ARM/8.1/usr/bin -fuse-ld=ld -stdlib=libstdc++ -rtlib=compiler-rt -o /dev/null %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix CHECK-BASIC-LIBCXX + +// CHECK-BASIC-LIBCXX: armv7-windows-itanium-ld" "--sysroot={{.*}}/Inputs/Windows/ARM/8.1" "-m" "thumb2pe" "-Bdynamic" "--entry" "mainCRTStartup" "--allow-multiple-definition" "-o" "{{[^"]*}}" "{{[^"]*}}.o" "-lmsvcrt" // RUN: %clang -### -target armv7-windows-itanium --sysroot %s/Inputs/Windows/ARM/8.1 -B %S/Inputs/Windows/ARM/8.1/usr/bin -fuse-ld=ld -rtlib=compiler-rt -stdlib=libstdc++ -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix CHECK-RTLIB -// CHECK-RTLIB: armv7-windows-itanium-ld" "--sysroot={{.*}}/Inputs/Windows/ARM/8.1" "-m" "thumb2pe" "-Bdynamic" "--entry" "mainCRTStartup" "--allow-multiple-definition" "-o" "{{[^"]*}}" "-L{{.*}}/Inputs/Windows/ARM/8.1/usr/lib" "-L{{.*}}/Inputs/Windows/ARM/8.1/usr/lib/gcc" "{{.*}}.o" "-lmsvcrt" "{{.*[\\/]}}clang_rt.builtins-arm.lib" +// CHECK-RTLIB: armv7-windows-itanium-ld" "--sysroot={{.*}}/Inputs/Windows/ARM/8.1" "-m" "thumb2pe" "-Bdynamic" "--entry" "mainCRTStartup" "--allow-multiple-definition" "-o" "{{[^"]*}}" "{{.*}}.o" "-lmsvcrt" "{{.*[\\/]}}clang_rt.builtins-arm.lib" // RUN: %clang -### -target armv7-windows-itanium --sysroot %S/Inputs/Windows/ARM/8.1 -B %S/Inputs/Windows/ARM/8.1/usr/bin -fuse-ld=ld -rtlib=compiler-rt -stdlib=libc++ -o /dev/null %s 2>&1 \ // RUN: | FileCheck %s --check-prefix CHECK-C-LIBCXX diff --git a/test/FixIt/fixit-availability.c b/test/FixIt/fixit-availability.c new file mode 100644 index 000000000000..fa641b4b98c6 --- /dev/null +++ b/test/FixIt/fixit-availability.c @@ -0,0 +1,10 @@ +// RUN: %clang_cc1 -fsyntax-only -Wunguarded-availability -fdiagnostics-parseable-fixits -triple x86_64-apple-darwin9 %s 2>&1 | FileCheck %s + +__attribute__((availability(macos, introduced=10.12))) +int function(void); + +void use() { + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (__builtin_available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:14-[[@LINE-2]]:14}:"\n } else {\n // Fallback on earlier versions\n }" +} diff --git a/test/FixIt/fixit-availability.mm b/test/FixIt/fixit-availability.mm new file mode 100644 index 000000000000..6bf8f49ddc0d --- /dev/null +++ b/test/FixIt/fixit-availability.mm @@ -0,0 +1,111 @@ +// RUN: %clang_cc1 -fsyntax-only -Wunguarded-availability -fdiagnostics-parseable-fixits -triple x86_64-apple-darwin9 %s 2>&1 | FileCheck %s + +__attribute__((availability(macos, introduced=10.12))) +int function(void); + +void anotherFunction(int function); + +int use() { + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:14-[[@LINE-2]]:14}:"\n } else {\n // Fallback on earlier versions\n }" + int y = function(), x = 0; +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:29-[[@LINE-2]]:29}:"\n } else {\n // Fallback on earlier versions\n }" + x += function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:19-[[@LINE-2]]:19}:"\n } else {\n // Fallback on earlier versions\n }" + if (1) { + x = function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:20-[[@LINE-2]]:20}:"\n } else {\n // Fallback on earlier versions\n }" + } + anotherFunction(function()); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:31-[[@LINE-2]]:31}:"\n } else {\n // Fallback on earlier versions\n }" + if (function()) { +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE+1]]:4-[[@LINE+1]]:4}:"\n } else {\n // Fallback on earlier versions\n }" + } + while (function()) + // CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " + // CHECK-NEXT: fix-it:{{.*}}:{[[@LINE+1]]:6-[[@LINE+1]]:6}:"\n } else {\n // Fallback on earlier versions\n }" + ; + do + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:16-[[@LINE-2]]:16}:"\n } else {\n // Fallback on earlier versions\n }" + while (1); + for (int i = 0; i < 10; ++i) + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:16-[[@LINE-2]]:16}:"\n } else {\n // Fallback on earlier versions\n }" + switch (x) { + case 0: + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:16-[[@LINE-2]]:16}:"\n } else {\n // Fallback on earlier versions\n }" + case 2: + anotherFunction(1); + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:16-[[@LINE-2]]:16}:"\n } else {\n // Fallback on earlier versions\n }" + break; + default: + function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:16-[[@LINE-2]]:16}:"\n } else {\n // Fallback on earlier versions\n }" + break; + } + return function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:21-[[@LINE-2]]:21}:"\n } else {\n // Fallback on earlier versions\n }" +} + +#define MYFUNCTION function + +#define MACRO_ARGUMENT(X) X +#define MACRO_ARGUMENT_SEMI(X) X; +#define MACRO_ARGUMENT_2(X) if (1) X; + +#define INNER_MACRO if (1) MACRO_ARGUMENT(function()); else ; + +void useInMacros() { + MYFUNCTION(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:16-[[@LINE-2]]:16}:"\n } else {\n // Fallback on earlier versions\n }" + + MACRO_ARGUMENT_SEMI(function()) +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:34-[[@LINE-2]]:34}:"\n } else {\n // Fallback on earlier versions\n }" + MACRO_ARGUMENT(function()); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:30-[[@LINE-2]]:30}:"\n } else {\n // Fallback on earlier versions\n }" + MACRO_ARGUMENT_2(function()); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:32-[[@LINE-2]]:32}:"\n } else {\n // Fallback on earlier versions\n }" + + INNER_MACRO +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:14-[[@LINE-2]]:14}:"\n } else {\n // Fallback on earlier versions\n }" +} + +void wrapDeclStmtUses() { + int x = 0, y = function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:3-[[@LINE-1]]:3}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE+13]]:22-[[@LINE+13]]:22}:"\n } else {\n // Fallback on earlier versions\n }" + { + int z = function(); + if (z) { + + } +// CHECK: fix-it:{{.*}}:{[[@LINE-4]]:5-[[@LINE-4]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:6-[[@LINE-2]]:6}:"\n } else {\n // Fallback on earlier versions\n }" + } + if (y) + int z = function(); +// CHECK: fix-it:{{.*}}:{[[@LINE-1]]:5-[[@LINE-1]]:5}:"if (@available(macos 10.12, *)) {\n " +// CHECK-NEXT: fix-it:{{.*}}:{[[@LINE-2]]:24-[[@LINE-2]]:24}:"\n } else {\n // Fallback on earlier versions\n }" + anotherFunction(y); + anotherFunction(x); +} diff --git a/test/Index/Core/index-source.cpp b/test/Index/Core/index-source.cpp index 7bb366c53611..6f902610e673 100644 --- a/test/Index/Core/index-source.cpp +++ b/test/Index/Core/index-source.cpp @@ -139,13 +139,13 @@ class PseudoOverridesInSpecializations { template<> class PseudoOverridesInSpecializations<double, int> { void function() { } -// CHECK: [[@LINE-1]]:8 | instance-method/C++ | function | c:@S@PseudoOverridesInSpecializations>#d#I@F@function# | __ZN32PseudoOverridesInSpecializationsIdiE8functionEv | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:8 | instance-method/C++ | function | c:@S@PseudoOverridesInSpecializations>#d#I@F@function# | __ZN32PseudoOverridesInSpecializationsIdiE8functionEv | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | function | c:@ST>2#T#T@PseudoOverridesInSpecializations@F@function# +// CHECK-NEXT: RelSpecialization | function | c:@ST>2#T#T@PseudoOverridesInSpecializations@F@function# void staticFunction() { } // CHECK: [[@LINE-1]]:8 | instance-method/C++ | staticFunction | c:@S@PseudoOverridesInSpecializations>#d#I@F@staticFunction# | __ZN32PseudoOverridesInSpecializationsIdiE14staticFunctionEv | Def,RelChild | rel: 1 -// CHECK-NOT: RelOver +// CHECK-NOT: RelSpecialization int notOverridingField = 0; @@ -153,57 +153,56 @@ class PseudoOverridesInSpecializations<double, int> { int checLabelBreak = 0; int field = 0; -// CHECK: [[@LINE-1]]:7 | field/C++ | field | c:@S@PseudoOverridesInSpecializations>#d#I@FI@field | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:7 | field/C++ | field | c:@S@PseudoOverridesInSpecializations>#d#I@FI@field | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | field | c:@ST>2#T#T@PseudoOverridesInSpecializations@FI@field +// CHECK-NEXT: RelSpecialization | field | c:@ST>2#T#T@PseudoOverridesInSpecializations@FI@field static double variable; -// CHECK: [[@LINE-1]]:17 | static-property/C++ | variable | c:@S@PseudoOverridesInSpecializations>#d#I@variable | __ZN32PseudoOverridesInSpecializationsIdiE8variableE | Decl,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:17 | static-property/C++ | variable | c:@S@PseudoOverridesInSpecializations>#d#I@variable | __ZN32PseudoOverridesInSpecializationsIdiE8variableE | Decl,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | variable | c:@ST>2#T#T@PseudoOverridesInSpecializations@variable +// CHECK-NEXT: RelSpecialization | variable | c:@ST>2#T#T@PseudoOverridesInSpecializations@variable typedef double TypeDef; -// CHECK: [[@LINE-1]]:18 | type-alias/C | TypeDef | c:index-source.cpp@S@PseudoOverridesInSpecializations>#d#I@T@TypeDef | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:18 | type-alias/C | TypeDef | c:index-source.cpp@S@PseudoOverridesInSpecializations>#d#I@T@TypeDef | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | TypeDef | c:index-source.cpp@ST>2#T#T@PseudoOverridesInSpecializations@T@TypeDef +// CHECK-NEXT: RelSpecialization | TypeDef | c:index-source.cpp@ST>2#T#T@PseudoOverridesInSpecializations@T@TypeDef using TypeAlias = int; -// CHECK: [[@LINE-1]]:9 | type-alias/C++ | TypeAlias | c:@S@PseudoOverridesInSpecializations>#d#I@TypeAlias | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:9 | type-alias/C++ | TypeAlias | c:@S@PseudoOverridesInSpecializations>#d#I@TypeAlias | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | TypeAlias | c:@ST>2#T#T@PseudoOverridesInSpecializations@TypeAlias +// CHECK-NEXT: RelSpecialization | TypeAlias | c:@ST>2#T#T@PseudoOverridesInSpecializations@TypeAlias enum anEnum { }; -// CHECK: [[@LINE-1]]:8 | enum/C | anEnum | c:@S@PseudoOverridesInSpecializations>#d#I@E@anEnum | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:8 | enum/C | anEnum | c:@S@PseudoOverridesInSpecializations>#d#I@E@anEnum | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | anEnum | c:@ST>2#T#T@PseudoOverridesInSpecializations@E@anEnum +// CHECK-NEXT: RelSpecialization | anEnum | c:@ST>2#T#T@PseudoOverridesInSpecializations@E@anEnum class Struct { }; -// CHECK: [[@LINE-1]]:9 | class/C++ | Struct | c:@S@PseudoOverridesInSpecializations>#d#I@S@Struct | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:9 | class/C++ | Struct | c:@S@PseudoOverridesInSpecializations>#d#I@S@Struct | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | Struct | c:@ST>2#T#T@PseudoOverridesInSpecializations@S@Struct +// CHECK-NEXT: RelSpecialization | Struct | c:@ST>2#T#T@PseudoOverridesInSpecializations@S@Struct union Union { }; -// CHECK: [[@LINE-1]]:9 | union/C | Union | c:@S@PseudoOverridesInSpecializations>#d#I@U@Union | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:9 | union/C | Union | c:@S@PseudoOverridesInSpecializations>#d#I@U@Union | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | Union | c:@ST>2#T#T@PseudoOverridesInSpecializations@U@Union +// CHECK-NEXT: RelSpecialization | Union | c:@ST>2#T#T@PseudoOverridesInSpecializations@U@Union struct TypealiasOrRecord { }; -// CHECK: [[@LINE-1]]:10 | struct/C | TypealiasOrRecord | c:@S@PseudoOverridesInSpecializations>#d#I@S@TypealiasOrRecord | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:10 | struct/C | TypealiasOrRecord | c:@S@PseudoOverridesInSpecializations>#d#I@S@TypealiasOrRecord | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | TypealiasOrRecord | c:@ST>2#T#T@PseudoOverridesInSpecializations@TypealiasOrRecord +// CHECK-NEXT: RelSpecialization | TypealiasOrRecord | c:@ST>2#T#T@PseudoOverridesInSpecializations@TypealiasOrRecord template<typename U> struct InnerTemplate { }; -// CHECK: [[@LINE-1]]:31 | struct(Gen)/C++ | InnerTemplate | c:@S@PseudoOverridesInSpecializations>#d#I@ST>1#T@InnerTemplate | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:31 | struct(Gen)/C++ | InnerTemplate | c:@S@PseudoOverridesInSpecializations>#d#I@ST>1#T@InnerTemplate | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | InnerTemplate | c:@ST>2#T#T@PseudoOverridesInSpecializations@ST>1#T@InnerTemplate +// CHECK-NEXT: RelSpecialization | InnerTemplate | c:@ST>2#T#T@PseudoOverridesInSpecializations@ST>1#T@InnerTemplate template<typename U> struct InnerTemplate <U*> { }; -// CHECK-NOT: RelOver }; template<typename S> class PseudoOverridesInSpecializations<float, S> { typedef float TypealiasOrRecord; -// CHECK: [[@LINE-1]]:17 | type-alias/C | TypealiasOrRecord | c:index-source.cpp@SP>1#T@PseudoOverridesInSpecializations>#f#t0.0@T@TypealiasOrRecord | <no-cgname> | Def,RelChild,RelOver,RelSpecialization | rel: 2 +// CHECK: [[@LINE-1]]:17 | type-alias/C | TypealiasOrRecord | c:index-source.cpp@SP>1#T@PseudoOverridesInSpecializations>#f#t0.0@T@TypealiasOrRecord | <no-cgname> | Def,RelChild,RelSpecialization | rel: 2 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | TypealiasOrRecord | c:@ST>2#T#T@PseudoOverridesInSpecializations@TypealiasOrRecord +// CHECK-NEXT: RelSpecialization | TypealiasOrRecord | c:@ST>2#T#T@PseudoOverridesInSpecializations@TypealiasOrRecord }; template<typename T, typename U> @@ -215,10 +214,10 @@ class ConflictingPseudoOverridesInSpecialization { template<typename T> class ConflictingPseudoOverridesInSpecialization<int, T> { void foo(T x); -// CHECK: [[@LINE-1]]:8 | instance-method/C++ | foo | c:@SP>1#T@ConflictingPseudoOverridesInSpecialization>#I#t0.0@F@foo#S0_# | <no-cgname> | Decl,RelChild,RelOver,RelSpecialization | rel: 3 +// CHECK: [[@LINE-1]]:8 | instance-method/C++ | foo | c:@SP>1#T@ConflictingPseudoOverridesInSpecialization>#I#t0.0@F@foo#S0_# | <no-cgname> | Decl,RelChild,RelSpecialization | rel: 3 // CHECK-NEXT: RelChild -// CHECK-NEXT: RelOver,RelSpecialization | foo | c:@ST>2#T#T@ConflictingPseudoOverridesInSpecialization@F@foo#t0.0# -// CHECK-NEXT: RelOver,RelSpecialization | foo | c:@ST>2#T#T@ConflictingPseudoOverridesInSpecialization@F@foo#t0.1# +// CHECK-NEXT: RelSpecialization | foo | c:@ST>2#T#T@ConflictingPseudoOverridesInSpecialization@F@foo#t0.0# +// CHECK-NEXT: RelSpecialization | foo | c:@ST>2#T#T@ConflictingPseudoOverridesInSpecialization@F@foo#t0.1# }; template<typename T, typename U, int x> diff --git a/test/Index/KeepGoingWithLotsOfErrors.mm b/test/Index/KeepGoingWithLotsOfErrors.mm new file mode 100644 index 000000000000..078ea6e2ea14 --- /dev/null +++ b/test/Index/KeepGoingWithLotsOfErrors.mm @@ -0,0 +1,29 @@ +// RUN: env CINDEXTEST_KEEP_GOING=1 c-index-test -code-completion-at=%s:25:1 %s +// Shouldn't crash! +// This is the minimized test that triggered an infinite recursion: + ++(BOOL) onEntity { +} + +-(const Object &) a_200 { +} + +-(int) struct { +} + +-(int) bar { +} + +-(int) part { +} + ++(some_type_t) piece { +} + ++(void) z_Z_42 { + ([self onEntity: [] { 42]; + } class: ^ { } +]; + [super]; + BOOL struct; +} diff --git a/test/Misc/pragma-attribute-supported-attributes-list.test b/test/Misc/pragma-attribute-supported-attributes-list.test index f6a7ce2869ac..0db17bdf4026 100644 --- a/test/Misc/pragma-attribute-supported-attributes-list.test +++ b/test/Misc/pragma-attribute-supported-attributes-list.test @@ -2,7 +2,7 @@ // The number of supported attributes should never go down! -// CHECK: #pragma clang attribute supports 59 attributes: +// CHECK: #pragma clang attribute supports 60 attributes: // CHECK-NEXT: AMDGPUFlatWorkGroupSize (SubjectMatchRule_function) // CHECK-NEXT: AMDGPUNumSGPR (SubjectMatchRule_function) // CHECK-NEXT: AMDGPUNumVGPR (SubjectMatchRule_function) @@ -42,6 +42,7 @@ // CHECK-NEXT: ObjCRuntimeName (SubjectMatchRule_objc_interface, SubjectMatchRule_objc_protocol) // CHECK-NEXT: ObjCRuntimeVisible (SubjectMatchRule_objc_interface) // CHECK-NEXT: ObjCSubclassingRestricted (SubjectMatchRule_objc_interface) +// CHECK-NEXT: OpenCLIntelReqdSubGroupSize (SubjectMatchRule_function) // CHECK-NEXT: OpenCLNoSVM (SubjectMatchRule_variable) // CHECK-NEXT: OptimizeNone (SubjectMatchRule_function, SubjectMatchRule_objc_method) // CHECK-NEXT: Overloadable (SubjectMatchRule_function) diff --git a/test/Modules/Inputs/preprocess/file2.h b/test/Modules/Inputs/preprocess/file2.h new file mode 100644 index 000000000000..04bf796d1e9e --- /dev/null +++ b/test/Modules/Inputs/preprocess/file2.h @@ -0,0 +1,2 @@ +#include "file.h" +extern int file2; diff --git a/test/Modules/Inputs/preprocess/module.modulemap b/test/Modules/Inputs/preprocess/module.modulemap index a5c5b61dddc5..943435a953d0 100644 --- a/test/Modules/Inputs/preprocess/module.modulemap +++ b/test/Modules/Inputs/preprocess/module.modulemap @@ -1,2 +1,2 @@ module fwd { header "fwd.h" export * } -module file { header "file.h" export * } +module file { header "file.h" header "file2.h" export * } diff --git a/test/Modules/preprocess-module.cpp b/test/Modules/preprocess-module.cpp index 99fe8cf8c30b..a3b789238388 100644 --- a/test/Modules/preprocess-module.cpp +++ b/test/Modules/preprocess-module.cpp @@ -1,12 +1,101 @@ // RUN: rm -rf %t +// RUN: mkdir %t // RUN: not %clang_cc1 -fmodules -fmodule-name=file -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E 2>&1 | FileCheck %s --check-prefix=MISSING-FWD // MISSING-FWD: module 'fwd' is needed -// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodules-cache-path=%t -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E | FileCheck %s +// RUN: %clang_cc1 -fmodules -fmodule-name=fwd -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -emit-module -o %t/fwd.pcm + +// Check that we can preprocess modules, and get the expected output. +// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E -o %t/no-rewrite.ii +// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -I%S/Inputs/preprocess -x c++-module-map %S/Inputs/preprocess/module.modulemap -E -frewrite-includes -o %t/rewrite.ii +// +// RUN: FileCheck %s --input-file %t/no-rewrite.ii --check-prefix=CHECK --check-prefix=NO-REWRITE +// RUN: FileCheck %s --input-file %t/rewrite.ii --check-prefix=CHECK --check-prefix=REWRITE + +// Check that we can build a module from the preprocessed output. +// FIXME: For now, we need the headers to exist. +// RUN: touch %t/file.h %t/file2.h +// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/no-rewrite.ii -emit-module -o %t/no-rewrite.pcm +// RUN: %clang_cc1 -fmodules -fmodule-name=file -fmodule-file=%t/fwd.pcm -x c++-module-map-cpp-output %t/rewrite.ii -emit-module -o %t/rewrite.pcm + +// Check the module we built works. +// RUN: %clang_cc1 -fmodules -fmodule-file=%t/no-rewrite.pcm %s -verify +// RUN: %clang_cc1 -fmodules -fmodule-file=%t/rewrite.pcm %s -verify + + +// == module map +// CHECK: # 1 "{{.*}}module.modulemap" +// CHECK: module file { +// CHECK: header "file.h" +// CHECK: header "file2.h" +// CHECK: } + +// == file.h // CHECK: # 1 "<module-includes>" +// REWRITE: #if 0 +// REWRITE: #include "file.h" +// REWRITE: #endif +// +// FIXME: It would be preferable to consistently put the module begin/end in +// the same file, but the relative ordering of PP callbacks and module +// begin/end tokens makes that difficult. +// +// REWRITE: #pragma clang module begin file // CHECK: # 1 "{{.*}}file.h" 1 +// NO-REWRITE: #pragma clang module begin file +// NO-REWRITE: # 1 "{{.*}}file.h"{{$}} +// // CHECK: struct __FILE; -// CHECK: #pragma clang module import fwd /* clang -E: implicit import for #include "fwd.h" */ +// CHECK: #pragma clang module import fwd /* clang {{-E|-frewrite-includes}}: implicit import // CHECK: typedef struct __FILE FILE; +// +// REWRITE: #pragma clang module end // CHECK: # 2 "<module-includes>" 2 +// NO-REWRITE: #pragma clang module end + +// == file2.h +// REWRITE: #if 0 +// REWRITE: #include "file2.h" +// REWRITE: #endif +// +// REWRITE: #pragma clang module begin file +// CHECK: # 1 "{{.*}}file2.h" 1 +// NO-REWRITE: #pragma clang module begin file +// +// ==== recursively re-enter file.h +// REWRITE: #if 0 +// REWRITE: #include "file.h" +// REWRITE: #endif +// +// REWRITE: #pragma clang module begin file +// CHECK: # 1 "{{.*}}file.h" 1 +// NO-REWRITE: #pragma clang module begin file +// NO-REWRITE: # 1 "{{.*}}file.h"{{$}} +// +// CHECK: struct __FILE; +// CHECK: #pragma clang module import fwd /* clang {{-E|-frewrite-includes}}: implicit import +// CHECK: typedef struct __FILE FILE; +// +// REWRITE: #pragma clang module end +// CHECK: # 2 "{{.*}}file2.h" 2 +// NO-REWRITE: #pragma clang module end +// NO-REWRITE: # 2 "{{.*}}file2.h"{{$}} +// ==== return to file2.h +// +// CHECK: extern int file2; +// +// REWRITE: #pragma clang module end +// CHECK: # 3 "<module-includes>" 2 +// NO-REWRITE: #pragma clang module end + + +// expected-no-diagnostics + +// FIXME: This should be rejected: we have not imported the submodule defining it yet. +__FILE *a; + +#pragma clang module import file + +FILE *b; +int x = file2; diff --git a/test/OpenMP/varargs.cpp b/test/OpenMP/varargs.cpp new file mode 100644 index 000000000000..7738f83fab24 --- /dev/null +++ b/test/OpenMP/varargs.cpp @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -verify -fopenmp %s +void f(int a, ...) { +#pragma omp parallel for + for (int i = 0; i < 100; ++i) { + __builtin_va_list ap; + __builtin_va_start(ap, a); // expected-error {{'va_start' cannot be used in a captured statement}} + } +}; diff --git a/test/Parser/MicrosoftExtensions.cpp b/test/Parser/MicrosoftExtensions.cpp index 830412ed474f..74f4bb3268de 100644 --- a/test/Parser/MicrosoftExtensions.cpp +++ b/test/Parser/MicrosoftExtensions.cpp @@ -60,7 +60,7 @@ struct struct_without_uuid { }; struct __declspec(uuid("000000A0-0000-0000-C000-000000000049")) struct_with_uuid2; -[uuid("000000A0-0000-0000-C000-000000000049")] struct struct_with_uuid3; +[uuid("000000A0-0000-0000-C000-000000000049")] struct struct_with_uuid3; // expected-warning{{specifying 'uuid' as an ATL attribute is deprecated; use __declspec instead}} struct struct_with_uuid2 {} ; diff --git a/test/Parser/ms-square-bracket-attributes.mm b/test/Parser/ms-square-bracket-attributes.mm index 98b2f6c2d3ea..a158cf7b2b90 100644 --- a/test/Parser/ms-square-bracket-attributes.mm +++ b/test/Parser/ms-square-bracket-attributes.mm @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -std=c++14 -verify -fms-extensions %s +// RUN: %clang_cc1 -fsyntax-only -std=c++14 -verify -fms-extensions %s -Wno-deprecated-declarations typedef struct _GUID { unsigned long Data1; diff --git a/test/Preprocessor/aarch64-target-features.c b/test/Preprocessor/aarch64-target-features.c index c9c7f2dc4a4e..43a050b14c06 100644 --- a/test/Preprocessor/aarch64-target-features.c +++ b/test/Preprocessor/aarch64-target-features.c @@ -109,7 +109,7 @@ // CHECK-MCPU-THUNDERX2T99: "-cc1"{{.*}} "-triple" "aarch64{{.*}}" "-target-feature" "+neon" "-target-feature" "+crc" "-target-feature" "+crypto" // RUN: %clang -target x86_64-apple-macosx -arch arm64 -### -c %s 2>&1 | FileCheck --check-prefix=CHECK-ARCH-ARM64 %s -// CHECK-ARCH-ARM64: "-target-cpu" "cyclone" "-target-feature" "+neon" "-target-feature" "+crypto" "-target-feature" "+zcm" "-target-feature" "+zcz" +// CHECK-ARCH-ARM64: "-target-cpu" "cyclone" "-target-feature" "+fp-armv8" "-target-feature" "+neon" "-target-feature" "+crypto" "-target-feature" "+zcm" "-target-feature" "+zcz" // RUN: %clang -target aarch64 -march=armv8-a+fp+simd+crc+crypto -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-MARCH-1 %s // RUN: %clang -target aarch64 -march=armv8-a+nofp+nosimd+nocrc+nocrypto+fp+simd+crc+crypto -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-MARCH-1 %s diff --git a/test/Preprocessor/macro_paste_commaext.c b/test/Preprocessor/macro_paste_commaext.c index fdb8f982a929..60418effe7c3 100644 --- a/test/Preprocessor/macro_paste_commaext.c +++ b/test/Preprocessor/macro_paste_commaext.c @@ -1,13 +1,20 @@ -// RUN: %clang_cc1 %s -E | grep 'V);' -// RUN: %clang_cc1 %s -E | grep 'W, 1, 2);' -// RUN: %clang_cc1 %s -E | grep 'X, 1, 2);' -// RUN: %clang_cc1 %s -E | grep 'Y,);' -// RUN: %clang_cc1 %s -E | grep 'Z,);' +// RUN: %clang_cc1 %s -E | FileCheck --strict-whitespace --match-full-lines %s + +// In the following tests, note that the output is sensitive to the +// whitespace *preceeding* the varargs argument, as well as to +// interior whitespace. AFAIK, this is the only case where whitespace +// preceeding an argument matters, and might be considered a bug in +// GCC. Nevertheless, since this feature is a GCC extension in the +// first place, we'll follow along. #define debug(format, ...) format, ## __VA_ARGS__) +// CHECK:V); debug(V); -debug(W, 1, 2); +// CHECK:W,1, 2); +debug(W,1, 2); +// CHECK:X, 1, 2); debug(X, 1, 2 ); +// CHECK:Y,); debug(Y, ); +// CHECK:Z,); debug(Z,); - diff --git a/test/Preprocessor/pragma_module.c b/test/Preprocessor/pragma_module.c index d734f66efcef..90aa9481fb13 100644 --- a/test/Preprocessor/pragma_module.c +++ b/test/Preprocessor/pragma_module.c @@ -1,11 +1,52 @@ -// RUN: %clang -cc1 -E -fmodules %s -verify +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo 'module foo { module a {} module b {} } module bar {} module if {}' > %t/module.map +// RUN: %clang -cc1 -fmodules -fmodule-name=if -x c %t/module.map -emit-module -o %t/if.pcm +// RUN: %clang -cc1 -E -fmodules %s -fmodule-file=%t/if.pcm -verify -fmodule-name=foo -fmodule-map-file=%t/module.map +// RUN: %clang -cc1 -E -fmodules %s -fmodule-file=%t/if.pcm -verify -fmodule-name=foo -fmodule-map-file=%t/module.map -fmodules-local-submodule-visibility -DLOCAL_VIS // Just checking the syntax here; the semantics are tested elsewhere. -#pragma clang module import // expected-error {{expected identifier in module name}} -#pragma clang module import ! // expected-error {{expected identifier in module name}} -#pragma clang module import if // expected-error {{expected identifier in module name}} -#pragma clang module import foo ? bar // expected-error {{expected '.' or end of directive after module name}} -#pragma clang module import foo. // expected-error {{expected identifier}} -#pragma clang module import foo.bar.baz.quux // expected-error {{module 'foo' not found}} +#pragma clang module import // expected-error {{expected module name}} +#pragma clang module import ! // expected-error {{expected module name}} +#pragma clang module import if // ok +#pragma clang module import foo ? bar // expected-warning {{extra tokens at end of #pragma}} +#pragma clang module import foo. // expected-error {{expected identifier after '.' in module name}} +#pragma clang module import foo.bar.baz.quux // expected-error {{no submodule named 'bar' in module 'foo'}} -#error here // expected-error {{here}} +#pragma clang module begin ! // expected-error {{expected module name}} + +#pragma clang module begin foo.a blah // expected-warning {{extra tokens}} + #pragma clang module begin foo.a // nesting is OK + #define X 1 // expected-note 0-1{{previous}} + #ifndef X + #error X should be defined here + #endif + #pragma clang module end + + #ifndef X + #error X should still be defined + #endif +#pragma clang module end foo.a // expected-warning {{extra tokens}} + +// #pragma clang module begin/end also import the module into the enclosing context +#ifndef X +#error X should still be defined +#endif + +#pragma clang module begin foo.b + #if defined(X) && defined(LOCAL_VIS) + #error under -fmodules-local-submodule-visibility, X should not be defined + #endif + + #if !defined(X) && !defined(LOCAL_VIS) + #error without -fmodules-local-submodule-visibility, X should still be defined + #endif + + #pragma clang module import foo.a + #ifndef X + #error X should be defined here + #endif +#pragma clang module end + +#pragma clang module end // expected-error {{no matching '#pragma clang module begin'}} +#pragma clang module begin foo.a // expected-error {{no matching '#pragma clang module end'}} diff --git a/test/Preprocessor/stringize_space.c b/test/Preprocessor/stringize_space.c index ae70bf18187c..cbc7386cd09b 100644 --- a/test/Preprocessor/stringize_space.c +++ b/test/Preprocessor/stringize_space.c @@ -18,3 +18,14 @@ f( 1) // CHECK: {{^}}"-1" + +#define paste(a,b) str(a<b##ld) +paste(hello1, wor) +paste(hello2, + wor) +paste(hello3, +wor) + +// CHECK: {{^}}"hello1<world" +// CHECK: {{^}}"hello2<world" +// CHECK: {{^}}"hello3<world" diff --git a/test/Sema/arm-interrupt-attr.c b/test/Sema/arm-interrupt-attr.c index 3a6cdbe0e072..60691ab7f8e8 100644 --- a/test/Sema/arm-interrupt-attr.c +++ b/test/Sema/arm-interrupt-attr.c @@ -1,7 +1,8 @@ -// RUN: %clang_cc1 %s -triple arm-apple-darwin -verify -fsyntax-only -// RUN: %clang_cc1 %s -triple thumb-apple-darwin -verify -fsyntax-only -// RUN: %clang_cc1 %s -triple armeb-none-eabi -verify -fsyntax-only -// RUN: %clang_cc1 %s -triple thumbeb-none-eabi -verify -fsyntax-only +// RUN: %clang_cc1 %s -triple arm-apple-darwin -target-feature +vfp2 -verify -fsyntax-only +// RUN: %clang_cc1 %s -triple thumb-apple-darwin -target-feature +vfp3 -verify -fsyntax-only +// RUN: %clang_cc1 %s -triple armeb-none-eabi -target-feature +vfp4 -verify -fsyntax-only +// RUN: %clang_cc1 %s -triple thumbeb-none-eabi -target-feature +neon -verify -fsyntax-only +// RUN: %clang_cc1 %s -triple thumbeb-none-eabi -target-feature +neon -target-feature +soft-float -DSOFT -verify -fsyntax-only __attribute__((interrupt(IRQ))) void foo() {} // expected-error {{'interrupt' attribute requires a string}} __attribute__((interrupt("irq"))) void foo1() {} // expected-warning {{'interrupt' attribute argument not supported: irq}} @@ -24,6 +25,8 @@ void caller1() { callee1(); callee2(); } + +#ifndef SOFT __attribute__((interrupt("IRQ"))) void caller2() { callee1(); // expected-warning {{call to function without interrupt attribute could clobber interruptee's VFP registers}} callee2(); @@ -33,3 +36,14 @@ void (*callee3)(); __attribute__((interrupt("IRQ"))) void caller3() { callee3(); // expected-warning {{call to function without interrupt attribute could clobber interruptee's VFP registers}} } +#else +__attribute__((interrupt("IRQ"))) void caller2() { + callee1(); + callee2(); +} + +void (*callee3)(); +__attribute__((interrupt("IRQ"))) void caller3() { + callee3(); +} +#endif diff --git a/test/Sema/attr-availability.c b/test/Sema/attr-availability.c index c4133e3b9bc6..e105037c8ed0 100644 --- a/test/Sema/attr-availability.c +++ b/test/Sema/attr-availability.c @@ -30,7 +30,7 @@ void test_10095131() { ATSFontGetPostScriptName(100); // expected-error {{'ATSFontGetPostScriptName' is unavailable: obsoleted in macOS 9.0 - use ATSFontGetFullPostScriptName}} #if defined(WARN_PARTIAL) - // expected-warning@+2 {{is only available on macOS 10.8 or newer}} expected-note@+2 {{enclose 'PartiallyAvailable' in an @available check to silence this warning}} + // expected-warning@+2 {{is only available on macOS 10.8 or newer}} expected-note@+2 {{enclose 'PartiallyAvailable' in a __builtin_available check to silence this warning}} #endif PartiallyAvailable(); } diff --git a/test/SemaCXX/ms-uuid.cpp b/test/SemaCXX/ms-uuid.cpp index 461e3c12ff8a..e29dda878e68 100644 --- a/test/SemaCXX/ms-uuid.cpp +++ b/test/SemaCXX/ms-uuid.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions %s +// RUN: %clang_cc1 -fsyntax-only -verify -fms-extensions %s -Wno-deprecated-declarations typedef struct _GUID { unsigned long Data1; diff --git a/test/SemaCXX/varargs.cpp b/test/SemaCXX/varargs.cpp index 6a1883786a33..f9027c247993 100644 --- a/test/SemaCXX/varargs.cpp +++ b/test/SemaCXX/varargs.cpp @@ -1,12 +1,59 @@ -// RUN: %clang_cc1 -fsyntax-only -std=c++03 -verify %s +// RUN: %clang_cc1 -std=c++03 -verify %s +// RUN: %clang_cc1 -std=c++11 -verify %s + +__builtin_va_list ap; class string; void f(const string& s, ...) { // expected-note {{parameter of type 'const string &' is declared here}} - __builtin_va_list ap; __builtin_va_start(ap, s); // expected-warning {{passing an object of reference type to 'va_start' has undefined behavior}} } void g(register int i, ...) { - __builtin_va_list ap; - __builtin_va_start(ap, i); // okay + __builtin_va_start(ap, i); // UB in C, OK in C++ +} + +// Don't crash when there is no last parameter. +void no_params(...) { + int a; + __builtin_va_start(ap, a); // expected-warning {{second argument to 'va_start' is not the last named parameter}} +} + +// Reject this. The __builtin_va_start would execute in Foo's non-variadic +// default ctor. +void record_context(int a, ...) { + struct Foo { + // expected-error@+1 {{'va_start' cannot be used outside a function}} + void meth(int a, int b = (__builtin_va_start(ap, a), 0)) {} + }; +} + +#if __cplusplus >= 201103L +// We used to have bugs identifying the correct enclosing function scope in a +// lambda. + +void fixed_lambda_varargs_function(int a, ...) { + [](int b) { + __builtin_va_start(ap, b); // expected-error {{'va_start' used in function with fixed args}} + }(42); +} +void varargs_lambda_fixed_function(int a) { + [](int b, ...) { + __builtin_va_start(ap, b); // correct + }(42); +} + +auto fixed_lambda_global = [](int f) { + __builtin_va_start(ap, f); // expected-error {{'va_start' used in function with fixed args}} +}; +auto varargs_lambda_global = [](int f, ...) { + __builtin_va_start(ap, f); // correct +}; + +void record_member_init(int a, ...) { + struct Foo { + int a = 0; + // expected-error@+1 {{'va_start' cannot be used outside a function}} + int b = (__builtin_va_start(ap, a), 0); + }; } +#endif diff --git a/test/SemaCXX/warn-zero-nullptr.cpp b/test/SemaCXX/warn-zero-nullptr.cpp new file mode 100644 index 000000000000..edd2a759b70f --- /dev/null +++ b/test/SemaCXX/warn-zero-nullptr.cpp @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s -Wzero-as-null-pointer-constant -std=c++11 + +struct S {}; + +int (S::*mp0) = nullptr; +void (*fp0)() = nullptr; +void* p0 = nullptr; + +int (S::*mp1) = 0; // expected-warning{{zero as null pointer constant}} +void (*fp1)() = 0; // expected-warning{{zero as null pointer constant}} +void* p1 = 0; // expected-warning{{zero as null pointer constant}} + +// NULL is an integer constant expression, so warn on it too: +void* p2 = __null; // expected-warning{{zero as null pointer constant}} +void (*fp2)() = __null; // expected-warning{{zero as null pointer constant}} +int (S::*mp2) = __null; // expected-warning{{zero as null pointer constant}} + +void f0(void* v = 0); // expected-warning{{zero as null pointer constant}} +void f1(void* v); + +void g() { + f1(0); // expected-warning{{zero as null pointer constant}} +} + +// Warn on these too. Matches gcc and arguably makes sense. +void* pp = (decltype(nullptr))0; // expected-warning{{zero as null pointer constant}} +void* pp2 = static_cast<decltype(nullptr)>(0); // expected-warning{{zero as null pointer constant}} diff --git a/test/SemaObjC/x86-method-vector-values.m b/test/SemaObjC/x86-method-vector-values.m index 6c5189d08427..23d07b1b41fa 100644 --- a/test/SemaObjC/x86-method-vector-values.m +++ b/test/SemaObjC/x86-method-vector-values.m @@ -68,6 +68,8 @@ struct AggregateFloat { float v; }; #else +// expected-no-diagnostics + -(void)takeVector:(float3)v { } @@ -84,15 +86,9 @@ struct AggregateFloat { float v; }; } -(void)takeVector2:(float3)v AVAILABLE_MACOS_10_10 { -#ifdef MAC -// expected-error@-2 {{'float3' (vector of 3 'float' values) parameter type is unsupported}} -#endif } - (__m128)retM128_2 AVAILABLE_MACOS_10_10 { -#ifdef MAC -// expected-error@-2 {{'__m128' (vector of 4 'float' values) return type is unsupported}} -#endif __m128 value; return value; } @@ -101,9 +97,6 @@ struct AggregateFloat { float v; }; } -(void)takeVector4:(float3)v AVAILABLE_IOS_8 { -#ifdef IOS - // expected-error@-2 {{'float3' (vector of 3 'float' values) parameter type is unsupported}} -#endif } -(void)takeVector5:(float3)v AVAILABLE_IOS_9 { // no error diff --git a/test/SemaOpenCL/invalid-kernel-attrs.cl b/test/SemaOpenCL/invalid-kernel-attrs.cl index cedbb0664675..1f1359cceead 100644 --- a/test/SemaOpenCL/invalid-kernel-attrs.cl +++ b/test/SemaOpenCL/invalid-kernel-attrs.cl @@ -33,3 +33,7 @@ void f_kernel_image2d_t( kernel image2d_t image ) { // expected-error {{'kernel' kernel __attribute__((reqd_work_group_size(1,2,0))) void kernel11(){} // expected-error {{'reqd_work_group_size' attribute must be greater than 0}} kernel __attribute__((reqd_work_group_size(1,0,2))) void kernel12(){} // expected-error {{'reqd_work_group_size' attribute must be greater than 0}} kernel __attribute__((reqd_work_group_size(0,1,2))) void kernel13(){} // expected-error {{'reqd_work_group_size' attribute must be greater than 0}} + +__attribute__((intel_reqd_sub_group_size(8))) void kernel14(){} // expected-error {{attribute 'intel_reqd_sub_group_size' can only be applied to a kernel}} +kernel __attribute__((intel_reqd_sub_group_size(0))) void kernel15(){} // expected-error {{'intel_reqd_sub_group_size' attribute must be greater than 0}} +kernel __attribute__((intel_reqd_sub_group_size(8))) __attribute__((intel_reqd_sub_group_size(16))) void kernel16() {} //expected-warning{{attribute 'intel_reqd_sub_group_size' is already applied with different parameters}} diff --git a/test/SemaOpenCL/sampler_t.cl b/test/SemaOpenCL/sampler_t.cl index 0dddeeb39013..4d68dd20a17e 100644 --- a/test/SemaOpenCL/sampler_t.cl +++ b/test/SemaOpenCL/sampler_t.cl @@ -9,7 +9,8 @@ constant sampler_t glb_smp = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; constant sampler_t glb_smp2; // expected-error{{variable in constant address space must be initialized}} -global sampler_t glb_smp3 = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_NEAREST; // expected-error{{sampler type cannot be used with the __local and __global address space qualifiers}} +global sampler_t glb_smp3 = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_NEAREST; // expected-error{{sampler type cannot be used with the __local and __global address space qualifiers}} expected-error {{global sampler requires a const or constant address space qualifier}} +const global sampler_t glb_smp3_const = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; // expected-error{{sampler type cannot be used with the __local and __global address space qualifiers}} constant sampler_t glb_smp4 = 0; #ifdef CHECK_SAMPLER_VALUE @@ -38,6 +39,11 @@ constant struct sampler_s { sampler_t bad(void); //expected-error{{declaring function return value of type 'sampler_t' is not allowed}} +sampler_t global_nonconst_smp = 0; // expected-error {{global sampler requires a const or constant address space qualifier}} + +const sampler_t glb_smp10 = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; +const constant sampler_t glb_smp11 = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; + void kernel ker(sampler_t argsmp) { local sampler_t smp; // expected-error{{sampler type cannot be used with the __local and __global address space qualifiers}} const sampler_t const_smp = CLK_ADDRESS_CLAMP_TO_EDGE | CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR; |
