17 {
"__opencl_c_read_write_images",
"__opencl_c_images"},
18 {
"__opencl_c_3d_image_writes",
"__opencl_c_images"},
19 {
"__opencl_c_pipes",
"__opencl_c_generic_address_space"},
20 {
"__opencl_c_device_enqueue",
"__opencl_c_generic_address_space"},
21 {
"__opencl_c_device_enqueue",
"__opencl_c_program_scope_global_variables"}};
25 {
"cl_khr_fp64",
"__opencl_c_fp64"},
26 {
"cl_khr_3d_image_writes",
"__opencl_c_3d_image_writes"}};
29 return OptMap.find(Ext) != OptMap.end();
37 auto &OptInfo = OptMap.find(Ext)->getValue();
38 if (OptInfo.isCoreIn(LO) || OptInfo.isOptionalCoreIn(LO))
41 return isEnabled(Ext);
44 bool OpenCLOptions::isEnabled(llvm::StringRef Ext)
const {
45 auto I = OptMap.find(Ext);
46 return I != OptMap.end() && I->getValue().Enabled;
50 auto E = OptMap.find(Ext);
51 return E != OptMap.end() && E->second.WithPragma;
56 auto I = OptMap.find(Ext);
57 return I != OptMap.end() && I->getValue().Supported &&
58 I->getValue().isAvailableIn(LO);
63 auto I = OptMap.find(Ext);
64 return I != OptMap.end() && I->getValue().Supported &&
65 I->getValue().isCoreIn(LO);
70 auto I = OptMap.find(Ext);
71 return I != OptMap.end() && I->getValue().Supported &&
72 I->getValue().isOptionalCoreIn(LO);
82 auto I = OptMap.find(Ext);
83 return I != OptMap.end() && I->getValue().Supported &&
84 I->getValue().isAvailableIn(LO) &&
89 OptMap[Ext].Enabled =
V;
93 OptMap[Ext].WithPragma =
V;
97 assert(!Ext.empty() &&
"Extension is empty.");
98 assert(Ext[0] !=
'+' && Ext[0] !=
'-');
99 OptMap[Ext].Supported =
V;
103 #define OPENCL_GENERIC_EXTENSION(Ext, ...) \
104 OptMap.insert_or_assign(#Ext, OpenCLOptionInfo{__VA_ARGS__});
105 #include "clang/Basic/OpenCLExtensions.def"
110 for (
const auto &F : FeaturesMap) {
111 const auto &Name = F.getKey();
112 if (F.getValue() &&
isKnown(Name) && OptMap[Name].isAvailableIn(Opts))
118 for (
auto &Opt : OptMap)
119 Opt.getValue().Enabled =
false;
128 auto Feature = FeaturePair.first;
129 auto Dep = FeaturePair.second;
133 Diags.
Report(diag::err_opencl_feature_requires) << Feature << Dep;
148 Diags.
Report(diag::err_opencl_extension_and_feature_differs)
149 << ExtAndFeat.first << ExtAndFeat.second;