diff options
author | Yaxun Liu <Yaxun.Liu@amd.com> | 2016-12-16 19:22:08 +0000 |
---|---|---|
committer | Yaxun Liu <Yaxun.Liu@amd.com> | 2016-12-16 19:22:08 +0000 |
commit | 2e8331cab61615d3831f4eb497a38171eaccc9e7 (patch) | |
tree | 9d77b116da67230781caacc4fd5d82c9260b17d8 /clang/test | |
parent | a4e7dfbc16e6e9c786f01a325a3663e8028b4cc0 (diff) | |
download | bcm5719-llvm-2e8331cab61615d3831f4eb497a38171eaccc9e7.tar.gz bcm5719-llvm-2e8331cab61615d3831f4eb497a38171eaccc9e7.zip |
[OpenCL] Allow disabling types and declarations associated with extensions
Added a map to associate types and declarations with extensions.
Refactored existing diagnostic for disabled types associated with extensions and extended it to declarations for generic situation.
Fixed some bugs for types associated with extensions.
Allow users to use pragma to declare types and functions for supported extensions, e.g.
#pragma OPENCL EXTENSION the_new_extension_name : begin
// declare types and functions associated with the extension here
#pragma OPENCL EXTENSION the_new_extension_name : end
Differential Revision: https://reviews.llvm.org/D21698
llvm-svn: 289979
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/CodeGenOpenCL/extension-begin.cl | 25 | ||||
-rw-r--r-- | clang/test/Parser/opencl-atomics-cl20.cl | 19 | ||||
-rw-r--r-- | clang/test/Parser/opencl-pragma.cl | 4 | ||||
-rw-r--r-- | clang/test/SemaOpenCL/extension-begin.cl | 56 | ||||
-rw-r--r-- | clang/test/SemaOpenCL/extensions.cl | 2 |
5 files changed, 94 insertions, 12 deletions
diff --git a/clang/test/CodeGenOpenCL/extension-begin.cl b/clang/test/CodeGenOpenCL/extension-begin.cl new file mode 100644 index 00000000000..1d5f78965f3 --- /dev/null +++ b/clang/test/CodeGenOpenCL/extension-begin.cl @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -triple spir-unknown-unknown -emit-llvm -o - | FileCheck %s + +__attribute__((overloadable)) void f(int x); + +#pragma OPENCL EXTENSION my_ext : begin + +__attribute__((overloadable)) void f(long x); + +#pragma OPENCL EXTENSION my_ext : end + +#pragma OPENCL EXTENSION my_ext : enable + +//CHECK: define spir_func void @test_f1(i64 %x) +//CHECK: call spir_func void @_Z1fl(i64 %{{.*}}) +void test_f1(long x) { + f(x); +} + +#pragma OPENCL EXTENSION my_ext : disable + +//CHECK: define spir_func void @test_f2(i64 %x) +//CHECK: call spir_func void @_Z1fi(i32 %{{.*}}) +void test_f2(long x) { + f(x); +} diff --git a/clang/test/Parser/opencl-atomics-cl20.cl b/clang/test/Parser/opencl-atomics-cl20.cl index cd37757b97f..65fb9d9b42a 100644 --- a/clang/test/Parser/opencl-atomics-cl20.cl +++ b/clang/test/Parser/opencl-atomics-cl20.cl @@ -1,5 +1,6 @@ // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -fsyntax-only -cl-std=CL2.0 -DCL20 +// RUN: %clang_cc1 %s -triple spir64-unknown-unknown -verify -fsyntax-only -cl-std=CL2.0 -DCL20 // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -fsyntax-only -cl-std=CL2.0 -DCL20 -DEXT -Wpedantic-core-features #ifdef EXT @@ -47,14 +48,16 @@ void atomic_types_test() { // expected-error@-28 {{use of type 'atomic_ulong' (aka '_Atomic(unsigned long)') requires cl_khr_int64_extended_atomics extension to be enabled}} // expected-error@-27 {{use of type 'atomic_double' (aka '_Atomic(double)') requires cl_khr_int64_base_atomics extension to be enabled}} // expected-error@-28 {{use of type 'atomic_double' (aka '_Atomic(double)') requires cl_khr_int64_extended_atomics extension to be enabled}} -// expected-error-re@-27 {{use of type 'atomic_intptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} -// expected-error-re@-28 {{use of type 'atomic_intptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} -// expected-error-re@-28 {{use of type 'atomic_uintptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} -// expected-error-re@-29 {{use of type 'atomic_uintptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} -// expected-error-re@-29 {{use of type 'atomic_size_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} -// expected-error-re@-30 {{use of type 'atomic_size_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} -// expected-error-re@-30 {{use of type 'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} -// expected-error-re@-31 {{use of type 'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} +#if __LP64__ +// expected-error-re@-28 {{use of type 'atomic_intptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} +// expected-error-re@-29 {{use of type 'atomic_intptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} +// expected-error-re@-29 {{use of type 'atomic_uintptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} +// expected-error-re@-30 {{use of type 'atomic_uintptr_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} +// expected-error-re@-30 {{use of type 'atomic_size_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} +// expected-error-re@-31 {{use of type 'atomic_size_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} +// expected-error-re@-31 {{use of type 'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be enabled}} +// expected-error-re@-32 {{use of type 'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension to be enabled}} +#endif #endif #ifdef CL20 diff --git a/clang/test/Parser/opencl-pragma.cl b/clang/test/Parser/opencl-pragma.cl index b002b0854a4..02f053fb40d 100644 --- a/clang/test/Parser/opencl-pragma.cl +++ b/clang/test/Parser/opencl-pragma.cl @@ -5,9 +5,9 @@ #pragma OPENCL EXTENSION cl_no_such_extension : disable /* expected-warning {{unknown OpenCL extension 'cl_no_such_extension' - ignoring}} */ #pragma OPENCL EXTENSION all : disable -#pragma OPENCL EXTENSION all : enable /* expected-warning {{unknown OpenCL extension 'all' - ignoring}} */ +#pragma OPENCL EXTENSION all : enable /* expected-warning {{expected 'disable' - ignoring}} */ -#pragma OPENCL EXTENSION cl_khr_fp64 : on /* expected-warning {{expected 'enable' or 'disable' - ignoring}} */ +#pragma OPENCL EXTENSION cl_khr_fp64 : on /* expected-warning {{expected 'enable', 'disable', 'begin' or 'end' - ignoring}} */ #pragma OPENCL FP_CONTRACT ON #pragma OPENCL FP_CONTRACT OFF diff --git a/clang/test/SemaOpenCL/extension-begin.cl b/clang/test/SemaOpenCL/extension-begin.cl new file mode 100644 index 00000000000..3393458a893 --- /dev/null +++ b/clang/test/SemaOpenCL/extension-begin.cl @@ -0,0 +1,56 @@ +// Test this without pch. +// RUN: %clang_cc1 %s -DHEADER -DHEADER_USER -triple spir-unknown-unknown -verify -pedantic -fsyntax-only + +// Test with pch. +// RUN: %clang_cc1 %s -DHEADER -triple spir-unknown-unknown -emit-pch -o %t -verify -pedantic +// RUN: %clang_cc1 %s -DHEADER_USER -triple spir-unknown-unknown -include-pch %t -fsyntax-only -verify -pedantic + +#if defined(HEADER) && !defined(INCLUDED) +#define INCLUDED + +#pragma OPENCL EXTENSION all : begin // expected-warning {{expected 'disable' - ignoring}} +#pragma OPENCL EXTENSION all : end // expected-warning {{expected 'disable' - ignoring}} + +#pragma OPENCL EXTENSION my_ext : begin + +struct A { + int a; +}; + +typedef struct A TypedefOfA; +typedef const TypedefOfA* PointerOfA; + +void f(void); + +__attribute__((overloadable)) void g(long x); + +#pragma OPENCL EXTENSION my_ext : end +#pragma OPENCL EXTENSION my_ext : end // expected-warning {{OpenCL extension end directive mismatches begin directive - ignoring}} + +__attribute__((overloadable)) void g(void); + +#endif // defined(HEADER) && !defined(INCLUDED) + +#ifdef HEADER_USER + +#pragma OPENCL EXTENSION my_ext : enable +void test_f1(void) { + struct A test_A1; + f(); + g(0); +} + +#pragma OPENCL EXTENSION my_ext : disable +void test_f2(void) { + struct A test_A2; // expected-error {{use of type 'struct A' requires my_ext extension to be enabled}} + const struct A test_A_local; // expected-error {{use of type 'struct A' requires my_ext extension to be enabled}} + TypedefOfA test_typedef_A; // expected-error {{use of type 'TypedefOfA' (aka 'struct A') requires my_ext extension to be enabled}} + PointerOfA test_A_pointer; // expected-error {{use of type 'PointerOfA' (aka 'const struct A *') requires my_ext extension to be enabled}} + f(); // expected-error {{use of declaration requires my_ext extension to be enabled}} + g(0); // expected-error {{no matching function for call to 'g'}} + // expected-note@-26 {{candidate disabled due to OpenCL extension}} + // expected-note@-22 {{candidate function not viable: requires 0 arguments, but 1 was provided}} +} + +#endif // HEADER_USER + diff --git a/clang/test/SemaOpenCL/extensions.cl b/clang/test/SemaOpenCL/extensions.cl index 688185ec207..c27f3397cd7 100644 --- a/clang/test/SemaOpenCL/extensions.cl +++ b/clang/test/SemaOpenCL/extensions.cl @@ -22,8 +22,6 @@ // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only -cl-ext=-all -cl-ext=+cl_khr_fp64 -cl-ext=+cl_khr_fp16 -cl-ext=-cl_khr_fp64 -DNOFP64 // RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only -cl-ext=-all -cl-ext=+cl_khr_fp64,-cl_khr_fp64,+cl_khr_fp16 -DNOFP64 - - #ifdef FP64 // expected-no-diagnostics #endif |