diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index c3eea00e1be41..f54e3f3eaae11 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -926,6 +926,10 @@ def warn_pragma_expected_enable_disable : Warning< "expected 'enable' or 'disable' - ignoring">, InGroup; def warn_pragma_unknown_extension : Warning< "unknown OpenCL extension %0 - ignoring">, InGroup; +def warn_pragma_unsupported_extension : Warning< + "unsupported OpenCL extension %0 - ignoring">, InGroup; +def warn_pragma_extension_is_core : Warning< + "OpenCL extension %0 is core feature or supported optional core feature - ignoring">, InGroup; // OpenCL errors. def err_opencl_taking_function_address_parser : Error< diff --git a/clang/include/clang/Basic/LangOptions.h b/clang/include/clang/Basic/LangOptions.h index a069a8f8b8f47..4da7a56cb3dfc 100644 --- a/clang/include/clang/Basic/LangOptions.h +++ b/clang/include/clang/Basic/LangOptions.h @@ -160,18 +160,6 @@ class FPOptions { fp_contract(LangOpts.DefaultFPContract) {} }; -/// \brief OpenCL volatile options -class OpenCLOptions { -public: -#define OPENCLEXT(nm) unsigned nm : 1; -#include "clang/Basic/OpenCLExtensions.def" - - OpenCLOptions() { -#define OPENCLEXT(nm) nm = 0; -#include "clang/Basic/OpenCLExtensions.def" - } -}; - /// \brief Describes the kind of translation unit being processed. enum TranslationUnitKind { /// \brief The translation unit is a complete translation unit. diff --git a/clang/include/clang/Basic/OpenCLExtensions.def b/clang/include/clang/Basic/OpenCLExtensions.def index 91fd9195b1902..70c45bba302cd 100644 --- a/clang/include/clang/Basic/OpenCLExtensions.def +++ b/clang/include/clang/Basic/OpenCLExtensions.def @@ -11,25 +11,67 @@ // //===----------------------------------------------------------------------===// +// Macro OPENCLEXT or OPENCLEXT_INTERNAL can be defined to enumerate the +// OpenCL extensions listed in this file. +// +// If the extensions are to be enumerated without the supported OpenCL version, +// define OPENCLEXT(ext) where ext is the name of the extension. +// +// If the extensions are to be enumerated with supported OpenCL version, +// define OPENCLEXT_INTERNAL(ext, avail, core) where +// ext - name of the extension or optional core feature. +// avail - minimum OpenCL version supporting it. +// core - minimum OpenCL version when the extension becomes optional core +// feature or core feature. ~0U indicates not a core feature or an +// optional core feature. + +#ifndef OPENCLEXT_INTERNAL +#ifndef OPENCLEXT +#pragma error "macro OPENCLEXT or OPENCLEXT_INTERNAL is required" +#else +#define OPENCLEXT_INTERNAL(ext, ...) OPENCLEXT(ext) +#endif // OPENCLEXT +#endif // OPENCLEXT_INTERNAL + +// OpenCL 1.0. +OPENCLEXT_INTERNAL(cl_khr_3d_image_writes, 100, 120) +OPENCLEXT_INTERNAL(cl_khr_byte_addressable_store, 100, 110) +OPENCLEXT_INTERNAL(cl_khr_fp16, 100, ~0U) +OPENCLEXT_INTERNAL(cl_khr_fp64, 100, 120) +OPENCLEXT_INTERNAL(cl_khr_global_int32_base_atomics, 100, 110) +OPENCLEXT_INTERNAL(cl_khr_global_int32_extended_atomics, 100, 110) +OPENCLEXT_INTERNAL(cl_khr_gl_sharing, 100, ~0U) +OPENCLEXT_INTERNAL(cl_khr_icd, 100, ~0U) +OPENCLEXT_INTERNAL(cl_khr_local_int32_base_atomics, 100, 110) +OPENCLEXT_INTERNAL(cl_khr_local_int32_extended_atomics, 100, 110) + // OpenCL 1.1. -OPENCLEXT(cl_khr_fp64) -OPENCLEXT(cl_khr_int64_base_atomics) -OPENCLEXT(cl_khr_int64_extended_atomics) -OPENCLEXT(cl_khr_fp16) -OPENCLEXT(cl_khr_gl_sharing) -OPENCLEXT(cl_khr_gl_event) -OPENCLEXT(cl_khr_d3d10_sharing) -OPENCLEXT(cl_khr_global_int32_base_atomics) -OPENCLEXT(cl_khr_global_int32_extended_atomics) -OPENCLEXT(cl_khr_local_int32_base_atomics) -OPENCLEXT(cl_khr_local_int32_extended_atomics) -OPENCLEXT(cl_khr_byte_addressable_store) -OPENCLEXT(cl_khr_3d_image_writes) - -// OpenCL 2.0 -OPENCLEXT(cl_khr_gl_msaa_sharing) +OPENCLEXT_INTERNAL(cl_khr_d3d10_sharing, 110, ~0U) +OPENCLEXT_INTERNAL(cl_khr_gl_event, 110, ~0U) +OPENCLEXT_INTERNAL(cl_khr_int64_base_atomics, 110, ~0U) +OPENCLEXT_INTERNAL(cl_khr_int64_extended_atomics, 110, ~0U) + +// OpenCL 1.2. +OPENCLEXT_INTERNAL(cl_khr_d3d11_sharing, 120, ~0U) +OPENCLEXT_INTERNAL(cl_khr_depth_images, 120, ~0U) +OPENCLEXT_INTERNAL(cl_khr_dx9_media_sharing, 120, ~0U) +OPENCLEXT_INTERNAL(cl_khr_gl_depth_images, 120, ~0U) +OPENCLEXT_INTERNAL(cl_khr_spir, 120, ~0U) + +// OpenCL 2.0. +OPENCLEXT_INTERNAL(cl_khr_egl_event, 200, ~0U) +OPENCLEXT_INTERNAL(cl_khr_egl_image, 200, ~0U) +OPENCLEXT_INTERNAL(cl_khr_gl_msaa_sharing, 200, ~0U) +OPENCLEXT_INTERNAL(cl_khr_initialize_memory, 200, ~0U) +OPENCLEXT_INTERNAL(cl_khr_srgb_image_writes, 200, ~0U) +OPENCLEXT_INTERNAL(cl_khr_subgroups, 200, ~0U) +OPENCLEXT_INTERNAL(cl_khr_terminate_context, 200, ~0U) // Clang Extensions. -OPENCLEXT(cl_clang_storage_class_specifiers) +OPENCLEXT_INTERNAL(cl_clang_storage_class_specifiers, 100, ~0U) + +#undef OPENCLEXT_INTERNAL +#ifdef OPENCLEXT #undef OPENCLEXT +#endif diff --git a/clang/include/clang/Basic/OpenCLOptions.h b/clang/include/clang/Basic/OpenCLOptions.h new file mode 100644 index 0000000000000..4aaa3d74ccbf1 --- /dev/null +++ b/clang/include/clang/Basic/OpenCLOptions.h @@ -0,0 +1,68 @@ +//===--- OpenCLOptions.h ----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// \brief Defines the clang::OpenCLOptions class. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_BASIC_OPENCLOPTIONS_H +#define LLVM_CLANG_BASIC_OPENCLOPTIONS_H + +#include +#include + +namespace clang { + +/// \brief OpenCL supported extensions and optional core features +class OpenCLOptions { +public: +#define OPENCLEXT(nm) unsigned nm : 1; +#include "clang/Basic/OpenCLExtensions.def" + + OpenCLOptions() { +#define OPENCLEXT(nm) nm = 0; +#include "clang/Basic/OpenCLExtensions.def" + } + + // Enable all options. + void setAll() { +#define OPENCLEXT(nm) nm = 1; +#include "clang/Basic/OpenCLExtensions.def" + } + + // Is supported with OpenCL version \p OCLVer. +#define OPENCLEXT_INTERNAL(Ext, Avail, ...) \ + bool is_##Ext##_supported(unsigned OCLVer) const { \ + return Ext && OCLVer >= Avail; \ + } +#include "clang/Basic/OpenCLExtensions.def" + + + // Is supported OpenCL extension with OpenCL version \p OCLVer. + // For supported optional core feature, return false. +#define OPENCLEXT_INTERNAL(Ext, Avail, Core) \ + bool is_##Ext##_supported_extension(unsigned CLVer) const { \ + return is_##Ext##_supported(CLVer) && (Core == ~0U || CLVer < Core); \ + } +#include "clang/Basic/OpenCLExtensions.def" + + // Is supported OpenCL core features with OpenCL version \p OCLVer. + // For supported extension, return false. +#define OPENCLEXT_INTERNAL(Ext, Avail, Core) \ + bool is_##Ext##_supported_core(unsigned CLVer) const { \ + return is_##Ext##_supported(CLVer) && Core != ~0U && CLVer >= Core; \ + } +#include "clang/Basic/OpenCLExtensions.def" + +}; + +} // end namespace clang + +#endif diff --git a/clang/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index cf76daee713ab..950e8b9a4a6de 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -969,6 +969,19 @@ class TargetInfo : public RefCountedBase { /// \brief Whether target allows to overalign ABI-specified prefered alignment virtual bool allowsLargerPreferedTypeAlignment() const { return true; } + /// \brief Set supported OpenCL extensions and optional core features. + virtual void setSupportedOpenCLOpts() {} + + /// \brief Get supported OpenCL extensions and optional core features. + OpenCLOptions &getSupportedOpenCLOpts() { + return getTargetOpts().SupportedOpenCLOptions; + } + + /// \brief Get const supported OpenCL extensions and optional core features. + const OpenCLOptions &getSupportedOpenCLOpts() const { + return getTargetOpts().SupportedOpenCLOptions; + } + protected: virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return PointerWidth; diff --git a/clang/include/clang/Basic/TargetOptions.h b/clang/include/clang/Basic/TargetOptions.h index 81fb7b21170df..fde294c922515 100644 --- a/clang/include/clang/Basic/TargetOptions.h +++ b/clang/include/clang/Basic/TargetOptions.h @@ -17,6 +17,7 @@ #include #include +#include "clang/Basic/OpenCLOptions.h" namespace clang { @@ -54,6 +55,9 @@ class TargetOptions { std::vector Features; std::vector Reciprocals; + + /// Supported OpenCL extensions and optional core features. + OpenCLOptions SupportedOpenCLOptions; }; } // end namespace clang diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 4ca67ac08caa6..b1b12e468bff4 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -1999,17 +1999,6 @@ class AMDGPUTargetInfo : public TargetInfo { Builder.defineMacro("__HAS_FMAF__"); if (hasLDEXPF) Builder.defineMacro("__HAS_LDEXPF__"); - if (hasFP64 && Opts.OpenCL) - Builder.defineMacro("cl_khr_fp64"); - if (Opts.OpenCL) { - if (GPU >= GK_NORTHERN_ISLANDS) { - Builder.defineMacro("cl_khr_byte_addressable_store"); - Builder.defineMacro("cl_khr_global_int32_base_atomics"); - Builder.defineMacro("cl_khr_global_int32_extended_atomics"); - Builder.defineMacro("cl_khr_local_int32_base_atomics"); - Builder.defineMacro("cl_khr_local_int32_extended_atomics"); - } - } } BuiltinVaListKind getBuiltinVaListKind() const override { @@ -2097,6 +2086,31 @@ class AMDGPUTargetInfo : public TargetInfo { return true; } + + void setSupportedOpenCLOpts() { + auto &Opts = getSupportedOpenCLOpts(); + Opts.cl_clang_storage_class_specifiers = 1; + Opts.cl_khr_gl_sharing = 1; + Opts.cl_khr_gl_event = 1; + Opts.cl_khr_d3d10_sharing = 1; + Opts.cl_khr_subgroups = 1; + + if (hasFP64) + Opts.cl_khr_fp64 = 1; + if (GPU >= GK_NORTHERN_ISLANDS) { + Opts.cl_khr_byte_addressable_store = 1; + Opts.cl_khr_global_int32_base_atomics = 1; + Opts.cl_khr_global_int32_extended_atomics = 1; + Opts.cl_khr_local_int32_base_atomics = 1; + Opts.cl_khr_local_int32_extended_atomics = 1; + } + if (GPU >= GK_SOUTHERN_ISLANDS) + Opts.cl_khr_fp16 = 1; + Opts.cl_khr_int64_base_atomics = 1; + Opts.cl_khr_int64_extended_atomics = 1; + Opts.cl_khr_3d_image_writes = 1; + Opts.cl_khr_gl_msaa_sharing = 1; + } }; const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = { @@ -2716,6 +2730,10 @@ class X86TargetInfo : public TargetInfo { bool hasSjLjLowering() const override { return true; } + + void setSupportedOpenCLOpts() { + getSupportedOpenCLOpts().setAll(); + } }; bool X86TargetInfo::setFPMath(StringRef Name) { @@ -7858,6 +7876,12 @@ class SPIRTargetInfo : public TargetInfo { CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { return CC_SpirFunction; } + + void setSupportedOpenCLOpts() { + // Assume all OpenCL extensions and optional core features are supported + // for SPIR since it is a generic target. + getSupportedOpenCLOpts().setAll(); + } }; class SPIR32TargetInfo : public SPIRTargetInfo { @@ -8458,5 +8482,7 @@ TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags, if (!Target->handleTargetFeatures(Opts->Features, Diags)) return nullptr; + Target->setSupportedOpenCLOpts(); + return Target.release(); } diff --git a/clang/lib/Frontend/InitPreprocessor.cpp b/clang/lib/Frontend/InitPreprocessor.cpp index 1c7793e285ad7..5d38d5f950352 100644 --- a/clang/lib/Frontend/InitPreprocessor.cpp +++ b/clang/lib/Frontend/InitPreprocessor.cpp @@ -938,6 +938,15 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__CUDA_ARCH__"); } + // OpenCL definitions. + if (LangOpts.OpenCL) { +#define OPENCLEXT(Ext) \ + if (TI.getSupportedOpenCLOpts().is_##Ext##_supported( \ + LangOpts.OpenCLVersion)) \ + Builder.defineMacro(#Ext); +#include "clang/Basic/OpenCLExtensions.def" + } + // Get other target #defines. TI.getTargetDefines(LangOpts, Builder); } diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index 6024a62210842..9e9a749bb98d7 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -468,14 +468,24 @@ void Parser::HandlePragmaOpenCLExtension() { ConsumeToken(); // The annotation token. OpenCLOptions &f = Actions.getOpenCLOptions(); + auto CLVer = getLangOpts().OpenCLVersion; + auto &Supp = getTargetInfo().getSupportedOpenCLOpts(); // OpenCL 1.1 9.1: "The all variant sets the behavior for all extensions, // overriding all previously issued extension directives, but only if the // behavior is set to disable." if (state == 0 && ename->isStr("all")) { -#define OPENCLEXT(nm) f.nm = 0; +#define OPENCLEXT(nm) \ + if (Supp.is_##nm##_supported_extension(CLVer)) \ + f.nm = 0; #include "clang/Basic/OpenCLExtensions.def" } -#define OPENCLEXT(nm) else if (ename->isStr(#nm)) { f.nm = state; } +#define OPENCLEXT(nm) else if (ename->isStr(#nm)) \ + if (Supp.is_##nm##_supported_extension(CLVer)) \ + f.nm = state; \ + else if (Supp.is_##nm##_supported_core(CLVer)) \ + PP.Diag(NameLoc, diag::warn_pragma_extension_is_core) << ename; \ + else \ + PP.Diag(NameLoc, diag::warn_pragma_unsupported_extension) << ename; #include "clang/Basic/OpenCLExtensions.def" else { PP.Diag(NameLoc, diag::warn_pragma_unknown_extension) << ename; diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index d8d10b637ec0d..35e303ee923b1 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -207,8 +207,14 @@ void Sema::Initialize() { addImplicitTypedef("size_t", Context.getSizeType()); } - // Initialize predefined OpenCL types. + // Initialize predefined OpenCL types and supported optional core features. if (getLangOpts().OpenCL) { +#define OPENCLEXT(Ext) \ + if (Context.getTargetInfo().getSupportedOpenCLOpts().is_##Ext##_supported_core( \ + getLangOpts().OpenCLVersion)) \ + getOpenCLOptions().Ext = 1; +#include "clang/Basic/OpenCLExtensions.def" + addImplicitTypedef("sampler_t", Context.OCLSamplerTy); addImplicitTypedef("event_t", Context.OCLEventTy); if (getLangOpts().OpenCLVersion >= 200) { diff --git a/clang/test/CodeGenOpenCL/builtins-r600.cl b/clang/test/CodeGenOpenCL/builtins-r600.cl index 001dc06f5978c..6369f3d83dbc9 100644 --- a/clang/test/CodeGenOpenCL/builtins-r600.cl +++ b/clang/test/CodeGenOpenCL/builtins-r600.cl @@ -1,5 +1,5 @@ // REQUIRES: amdgpu-registered-target -// RUN: %clang_cc1 -triple r600-unknown-unknown -S -emit-llvm -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple r600-unknown-unknown -target-cpu rv670 -S -emit-llvm -o - %s | FileCheck %s #pragma OPENCL EXTENSION cl_khr_fp64 : enable diff --git a/clang/test/CodeGenOpenCL/fpmath.cl b/clang/test/CodeGenOpenCL/fpmath.cl index ef4da845529c6..88df3bf166abb 100644 --- a/clang/test/CodeGenOpenCL/fpmath.cl +++ b/clang/test/CodeGenOpenCL/fpmath.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown | FileCheck %s typedef __attribute__(( ext_vector_type(4) )) float float4; diff --git a/clang/test/CodeGenOpenCL/half.cl b/clang/test/CodeGenOpenCL/half.cl index bd5ae7f649900..9acabf0a2a83c 100644 --- a/clang/test/CodeGenOpenCL/half.cl +++ b/clang/test/CodeGenOpenCL/half.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s +// RUN: %clang_cc1 %s -emit-llvm -o - -triple spir-unknown-unknown | FileCheck %s #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/clang/test/Lexer/opencl-half-literal.cl b/clang/test/Lexer/opencl-half-literal.cl index 2415ee4fd8c98..42ca5146b1fb5 100644 --- a/clang/test/Lexer/opencl-half-literal.cl +++ b/clang/test/Lexer/opencl-half-literal.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -fsyntax-only -verify +// RUN: %clang_cc1 %s -fsyntax-only -verify -triple spir-unknown-unknown #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/clang/test/Misc/languageOptsOpenCL.cl b/clang/test/Misc/languageOptsOpenCL.cl index 82a8f3614f378..9651f01a7dc59 100644 --- a/clang/test/Misc/languageOptsOpenCL.cl +++ b/clang/test/Misc/languageOptsOpenCL.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -x cl %s -verify +// RUN: %clang_cc1 -x cl %s -verify -triple spir-unknown-unknown // expected-no-diagnostics // Test the forced language options for OpenCL are set correctly. diff --git a/clang/test/PCH/opencl-extensions.cl b/clang/test/PCH/opencl-extensions.cl index a22b007f9d540..d6d541658a18e 100644 --- a/clang/test/PCH/opencl-extensions.cl +++ b/clang/test/PCH/opencl-extensions.cl @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -emit-pch -o %t %s -// RUN: %clang_cc1 -include-pch %t -fsyntax-only %s +// RUN: %clang_cc1 -emit-pch -o %t %s -triple spir-unknown-unknown +// RUN: %clang_cc1 -include-pch %t -fsyntax-only %s -triple spir-unknown-unknown #ifndef HEADER #define HEADER diff --git a/clang/test/Parser/opencl-astype.cl b/clang/test/Parser/opencl-astype.cl index 72f98a4ace9ff..903c42ee8c14b 100644 --- a/clang/test/Parser/opencl-astype.cl +++ b/clang/test/Parser/opencl-astype.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple spir-unknown-unknown #pragma OPENCL EXTENSION cl_khr_fp64 : enable void test_astype() { diff --git a/clang/test/Parser/opencl-atomics-cl20.cl b/clang/test/Parser/opencl-atomics-cl20.cl index cb2f59721acc0..20f969645fe01 100644 --- a/clang/test/Parser/opencl-atomics-cl20.cl +++ b/clang/test/Parser/opencl-atomics-cl20.cl @@ -1,11 +1,14 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 -DCL20 -// RUN: %clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 -DCL20 -DEXT +// 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 spir-unknown-unknown -verify -fsyntax-only -cl-std=CL2.0 -DCL20 -DEXT #ifdef EXT #pragma OPENCL EXTENSION cl_khr_int64_base_atomics:enable #pragma OPENCL EXTENSION cl_khr_int64_extended_atomics:enable #pragma OPENCL EXTENSION cl_khr_fp64:enable +#if __OPENCL_C_VERSION__ >= CL_VERSION_1_2 +// expected-warning@-2{{OpenCL extension 'cl_khr_fp64' is core feature or supported optional core feature - ignoring}} +#endif #endif void atomic_types_test() { @@ -44,15 +47,14 @@ 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@-29 {{use of type 'atomic_double' (aka '_Atomic(double)') requires cl_khr_fp64 extension to be enabled}} -// 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}} +// 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}} #endif #ifdef CL20 diff --git a/clang/test/Parser/opencl-pragma.cl b/clang/test/Parser/opencl-pragma.cl index 4c48b2a496f78..b002b0854a4d0 100644 --- a/clang/test/Parser/opencl-pragma.cl +++ b/clang/test/Parser/opencl-pragma.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -pedantic -Wno-empty-translation-unit -fsyntax-only +// RUN: %clang_cc1 %s -verify -pedantic -Wno-empty-translation-unit -fsyntax-only -triple spir-unknown-unknown #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/clang/test/Parser/opencl-storage-class.cl b/clang/test/Parser/opencl-storage-class.cl index 6316ba7701da6..a8ebc1af39993 100644 --- a/clang/test/Parser/opencl-storage-class.cl +++ b/clang/test/Parser/opencl-storage-class.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -fsyntax-only +// RUN: %clang_cc1 %s -verify -fsyntax-only -triple spir-unknown-unknown void test_storage_class_specs() { diff --git a/clang/test/SemaOpenCL/extension-fp64-cl1.1.cl b/clang/test/SemaOpenCL/extension-fp64-cl1.1.cl deleted file mode 100644 index 7e852ae70ebbd..0000000000000 --- a/clang/test/SemaOpenCL/extension-fp64-cl1.1.cl +++ /dev/null @@ -1,19 +0,0 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL1.1 - -void f1(double da) { // expected-error {{type 'double' requires cl_khr_fp64 extension}} - double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}} - (void) 1.0; // expected-warning {{double precision constant requires cl_khr_fp64}} -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -void f2(void) { - double d; - (void) 1.0; -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : disable - -void f3(void) { - double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}} -} diff --git a/clang/test/SemaOpenCL/extension-fp64.cl b/clang/test/SemaOpenCL/extension-fp64.cl deleted file mode 100644 index e0c2b1ea4b53d..0000000000000 --- a/clang/test/SemaOpenCL/extension-fp64.cl +++ /dev/null @@ -1,19 +0,0 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only - -void f1(double da) { // expected-error {{type 'double' requires cl_khr_fp64 extension}} - double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}} - (void) 1.0; // expected-warning {{double precision constant requires cl_khr_fp64}} -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -void f2(void) { - double d; - (void) 1.0; -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : disable - -void f3(void) { - double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}} -} diff --git a/clang/test/SemaOpenCL/extensions.cl b/clang/test/SemaOpenCL/extensions.cl new file mode 100644 index 0000000000000..31224e0df7745 --- /dev/null +++ b/clang/test/SemaOpenCL/extensions.cl @@ -0,0 +1,36 @@ +// RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only +// RUN: %clang_cc1 %s -triple spir-unknown-unknown -verify -pedantic -fsyntax-only -cl-std=CL1.1 + +// Test with a target not supporting fp64. +// RUN: %clang_cc1 %s -triple r600-unknown-unknown -target-cpu r600 -verify -pedantic -fsyntax-only -DNOFP64 + +void f1(double da) { // expected-error {{type 'double' requires cl_khr_fp64 extension}} + double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}} + (void) 1.0; // expected-warning {{double precision constant requires cl_khr_fp64}} +} + +#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#ifdef NOFP64 +// expected-warning@-2{{unsupported OpenCL extension 'cl_khr_fp64' - ignoring}} +#endif + +void f2(void) { + double d; +#ifdef NOFP64 +// expected-error@-2{{use of type 'double' requires cl_khr_fp64 extension to be enabled}} +#endif + + (void) 1.0; +#ifdef NOFP64 +// expected-warning@-2{{double precision constant requires cl_khr_fp64, casting to single precision}} +#endif +} + +#pragma OPENCL EXTENSION cl_khr_fp64 : disable +#ifdef NOFP64 +// expected-warning@-2{{unsupported OpenCL extension 'cl_khr_fp64' - ignoring}} +#endif + +void f3(void) { + double d; // expected-error {{type 'double' requires cl_khr_fp64 extension}} +} diff --git a/clang/test/SemaOpenCL/half.cl b/clang/test/SemaOpenCL/half.cl index f8cc017bb8525..dd7bb9ab8c5d4 100644 --- a/clang/test/SemaOpenCL/half.cl +++ b/clang/test/SemaOpenCL/half.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -Wno-unused-value +// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -Wno-unused-value -triple spir-unknown-unknown #pragma OPENCL EXTENSION cl_khr_fp16 : disable constant float f = 1.0h; // expected-error{{half precision constant requires cl_khr_fp16}} diff --git a/clang/test/SemaOpenCL/invalid-kernel-parameters.cl b/clang/test/SemaOpenCL/invalid-kernel-parameters.cl index a30a27faa9121..e2e48e83c6b9f 100644 --- a/clang/test/SemaOpenCL/invalid-kernel-parameters.cl +++ b/clang/test/SemaOpenCL/invalid-kernel-parameters.cl @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify %s -triple spir-unknown-unknown #pragma OPENCL EXTENSION cl_khr_fp16 : enable diff --git a/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl b/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl index 7ba1adbf53e0e..96602ce6844aa 100644 --- a/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl +++ b/clang/test/SemaOpenCL/invalid-logical-ops-1.2.cl @@ -1,6 +1,7 @@ // RUN: %clang_cc1 %s -verify -cl-std=CL1.2 -triple x86_64-unknown-linux-gnu -#pragma OPENCL EXTENSION cl_khr_fp64 : enable +#pragma OPENCL EXTENSION cl_khr_fp64 : enable // expected-warning{{OpenCL extension 'cl_khr_fp64' is core feature or supported optional core feature - ignoring}} + typedef __attribute__((ext_vector_type(4))) float float4; typedef __attribute__((ext_vector_type(4))) double double4; typedef __attribute__((ext_vector_type(4))) int int4; diff --git a/clang/test/SemaOpenCL/optional-core-fp64-cl1.2.cl b/clang/test/SemaOpenCL/optional-core-fp64-cl1.2.cl deleted file mode 100644 index e0f7f1db4ff1c..0000000000000 --- a/clang/test/SemaOpenCL/optional-core-fp64-cl1.2.cl +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL1.2 -// expected-no-diagnostics - -void f1(double da) { - double d; - (void) 1.0; -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -void f2(void) { - double d; - (void) 1.0; -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : disable - -void f3(void) { - double d; -} diff --git a/clang/test/SemaOpenCL/optional-core-fp64-cl2.0.cl b/clang/test/SemaOpenCL/optional-core-fp64-cl2.0.cl deleted file mode 100644 index 832529d4adf7c..0000000000000 --- a/clang/test/SemaOpenCL/optional-core-fp64-cl2.0.cl +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only -cl-std=CL2.0 -// expected-no-diagnostics - -void f1(double da) { - double d; - (void) 1.0; -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -void f2(void) { - double d; - (void) 1.0; -} - -#pragma OPENCL EXTENSION cl_khr_fp64 : disable - -void f3(void) { - double d; -}