Home | History | Annotate | Line # | Download | only in Basic
      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 
     13 bool OpenCLOptions::isKnown(llvm::StringRef Ext) const {
     14   return OptMap.find(Ext) != OptMap.end();
     15 }
     16 
     17 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 
     29 bool OpenCLOptions::isEnabled(llvm::StringRef Ext) const {
     30   auto I = OptMap.find(Ext);
     31   return I != OptMap.end() && I->getValue().Enabled;
     32 }
     33 
     34 bool OpenCLOptions::isWithPragma(llvm::StringRef Ext) const {
     35   auto E = OptMap.find(Ext);
     36   return E != OptMap.end() && E->second.WithPragma;
     37 }
     38 
     39 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 
     46 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 
     53 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 
     60 bool OpenCLOptions::isSupportedCoreOrOptionalCore(llvm::StringRef Ext,
     61                                                   const LangOptions &LO) const {
     62   return isSupportedCore(Ext, LO) || isSupportedOptionalCore(Ext, LO);
     63 }
     64 
     65 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 
     73 void OpenCLOptions::enable(llvm::StringRef Ext, bool V) {
     74   OptMap[Ext].Enabled = V;
     75 }
     76 
     77 void OpenCLOptions::acceptsPragma(llvm::StringRef Ext, bool V) {
     78   OptMap[Ext].WithPragma = V;
     79 }
     80 
     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 
     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 
     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 
    102 void OpenCLOptions::disableAll() {
    103   for (auto &Opt : OptMap)
    104     Opt.getValue().Enabled = false;
    105 }
    106 
    107 } // end namespace clang
    108