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