xref: /freebsd-src/contrib/llvm-project/clang/lib/Basic/LangStandards.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1a7dea167SDimitry Andric //===--- LangStandards.cpp - Language Standard Definitions ----------------===//
2a7dea167SDimitry Andric //
3a7dea167SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4a7dea167SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5a7dea167SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6a7dea167SDimitry Andric //
7a7dea167SDimitry Andric //===----------------------------------------------------------------------===//
8a7dea167SDimitry Andric 
9a7dea167SDimitry Andric #include "clang/Basic/LangStandard.h"
1081ad6265SDimitry Andric #include "clang/Config/config.h"
11a7dea167SDimitry Andric #include "llvm/ADT/StringSwitch.h"
12a7dea167SDimitry Andric #include "llvm/Support/ErrorHandling.h"
1306c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
14a7dea167SDimitry Andric using namespace clang;
15a7dea167SDimitry Andric 
165f757f3fSDimitry Andric StringRef clang::languageToString(Language L) {
175f757f3fSDimitry Andric   switch (L) {
185f757f3fSDimitry Andric   case Language::Unknown:
195f757f3fSDimitry Andric     return "Unknown";
205f757f3fSDimitry Andric   case Language::Asm:
215f757f3fSDimitry Andric     return "Asm";
225f757f3fSDimitry Andric   case Language::LLVM_IR:
235f757f3fSDimitry Andric     return "LLVM IR";
24*0fca6ea1SDimitry Andric   case Language::CIR:
25*0fca6ea1SDimitry Andric     return "ClangIR";
265f757f3fSDimitry Andric   case Language::C:
275f757f3fSDimitry Andric     return "C";
285f757f3fSDimitry Andric   case Language::CXX:
295f757f3fSDimitry Andric     return "C++";
305f757f3fSDimitry Andric   case Language::ObjC:
315f757f3fSDimitry Andric     return "Objective-C";
325f757f3fSDimitry Andric   case Language::ObjCXX:
335f757f3fSDimitry Andric     return "Objective-C++";
345f757f3fSDimitry Andric   case Language::OpenCL:
355f757f3fSDimitry Andric     return "OpenCL";
365f757f3fSDimitry Andric   case Language::OpenCLCXX:
375f757f3fSDimitry Andric     return "OpenCLC++";
385f757f3fSDimitry Andric   case Language::CUDA:
395f757f3fSDimitry Andric     return "CUDA";
405f757f3fSDimitry Andric   case Language::RenderScript:
415f757f3fSDimitry Andric     return "RenderScript";
425f757f3fSDimitry Andric   case Language::HIP:
435f757f3fSDimitry Andric     return "HIP";
445f757f3fSDimitry Andric   case Language::HLSL:
455f757f3fSDimitry Andric     return "HLSL";
465f757f3fSDimitry Andric   }
475f757f3fSDimitry Andric 
485f757f3fSDimitry Andric   llvm_unreachable("unhandled language kind");
495f757f3fSDimitry Andric }
505f757f3fSDimitry Andric 
51a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features)                           \
52a7dea167SDimitry Andric   static const LangStandard Lang_##id = {name, desc, features, Language::lang};
53a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def"
54a7dea167SDimitry Andric 
55a7dea167SDimitry Andric const LangStandard &LangStandard::getLangStandardForKind(Kind K) {
56a7dea167SDimitry Andric   switch (K) {
57a7dea167SDimitry Andric   case lang_unspecified:
58a7dea167SDimitry Andric     llvm::report_fatal_error("getLangStandardForKind() on unspecified kind");
59a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) \
60a7dea167SDimitry Andric     case lang_##id: return Lang_##id;
61a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def"
62a7dea167SDimitry Andric   }
63a7dea167SDimitry Andric   llvm_unreachable("Invalid language kind!");
64a7dea167SDimitry Andric }
65a7dea167SDimitry Andric 
66a7dea167SDimitry Andric LangStandard::Kind LangStandard::getLangKind(StringRef Name) {
67a7dea167SDimitry Andric   return llvm::StringSwitch<Kind>(Name)
68a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id)
69a7dea167SDimitry Andric #define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id)
70a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def"
71a7dea167SDimitry Andric       .Default(lang_unspecified);
72a7dea167SDimitry Andric }
73a7dea167SDimitry Andric 
74*0fca6ea1SDimitry Andric LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) {
75*0fca6ea1SDimitry Andric   return llvm::StringSwitch<LangStandard::Kind>(Name)
76*0fca6ea1SDimitry Andric       .Case("2016", LangStandard::lang_hlsl2016)
77*0fca6ea1SDimitry Andric       .Case("2017", LangStandard::lang_hlsl2017)
78*0fca6ea1SDimitry Andric       .Case("2018", LangStandard::lang_hlsl2018)
79*0fca6ea1SDimitry Andric       .Case("2021", LangStandard::lang_hlsl2021)
80*0fca6ea1SDimitry Andric       .Case("202x", LangStandard::lang_hlsl202x)
81*0fca6ea1SDimitry Andric       .Default(LangStandard::lang_unspecified);
82*0fca6ea1SDimitry Andric }
83*0fca6ea1SDimitry Andric 
84a7dea167SDimitry Andric const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {
85a7dea167SDimitry Andric   Kind K = getLangKind(Name);
86a7dea167SDimitry Andric   if (K == lang_unspecified)
87a7dea167SDimitry Andric     return nullptr;
88a7dea167SDimitry Andric 
89a7dea167SDimitry Andric   return &getLangStandardForKind(K);
90a7dea167SDimitry Andric }
91a7dea167SDimitry Andric 
9281ad6265SDimitry Andric LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,
9381ad6265SDimitry Andric                                                      const llvm::Triple &T) {
9481ad6265SDimitry Andric   switch (Lang) {
9581ad6265SDimitry Andric   case Language::Unknown:
9681ad6265SDimitry Andric   case Language::LLVM_IR:
97*0fca6ea1SDimitry Andric   case Language::CIR:
9881ad6265SDimitry Andric     llvm_unreachable("Invalid input kind!");
9981ad6265SDimitry Andric   case Language::OpenCL:
10081ad6265SDimitry Andric     return LangStandard::lang_opencl12;
10181ad6265SDimitry Andric   case Language::OpenCLCXX:
10281ad6265SDimitry Andric     return LangStandard::lang_openclcpp10;
10381ad6265SDimitry Andric   case Language::Asm:
10481ad6265SDimitry Andric   case Language::C:
105753f127fSDimitry Andric     // The PS4 uses C99 as the default C standard.
106753f127fSDimitry Andric     if (T.isPS4())
10781ad6265SDimitry Andric       return LangStandard::lang_gnu99;
10881ad6265SDimitry Andric     return LangStandard::lang_gnu17;
10981ad6265SDimitry Andric   case Language::ObjC:
11081ad6265SDimitry Andric     return LangStandard::lang_gnu11;
11181ad6265SDimitry Andric   case Language::CXX:
11281ad6265SDimitry Andric   case Language::ObjCXX:
11306c3fb27SDimitry Andric   case Language::CUDA:
11406c3fb27SDimitry Andric   case Language::HIP:
115bdd1243dSDimitry Andric     return LangStandard::lang_gnucxx17;
11681ad6265SDimitry Andric   case Language::RenderScript:
11781ad6265SDimitry Andric     return LangStandard::lang_c99;
11881ad6265SDimitry Andric   case Language::HLSL:
11981ad6265SDimitry Andric     return LangStandard::lang_hlsl2021;
12081ad6265SDimitry Andric   }
12181ad6265SDimitry Andric   llvm_unreachable("unhandled Language kind!");
12281ad6265SDimitry Andric }
123