mirror of https://github.com/microsoft/clang.git
139 lines
4.0 KiB
C++
139 lines
4.0 KiB
C++
//===--- 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 "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:
|
|
bool isKnown(StringRef Ext) const {
|
|
return OptMap.find(Ext) != OptMap.end();
|
|
}
|
|
|
|
bool isEnabled(StringRef Ext) const {
|
|
return OptMap.find(Ext)->second.Enabled;
|
|
}
|
|
|
|
// 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 support(StringRef Ext, bool V = true) {
|
|
assert(!Ext.empty() && "Extension is empty.");
|
|
|
|
switch (Ext[0]) {
|
|
case '+':
|
|
V = true;
|
|
Ext = Ext.drop_front();
|
|
break;
|
|
case '-':
|
|
V = false;
|
|
Ext = Ext.drop_front();
|
|
break;
|
|
}
|
|
|
|
if (Ext.equals("all")) {
|
|
supportAll(V);
|
|
return;
|
|
}
|
|
OptMap[Ext].Supported = V;
|
|
}
|
|
|
|
OpenCLOptions(){
|
|
#define OPENCLEXT_INTERNAL(Ext, AvailVer, CoreVer) \
|
|
OptMap[#Ext].Avail = AvailVer; \
|
|
OptMap[#Ext].Core = CoreVer;
|
|
#include "clang/Basic/OpenCLExtensions.def"
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
// 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;
|
|
}
|
|
|
|
void disableAll() {
|
|
for (llvm::StringMap<Info>::iterator I = OptMap.begin(),
|
|
E = OptMap.end(); I != E; ++I)
|
|
I->second.Enabled = false;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
friend class ASTWriter;
|
|
friend class ASTReader;
|
|
};
|
|
|
|
} // end namespace clang
|
|
|
|
#endif
|