Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===--- LangStandard.h -----------------------------------------*- 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. #ifndef LLVM_CLANG_BASIC_LANGSTANDARD_H
  10. #define LLVM_CLANG_BASIC_LANGSTANDARD_H
  11.  
  12. #include "clang/Basic/LLVM.h"
  13. #include "llvm/ADT/StringRef.h"
  14.  
  15. namespace llvm {
  16. class Triple;
  17. }
  18.  
  19. namespace clang {
  20.  
  21. /// The language for the input, used to select and validate the language
  22. /// standard and possible actions.
  23. enum class Language : uint8_t {
  24.   Unknown,
  25.  
  26.   /// Assembly: we accept this only so that we can preprocess it.
  27.   Asm,
  28.  
  29.   /// LLVM IR: we accept this so that we can run the optimizer on it,
  30.   /// and compile it to assembly or object code.
  31.   LLVM_IR,
  32.  
  33.   ///@{ Languages that the frontend can parse and compile.
  34.   C,
  35.   CXX,
  36.   ObjC,
  37.   ObjCXX,
  38.   OpenCL,
  39.   OpenCLCXX,
  40.   CUDA,
  41.   RenderScript,
  42.   HIP,
  43.   HLSL,
  44.   ///@}
  45. };
  46.  
  47. enum LangFeatures {
  48.   LineComment = (1 << 0),
  49.   C99 = (1 << 1),
  50.   C11 = (1 << 2),
  51.   C17 = (1 << 3),
  52.   C2x = (1 << 4),
  53.   CPlusPlus = (1 << 5),
  54.   CPlusPlus11 = (1 << 6),
  55.   CPlusPlus14 = (1 << 7),
  56.   CPlusPlus17 = (1 << 8),
  57.   CPlusPlus20 = (1 << 9),
  58.   CPlusPlus2b = (1 << 10),
  59.   Digraphs = (1 << 11),
  60.   GNUMode = (1 << 12),
  61.   HexFloat = (1 << 13),
  62.   OpenCL = (1 << 14),
  63.   HLSL = (1 << 15)
  64. };
  65.  
  66. /// LangStandard - Information about the properties of a particular language
  67. /// standard.
  68. struct LangStandard {
  69.   enum Kind {
  70. #define LANGSTANDARD(id, name, lang, desc, features) \
  71.     lang_##id,
  72. #include "clang/Basic/LangStandards.def"
  73.     lang_unspecified
  74.   };
  75.  
  76.   const char *ShortName;
  77.   const char *Description;
  78.   unsigned Flags;
  79.   clang::Language Language;
  80.  
  81. public:
  82.   /// getName - Get the name of this standard.
  83.   const char *getName() const { return ShortName; }
  84.  
  85.   /// getDescription - Get the description of this standard.
  86.   const char *getDescription() const { return Description; }
  87.  
  88.   /// Get the language that this standard describes.
  89.   clang::Language getLanguage() const { return Language; }
  90.  
  91.   /// Language supports '//' comments.
  92.   bool hasLineComments() const { return Flags & LineComment; }
  93.  
  94.   /// isC99 - Language is a superset of C99.
  95.   bool isC99() const { return Flags & C99; }
  96.  
  97.   /// isC11 - Language is a superset of C11.
  98.   bool isC11() const { return Flags & C11; }
  99.  
  100.   /// isC17 - Language is a superset of C17.
  101.   bool isC17() const { return Flags & C17; }
  102.  
  103.   /// isC2x - Language is a superset of C2x.
  104.   bool isC2x() const { return Flags & C2x; }
  105.  
  106.   /// isCPlusPlus - Language is a C++ variant.
  107.   bool isCPlusPlus() const { return Flags & CPlusPlus; }
  108.  
  109.   /// isCPlusPlus11 - Language is a C++11 variant (or later).
  110.   bool isCPlusPlus11() const { return Flags & CPlusPlus11; }
  111.  
  112.   /// isCPlusPlus14 - Language is a C++14 variant (or later).
  113.   bool isCPlusPlus14() const { return Flags & CPlusPlus14; }
  114.  
  115.   /// isCPlusPlus17 - Language is a C++17 variant (or later).
  116.   bool isCPlusPlus17() const { return Flags & CPlusPlus17; }
  117.  
  118.   /// isCPlusPlus20 - Language is a C++20 variant (or later).
  119.   bool isCPlusPlus20() const { return Flags & CPlusPlus20; }
  120.  
  121.   /// isCPlusPlus2b - Language is a post-C++20 variant (or later).
  122.   bool isCPlusPlus2b() const { return Flags & CPlusPlus2b; }
  123.  
  124.   /// hasDigraphs - Language supports digraphs.
  125.   bool hasDigraphs() const { return Flags & Digraphs; }
  126.  
  127.   /// isGNUMode - Language includes GNU extensions.
  128.   bool isGNUMode() const { return Flags & GNUMode; }
  129.  
  130.   /// hasHexFloats - Language supports hexadecimal float constants.
  131.   bool hasHexFloats() const { return Flags & HexFloat; }
  132.  
  133.   /// isOpenCL - Language is a OpenCL variant.
  134.   bool isOpenCL() const { return Flags & OpenCL; }
  135.  
  136.   static Kind getLangKind(StringRef Name);
  137.   static const LangStandard &getLangStandardForKind(Kind K);
  138.   static const LangStandard *getLangStandardForName(StringRef Name);
  139. };
  140.  
  141. LangStandard::Kind getDefaultLanguageStandard(clang::Language Lang,
  142.                                               const llvm::Triple &T);
  143.  
  144. }  // end namespace clang
  145.  
  146. #endif
  147.