]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/include/clang/Basic/OpenCLOptions.h
Update clang to trunk r290819 and resolve conflicts.
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / include / clang / Basic / OpenCLOptions.h
1 //===--- OpenCLOptions.h ----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief Defines the clang::OpenCLOptions class.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_CLANG_BASIC_OPENCLOPTIONS_H
16 #define LLVM_CLANG_BASIC_OPENCLOPTIONS_H
17
18 #include "llvm/ADT/StringMap.h"
19
20 namespace clang {
21
22 /// \brief OpenCL supported extensions and optional core features
23 class OpenCLOptions {
24   struct Info {
25     bool Supported; // Is this option supported
26     bool Enabled;   // Is this option enabled
27     unsigned Avail; // Option starts to be available in this OpenCL version
28     unsigned Core;  // Option becomes (optional) core feature in this OpenCL
29                     // version
30     Info(bool S = false, bool E = false, unsigned A = 100, unsigned C = ~0U)
31       :Supported(S), Enabled(E), Avail(A), Core(C){}
32   };
33   llvm::StringMap<Info> OptMap;
34 public:
35   bool isKnown(llvm::StringRef Ext) const {
36     return OptMap.find(Ext) != OptMap.end();
37   }
38
39   bool isEnabled(llvm::StringRef Ext) const {
40     return OptMap.find(Ext)->second.Enabled;
41   }
42
43   // Is supported as either an extension or an (optional) core feature for
44   // OpenCL version \p CLVer.
45   bool isSupported(llvm::StringRef Ext, unsigned CLVer) const {
46     auto I = OptMap.find(Ext)->getValue();
47     return I.Supported && I.Avail <= CLVer;
48   }
49
50   // Is supported (optional) OpenCL core features for OpenCL version \p CLVer.
51   // For supported extension, return false.
52   bool isSupportedCore(llvm::StringRef Ext, unsigned CLVer) const {
53     auto I = OptMap.find(Ext)->getValue();
54     return I.Supported && I.Avail <= CLVer &&
55       I.Core != ~0U && CLVer >= I.Core;
56   }
57
58   // Is supported OpenCL extension for OpenCL version \p CLVer.
59   // For supported (optional) core feature, return false.
60  bool isSupportedExtension(llvm::StringRef Ext, unsigned CLVer) const {
61     auto I = OptMap.find(Ext)->getValue();
62     return I.Supported && I.Avail <= CLVer &&
63       (I.Core == ~0U || CLVer < I.Core);
64   }
65
66   void enable(llvm::StringRef Ext, bool V = true) {
67     OptMap[Ext].Enabled = V;
68   }
69
70   /// \brief Enable or disable support for OpenCL extensions
71   /// \param Ext name of the extension optionally prefixed with
72   ///        '+' or '-'
73   /// \param V used when \p Ext is not prefixed by '+' or '-'
74   void support(llvm::StringRef Ext, bool V = true) {
75     assert(!Ext.empty() && "Extension is empty.");
76
77     switch (Ext[0]) {
78     case '+':
79       V = true;
80       Ext = Ext.drop_front();
81       break;
82     case '-':
83       V = false;
84       Ext = Ext.drop_front();
85       break;
86     }
87
88     if (Ext.equals("all")) {
89       supportAll(V);
90       return;
91     }
92     OptMap[Ext].Supported = V;
93   }
94
95   OpenCLOptions(){
96 #define OPENCLEXT_INTERNAL(Ext, AvailVer, CoreVer) \
97     OptMap[#Ext].Avail = AvailVer; \
98     OptMap[#Ext].Core = CoreVer;
99 #include "clang/Basic/OpenCLExtensions.def"
100   }
101
102   void addSupport(const OpenCLOptions &Opts) {
103     for (auto &I:Opts.OptMap)
104       if (I.second.Supported)
105         OptMap[I.getKey()].Supported = true;
106   }
107
108   void copy(const OpenCLOptions &Opts) {
109     OptMap = Opts.OptMap;
110   }
111
112   // Turn on or off support of all options.
113   void supportAll(bool On = true) {
114     for (llvm::StringMap<Info>::iterator I = OptMap.begin(),
115          E = OptMap.end(); I != E; ++I)
116       I->second.Supported = On;
117   }
118
119   void disableAll() {
120     for (llvm::StringMap<Info>::iterator I = OptMap.begin(),
121          E = OptMap.end(); I != E; ++I)
122       I->second.Enabled = false;
123   }
124
125   void enableSupportedCore(unsigned CLVer) {
126     for (llvm::StringMap<Info>::iterator I = OptMap.begin(),
127          E = OptMap.end(); I != E; ++I)
128       if (isSupportedCore(I->getKey(), CLVer))
129         I->second.Enabled = true;
130   }
131
132   friend class ASTWriter;
133   friend class ASTReader;
134 };
135
136 }  // end namespace clang
137
138 #endif