diff options
Diffstat (limited to 'include/clang/Basic/OpenCLOptions.h')
-rw-r--r-- | include/clang/Basic/OpenCLOptions.h | 111 |
1 files changed, 76 insertions, 35 deletions
diff --git a/include/clang/Basic/OpenCLOptions.h b/include/clang/Basic/OpenCLOptions.h index fa52ae723f..9fb4dbb7ba 100644 --- a/include/clang/Basic/OpenCLOptions.h +++ b/include/clang/Basic/OpenCLOptions.h @@ -15,81 +15,122 @@ #ifndef LLVM_CLANG_BASIC_OPENCLOPTIONS_H #define LLVM_CLANG_BASIC_OPENCLOPTIONS_H -#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringMap.h" namespace clang { /// \brief OpenCL supported extensions and optional core features class OpenCLOptions { + struct Info { + bool Supported; // Is this option supported + bool Enabled; // Is this option enabled + unsigned Avail; // Option starts to be available in this OpenCL version + unsigned Core; // Option becomes (optional) core feature in this OpenCL + // version + Info(bool S = false, bool E = false, unsigned A = 100, unsigned C = ~0U) + :Supported(S), Enabled(E), Avail(A), Core(C){} + }; + llvm::StringMap<Info> OptMap; public: -#define OPENCLEXT(nm) unsigned nm : 1; -#include "clang/Basic/OpenCLExtensions.def" + bool isKnown(StringRef Ext) const { + return OptMap.find(Ext) != OptMap.end(); + } - OpenCLOptions() { -#define OPENCLEXT(nm) nm = 0; -#include "clang/Basic/OpenCLExtensions.def" + bool isEnabled(StringRef Ext) const { + return OptMap.find(Ext)->second.Enabled; } - // Enable or disable all options. - void setAll(bool Enable = true) { -#define OPENCLEXT(nm) nm = Enable; -#include "clang/Basic/OpenCLExtensions.def" + // Is supported as either an extension or an (optional) core feature for + // OpenCL version \p CLVer. + bool isSupported(StringRef Ext, unsigned CLVer) const { + auto I = OptMap.find(Ext)->getValue(); + return I.Supported && I.Avail <= CLVer; + } + + // Is supported (optional) OpenCL core features for OpenCL version \p CLVer. + // For supported extension, return false. + bool isSupportedCore(StringRef Ext, unsigned CLVer) const { + auto I = OptMap.find(Ext)->getValue(); + return I.Supported && I.Avail <= CLVer && + I.Core != ~0U && CLVer >= I.Core; + } + + // Is supported OpenCL extension for OpenCL version \p CLVer. + // For supported (optional) core feature, return false. + bool isSupportedExtension(StringRef Ext, unsigned CLVer) const { + auto I = OptMap.find(Ext)->getValue(); + return I.Supported && I.Avail <= CLVer && + (I.Core == ~0U || CLVer < I.Core); + } + + void enable(StringRef Ext, bool V = true) { + OptMap[Ext].Enabled = V; } /// \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) { + void support(StringRef Ext, bool V = true) { assert(!Ext.empty() && "Extension is empty."); switch (Ext[0]) { case '+': - Enable = true; + V = true; Ext = Ext.drop_front(); break; case '-': - Enable = false; + V = false; Ext = Ext.drop_front(); break; } if (Ext.equals("all")) { - setAll(Enable); + supportAll(V); return; } + OptMap[Ext].Supported = V; + } -#define OPENCLEXT(nm) \ - if (Ext.equals(#nm)) { \ - nm = Enable; \ - } + OpenCLOptions(){ +#define OPENCLEXT_INTERNAL(Ext, AvailVer, CoreVer) \ + OptMap[#Ext].Avail = AvailVer; \ + OptMap[#Ext].Core = CoreVer; #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; \ + void addSupport(const OpenCLOptions &Opts) { + for (auto &I:Opts.OptMap) + if (I.second.Supported) + OptMap[I.getKey()].Supported = true; + } + + void copy(const OpenCLOptions &Opts) { + OptMap = Opts.OptMap; } -#include "clang/Basic/OpenCLExtensions.def" + // Turn on or off support of all options. + void supportAll(bool On = true) { + for (llvm::StringMap<Info>::iterator I = OptMap.begin(), + E = OptMap.end(); I != E; ++I) + I->second.Supported = On; + } - // 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); \ + void disableAll() { + for (llvm::StringMap<Info>::iterator I = OptMap.begin(), + E = OptMap.end(); I != E; ++I) + I->second.Enabled = false; } -#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; \ + void enableSupportedCore(unsigned CLVer) { + for (llvm::StringMap<Info>::iterator I = OptMap.begin(), + E = OptMap.end(); I != E; ++I) + if (isSupportedCore(I->getKey(), CLVer)) + I->second.Enabled = true; } -#include "clang/Basic/OpenCLExtensions.def" + friend class ASTWriter; + friend class ASTReader; }; } // end namespace clang |