summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorAlexey Bader <aleksey.bader@mail.ru>2016-11-01 15:50:52 +0000
committerAlexey Bader <aleksey.bader@mail.ru>2016-11-01 15:50:52 +0000
commit63cbcdadcc74a3a6e0ff9f76028758ce97741203 (patch)
treed554412ac39a4551ca9cd3b2b8260d1dc2f97389 /include
parent1cd2ec853d7d1b67c182989921a27fc875e36ffb (diff)
[OpenCL] Override supported OpenCL extensions with -cl-ext option
Summary: This patch adds a command line option '-cl-ext' to control a set of supported OpenCL extensions. Option accepts a comma-separated list of extensions prefixed with '+' or '-'. It can be used together with a target triple to override support for some extensions: // spir target supports all extensions, but we want to disable fp64 clang -cc1 -triple spir-unknown-unknown -cl-ext=-cl_khr_fp64 Special 'all' extension allows to enable or disable all possible extensions: // only fp64 will be supported clang -cc1 -triple spir-unknown-unknown -cl-ext=-all,+cl_khr_fp64 Patch by asavonic (Andrew Savonichev). Reviewers: joey, yaxunl Subscribers: yaxunl, bader, Anastasia, cfe-commits Differential Revision: https://reviews.llvm.org/D23712 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@285700 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r--include/clang/Basic/OpenCLOptions.h38
-rw-r--r--include/clang/Basic/TargetInfo.h7
-rw-r--r--include/clang/Basic/TargetOptions.h4
-rw-r--r--include/clang/Driver/CC1Options.td7
4 files changed, 53 insertions, 3 deletions
diff --git a/include/clang/Basic/OpenCLOptions.h b/include/clang/Basic/OpenCLOptions.h
index 4a629c97ff..fa52ae723f 100644
--- a/include/clang/Basic/OpenCLOptions.h
+++ b/include/clang/Basic/OpenCLOptions.h
@@ -15,6 +15,8 @@
#ifndef LLVM_CLANG_BASIC_OPENCLOPTIONS_H
#define LLVM_CLANG_BASIC_OPENCLOPTIONS_H
+#include "llvm/ADT/StringRef.h"
+
namespace clang {
/// \brief OpenCL supported extensions and optional core features
@@ -28,9 +30,39 @@ public:
#include "clang/Basic/OpenCLExtensions.def"
}
- // Enable all options.
- void setAll() {
-#define OPENCLEXT(nm) nm = 1;
+ // Enable or disable all options.
+ void setAll(bool Enable = true) {
+#define OPENCLEXT(nm) nm = Enable;
+#include "clang/Basic/OpenCLExtensions.def"
+ }
+
+ /// \brief Enable or disable support for OpenCL extensions
+ /// \param Ext name of the extension optionally prefixed with
+ /// '+' or '-'
+ /// \param Enable used when \p Ext is not prefixed by '+' or '-'
+ void set(llvm::StringRef Ext, bool Enable = true) {
+ assert(!Ext.empty() && "Extension is empty.");
+
+ switch (Ext[0]) {
+ case '+':
+ Enable = true;
+ Ext = Ext.drop_front();
+ break;
+ case '-':
+ Enable = false;
+ Ext = Ext.drop_front();
+ break;
+ }
+
+ if (Ext.equals("all")) {
+ setAll(Enable);
+ return;
+ }
+
+#define OPENCLEXT(nm) \
+ if (Ext.equals(#nm)) { \
+ nm = Enable; \
+ }
#include "clang/Basic/OpenCLExtensions.def"
}
diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h
index dbdbff8473..d231882e97 100644
--- a/include/clang/Basic/TargetInfo.h
+++ b/include/clang/Basic/TargetInfo.h
@@ -995,6 +995,13 @@ public:
/// \brief Set supported OpenCL extensions and optional core features.
virtual void setSupportedOpenCLOpts() {}
+ /// \brief Set supported OpenCL extensions as written on command line
+ virtual void setOpenCLExtensionOpts() {
+ for (const auto &Ext : getTargetOpts().OpenCLExtensionsAsWritten) {
+ getTargetOpts().SupportedOpenCLOptions.set(Ext);
+ }
+ }
+
/// \brief Get supported OpenCL extensions and optional core features.
OpenCLOptions &getSupportedOpenCLOpts() {
return getTargetOpts().SupportedOpenCLOptions;
diff --git a/include/clang/Basic/TargetOptions.h b/include/clang/Basic/TargetOptions.h
index fde294c922..2889cce596 100644
--- a/include/clang/Basic/TargetOptions.h
+++ b/include/clang/Basic/TargetOptions.h
@@ -58,6 +58,10 @@ public:
/// Supported OpenCL extensions and optional core features.
OpenCLOptions SupportedOpenCLOptions;
+
+ /// \brief The list of OpenCL extensions to enable or disable, as written on
+ /// the command line.
+ std::vector<std::string> OpenCLExtensionsAsWritten;
};
} // end namespace clang
diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td
index 989e292c16..68593e9227 100644
--- a/include/clang/Driver/CC1Options.td
+++ b/include/clang/Driver/CC1Options.td
@@ -688,6 +688,13 @@ def detailed_preprocessing_record : Flag<["-"], "detailed-preprocessing-record">
HelpText<"include a detailed record of preprocessing actions">;
//===----------------------------------------------------------------------===//
+// OpenCL Options
+//===----------------------------------------------------------------------===//
+
+def cl_ext_EQ : CommaJoined<["-"], "cl-ext=">,
+ HelpText<"OpenCL only. Enable or disable OpenCL extensions. The argument is a comma-separated sequence of one or more extension names, each prefixed by '+' or '-'.">;
+
+//===----------------------------------------------------------------------===//
// CUDA Options
//===----------------------------------------------------------------------===//