diff options
author | Yaxun Liu <Yaxun.Liu@amd.com> | 2016-05-16 17:06:34 +0000 |
---|---|---|
committer | Yaxun Liu <Yaxun.Liu@amd.com> | 2016-05-16 17:06:34 +0000 |
commit | 39cf40f6b4c6deb66c3ff27f0cba73ed8b9d0cbc (patch) | |
tree | 2065265703a4521859685c00949c1a9f699a7e9d /clang/lib | |
parent | 46a256a3ebd0f03fa830ac5f26f8df3616494cf7 (diff) | |
download | bcm5719-llvm-39cf40f6b4c6deb66c3ff27f0cba73ed8b9d0cbc.tar.gz bcm5719-llvm-39cf40f6b4c6deb66c3ff27f0cba73ed8b9d0cbc.zip |
[OpenCL] Add supported OpenCL extensions to target info.
Add supported OpenCL extensions to target info. It serves as default values to save the users of the burden setting each supported extensions and optional core features in command line.
Re-commit after fixing build error due to missing override attribute.
Differential Revision: http://reviews.llvm.org/D19484
llvm-svn: 269670
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 48 | ||||
-rw-r--r-- | clang/lib/Frontend/InitPreprocessor.cpp | 9 | ||||
-rw-r--r-- | clang/lib/Parse/ParsePragma.cpp | 14 | ||||
-rw-r--r-- | clang/lib/Sema/Sema.cpp | 8 |
4 files changed, 65 insertions, 14 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 0d882bddf14..36def86cb7d 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -1999,17 +1999,6 @@ public: 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 @@ public: return true; } + + void setSupportedOpenCLOpts() override { + 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 @@ public: bool hasSjLjLowering() const override { return true; } + + void setSupportedOpenCLOpts() override { + getSupportedOpenCLOpts().setAll(); + } }; bool X86TargetInfo::setFPMath(StringRef Name) { @@ -7858,6 +7876,12 @@ public: CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override { return CC_SpirFunction; } + + void setSupportedOpenCLOpts() override { + // 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 1c7793e285a..5d38d5f9503 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 6024a622108..9e9a749bb98 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 d8d10b637ec..35e303ee923 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) { |