clang  6.0.0svn
OpenCLOptions.h
Go to the documentation of this file.
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
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 
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
void support(llvm::StringRef Ext, bool V=true)
Enable or disable support for OpenCL extensions.
Definition: OpenCLOptions.h:74
bool isSupportedCore(llvm::StringRef Ext, unsigned CLVer) const
Definition: OpenCLOptions.h:52
OpenCL supported extensions and optional core features.
Definition: OpenCLOptions.h:23
void copy(const OpenCLOptions &Opts)
void enableSupportedCore(unsigned CLVer)
void supportAll(bool On=true)
bool isEnabled(llvm::StringRef Ext) const
Definition: OpenCLOptions.h:39
bool isSupportedExtension(llvm::StringRef Ext, unsigned CLVer) const
Definition: OpenCLOptions.h:60
void enable(llvm::StringRef Ext, bool V=true)
Definition: OpenCLOptions.h:66
bool isSupported(llvm::StringRef Ext, unsigned CLVer) const
Definition: OpenCLOptions.h:45
bool isKnown(llvm::StringRef Ext) const
Definition: OpenCLOptions.h:35
void addSupport(const OpenCLOptions &Opts)
Dataflow Directional Tag Classes.
Reads an AST files chain containing the contents of a translation unit.
Definition: ASTReader.h:358
Writes an AST file containing the contents of a translation unit.
Definition: ASTWriter.h:104