1 //===--- OpenCLOptions.cpp---------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "clang/Basic/OpenCLOptions.h"
10
11 namespace clang {
12
isKnown(llvm::StringRef Ext) const13 bool OpenCLOptions::isKnown(llvm::StringRef Ext) const {
14 return OptMap.find(Ext) != OptMap.end();
15 }
16
isAvailableOption(llvm::StringRef Ext,const LangOptions & LO) const17 bool OpenCLOptions::isAvailableOption(llvm::StringRef Ext,
18 const LangOptions &LO) const {
19 if (!isKnown(Ext))
20 return false;
21
22 auto &OptInfo = OptMap.find(Ext)->getValue();
23 if (OptInfo.isCoreIn(LO) || OptInfo.isOptionalCoreIn(LO))
24 return isSupported(Ext, LO);
25
26 return isEnabled(Ext);
27 }
28
isEnabled(llvm::StringRef Ext) const29 bool OpenCLOptions::isEnabled(llvm::StringRef Ext) const {
30 auto I = OptMap.find(Ext);
31 return I != OptMap.end() && I->getValue().Enabled;
32 }
33
isWithPragma(llvm::StringRef Ext) const34 bool OpenCLOptions::isWithPragma(llvm::StringRef Ext) const {
35 auto E = OptMap.find(Ext);
36 return E != OptMap.end() && E->second.WithPragma;
37 }
38
isSupported(llvm::StringRef Ext,const LangOptions & LO) const39 bool OpenCLOptions::isSupported(llvm::StringRef Ext,
40 const LangOptions &LO) const {
41 auto I = OptMap.find(Ext);
42 return I != OptMap.end() && I->getValue().Supported &&
43 I->getValue().isAvailableIn(LO);
44 }
45
isSupportedCore(llvm::StringRef Ext,const LangOptions & LO) const46 bool OpenCLOptions::isSupportedCore(llvm::StringRef Ext,
47 const LangOptions &LO) const {
48 auto I = OptMap.find(Ext);
49 return I != OptMap.end() && I->getValue().Supported &&
50 I->getValue().isCoreIn(LO);
51 }
52
isSupportedOptionalCore(llvm::StringRef Ext,const LangOptions & LO) const53 bool OpenCLOptions::isSupportedOptionalCore(llvm::StringRef Ext,
54 const LangOptions &LO) const {
55 auto I = OptMap.find(Ext);
56 return I != OptMap.end() && I->getValue().Supported &&
57 I->getValue().isOptionalCoreIn(LO);
58 }
59
isSupportedCoreOrOptionalCore(llvm::StringRef Ext,const LangOptions & LO) const60 bool OpenCLOptions::isSupportedCoreOrOptionalCore(llvm::StringRef Ext,
61 const LangOptions &LO) const {
62 return isSupportedCore(Ext, LO) || isSupportedOptionalCore(Ext, LO);
63 }
64
isSupportedExtension(llvm::StringRef Ext,const LangOptions & LO) const65 bool OpenCLOptions::isSupportedExtension(llvm::StringRef Ext,
66 const LangOptions &LO) const {
67 auto I = OptMap.find(Ext);
68 return I != OptMap.end() && I->getValue().Supported &&
69 I->getValue().isAvailableIn(LO) &&
70 !isSupportedCoreOrOptionalCore(Ext, LO);
71 }
72
enable(llvm::StringRef Ext,bool V)73 void OpenCLOptions::enable(llvm::StringRef Ext, bool V) {
74 OptMap[Ext].Enabled = V;
75 }
76
acceptsPragma(llvm::StringRef Ext,bool V)77 void OpenCLOptions::acceptsPragma(llvm::StringRef Ext, bool V) {
78 OptMap[Ext].WithPragma = V;
79 }
80
support(llvm::StringRef Ext,bool V)81 void OpenCLOptions::support(llvm::StringRef Ext, bool V) {
82 assert(!Ext.empty() && "Extension is empty.");
83 assert(Ext[0] != '+' && Ext[0] != '-');
84 OptMap[Ext].Supported = V;
85 }
86
OpenCLOptions()87 OpenCLOptions::OpenCLOptions() {
88 #define OPENCL_GENERIC_EXTENSION(Ext, ...) \
89 OptMap.insert_or_assign(#Ext, OpenCLOptionInfo{__VA_ARGS__});
90 #include "clang/Basic/OpenCLExtensions.def"
91 }
92
addSupport(const llvm::StringMap<bool> & FeaturesMap,const LangOptions & Opts)93 void OpenCLOptions::addSupport(const llvm::StringMap<bool> &FeaturesMap,
94 const LangOptions &Opts) {
95 for (const auto &F : FeaturesMap) {
96 const auto &Name = F.getKey();
97 if (F.getValue() && isKnown(Name) && OptMap[Name].isAvailableIn(Opts))
98 support(Name);
99 }
100 }
101
disableAll()102 void OpenCLOptions::disableAll() {
103 for (auto &Opt : OptMap)
104 Opt.getValue().Enabled = false;
105 }
106
107 } // end namespace clang
108