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 
languageToString(Language L)16*5f757f3fSDimitry Andric StringRef clang::languageToString(Language L) {
17*5f757f3fSDimitry Andric   switch (L) {
18*5f757f3fSDimitry Andric   case Language::Unknown:
19*5f757f3fSDimitry Andric     return "Unknown";
20*5f757f3fSDimitry Andric   case Language::Asm:
21*5f757f3fSDimitry Andric     return "Asm";
22*5f757f3fSDimitry Andric   case Language::LLVM_IR:
23*5f757f3fSDimitry Andric     return "LLVM IR";
24*5f757f3fSDimitry Andric   case Language::C:
25*5f757f3fSDimitry Andric     return "C";
26*5f757f3fSDimitry Andric   case Language::CXX:
27*5f757f3fSDimitry Andric     return "C++";
28*5f757f3fSDimitry Andric   case Language::ObjC:
29*5f757f3fSDimitry Andric     return "Objective-C";
30*5f757f3fSDimitry Andric   case Language::ObjCXX:
31*5f757f3fSDimitry Andric     return "Objective-C++";
32*5f757f3fSDimitry Andric   case Language::OpenCL:
33*5f757f3fSDimitry Andric     return "OpenCL";
34*5f757f3fSDimitry Andric   case Language::OpenCLCXX:
35*5f757f3fSDimitry Andric     return "OpenCLC++";
36*5f757f3fSDimitry Andric   case Language::CUDA:
37*5f757f3fSDimitry Andric     return "CUDA";
38*5f757f3fSDimitry Andric   case Language::RenderScript:
39*5f757f3fSDimitry Andric     return "RenderScript";
40*5f757f3fSDimitry Andric   case Language::HIP:
41*5f757f3fSDimitry Andric     return "HIP";
42*5f757f3fSDimitry Andric   case Language::HLSL:
43*5f757f3fSDimitry Andric     return "HLSL";
44*5f757f3fSDimitry Andric   }
45*5f757f3fSDimitry Andric 
46*5f757f3fSDimitry Andric   llvm_unreachable("unhandled language kind");
47*5f757f3fSDimitry Andric }
48*5f757f3fSDimitry Andric 
49a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features)                           \
50a7dea167SDimitry Andric   static const LangStandard Lang_##id = {name, desc, features, Language::lang};
51a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def"
52a7dea167SDimitry Andric 
getLangStandardForKind(Kind K)53a7dea167SDimitry Andric const LangStandard &LangStandard::getLangStandardForKind(Kind K) {
54a7dea167SDimitry Andric   switch (K) {
55a7dea167SDimitry Andric   case lang_unspecified:
56a7dea167SDimitry Andric     llvm::report_fatal_error("getLangStandardForKind() on unspecified kind");
57a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) \
58a7dea167SDimitry Andric     case lang_##id: return Lang_##id;
59a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def"
60a7dea167SDimitry Andric   }
61a7dea167SDimitry Andric   llvm_unreachable("Invalid language kind!");
62a7dea167SDimitry Andric }
63a7dea167SDimitry Andric 
getLangKind(StringRef Name)64a7dea167SDimitry Andric LangStandard::Kind LangStandard::getLangKind(StringRef Name) {
65a7dea167SDimitry Andric   return llvm::StringSwitch<Kind>(Name)
66a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id)
67a7dea167SDimitry Andric #define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id)
68a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def"
69a7dea167SDimitry Andric       .Default(lang_unspecified);
70a7dea167SDimitry Andric }
71a7dea167SDimitry Andric 
getLangStandardForName(StringRef Name)72a7dea167SDimitry Andric const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {
73a7dea167SDimitry Andric   Kind K = getLangKind(Name);
74a7dea167SDimitry Andric   if (K == lang_unspecified)
75a7dea167SDimitry Andric     return nullptr;
76a7dea167SDimitry Andric 
77a7dea167SDimitry Andric   return &getLangStandardForKind(K);
78a7dea167SDimitry Andric }
79a7dea167SDimitry Andric 
getDefaultLanguageStandard(clang::Language Lang,const llvm::Triple & T)8081ad6265SDimitry Andric LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,
8181ad6265SDimitry Andric                                                      const llvm::Triple &T) {
8281ad6265SDimitry Andric   switch (Lang) {
8381ad6265SDimitry Andric   case Language::Unknown:
8481ad6265SDimitry Andric   case Language::LLVM_IR:
8581ad6265SDimitry Andric     llvm_unreachable("Invalid input kind!");
8681ad6265SDimitry Andric   case Language::OpenCL:
8781ad6265SDimitry Andric     return LangStandard::lang_opencl12;
8881ad6265SDimitry Andric   case Language::OpenCLCXX:
8981ad6265SDimitry Andric     return LangStandard::lang_openclcpp10;
9081ad6265SDimitry Andric   case Language::Asm:
9181ad6265SDimitry Andric   case Language::C:
92753f127fSDimitry Andric     // The PS4 uses C99 as the default C standard.
93753f127fSDimitry Andric     if (T.isPS4())
9481ad6265SDimitry Andric       return LangStandard::lang_gnu99;
9581ad6265SDimitry Andric     return LangStandard::lang_gnu17;
9681ad6265SDimitry Andric   case Language::ObjC:
9781ad6265SDimitry Andric     return LangStandard::lang_gnu11;
9881ad6265SDimitry Andric   case Language::CXX:
9981ad6265SDimitry Andric   case Language::ObjCXX:
10006c3fb27SDimitry Andric   case Language::CUDA:
10106c3fb27SDimitry Andric   case Language::HIP:
102bdd1243dSDimitry Andric     return LangStandard::lang_gnucxx17;
10381ad6265SDimitry Andric   case Language::RenderScript:
10481ad6265SDimitry Andric     return LangStandard::lang_c99;
10581ad6265SDimitry Andric   case Language::HLSL:
10681ad6265SDimitry Andric     return LangStandard::lang_hlsl2021;
10781ad6265SDimitry Andric   }
10881ad6265SDimitry Andric   llvm_unreachable("unhandled Language kind!");
10981ad6265SDimitry Andric }
110