xref: /llvm-project/clang/lib/Basic/LangStandards.cpp (revision af7c58b7ea853ef34462ce97739203e2da3c5894)
109d890d7SRainer Orth //===--- LangStandards.cpp - Language Standard Definitions ----------------===//
209d890d7SRainer Orth //
309d890d7SRainer Orth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409d890d7SRainer Orth // See https://llvm.org/LICENSE.txt for license information.
509d890d7SRainer Orth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609d890d7SRainer Orth //
709d890d7SRainer Orth //===----------------------------------------------------------------------===//
809d890d7SRainer Orth 
909d890d7SRainer Orth #include "clang/Basic/LangStandard.h"
102e270947SCassie Jones #include "clang/Config/config.h"
1109d890d7SRainer Orth #include "llvm/ADT/StringSwitch.h"
1209d890d7SRainer Orth #include "llvm/Support/ErrorHandling.h"
1362c7f035SArchibald Elliott #include "llvm/TargetParser/Triple.h"
1409d890d7SRainer Orth using namespace clang;
1509d890d7SRainer Orth 
16703895b1SYusra Syeda StringRef clang::languageToString(Language L) {
17703895b1SYusra Syeda   switch (L) {
18703895b1SYusra Syeda   case Language::Unknown:
19703895b1SYusra Syeda     return "Unknown";
20703895b1SYusra Syeda   case Language::Asm:
21703895b1SYusra Syeda     return "Asm";
22703895b1SYusra Syeda   case Language::LLVM_IR:
23703895b1SYusra Syeda     return "LLVM IR";
24e66b670fSNathan Lanza   case Language::CIR:
25e66b670fSNathan Lanza     return "ClangIR";
26703895b1SYusra Syeda   case Language::C:
27703895b1SYusra Syeda     return "C";
28703895b1SYusra Syeda   case Language::CXX:
29703895b1SYusra Syeda     return "C++";
30703895b1SYusra Syeda   case Language::ObjC:
31703895b1SYusra Syeda     return "Objective-C";
32703895b1SYusra Syeda   case Language::ObjCXX:
33703895b1SYusra Syeda     return "Objective-C++";
34703895b1SYusra Syeda   case Language::OpenCL:
35703895b1SYusra Syeda     return "OpenCL";
36703895b1SYusra Syeda   case Language::OpenCLCXX:
37703895b1SYusra Syeda     return "OpenCLC++";
38703895b1SYusra Syeda   case Language::CUDA:
39703895b1SYusra Syeda     return "CUDA";
40703895b1SYusra Syeda   case Language::HIP:
41703895b1SYusra Syeda     return "HIP";
42703895b1SYusra Syeda   case Language::HLSL:
43703895b1SYusra Syeda     return "HLSL";
44703895b1SYusra Syeda   }
45703895b1SYusra Syeda 
46703895b1SYusra Syeda   llvm_unreachable("unhandled language kind");
47703895b1SYusra Syeda }
48703895b1SYusra Syeda 
4909d890d7SRainer Orth #define LANGSTANDARD(id, name, lang, desc, features)                           \
5009d890d7SRainer Orth   static const LangStandard Lang_##id = {name, desc, features, Language::lang};
5109d890d7SRainer Orth #include "clang/Basic/LangStandards.def"
5209d890d7SRainer Orth 
5309d890d7SRainer Orth const LangStandard &LangStandard::getLangStandardForKind(Kind K) {
5409d890d7SRainer Orth   switch (K) {
5509d890d7SRainer Orth   case lang_unspecified:
5609d890d7SRainer Orth     llvm::report_fatal_error("getLangStandardForKind() on unspecified kind");
5709d890d7SRainer Orth #define LANGSTANDARD(id, name, lang, desc, features) \
5809d890d7SRainer Orth     case lang_##id: return Lang_##id;
5909d890d7SRainer Orth #include "clang/Basic/LangStandards.def"
6009d890d7SRainer Orth   }
6109d890d7SRainer Orth   llvm_unreachable("Invalid language kind!");
6209d890d7SRainer Orth }
6309d890d7SRainer Orth 
6409d890d7SRainer Orth LangStandard::Kind LangStandard::getLangKind(StringRef Name) {
6509d890d7SRainer Orth   return llvm::StringSwitch<Kind>(Name)
6609d890d7SRainer Orth #define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id)
6709d890d7SRainer Orth #define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id)
6809d890d7SRainer Orth #include "clang/Basic/LangStandards.def"
6909d890d7SRainer Orth       .Default(lang_unspecified);
7009d890d7SRainer Orth }
7109d890d7SRainer Orth 
72162180deSJoshua Batista LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) {
73162180deSJoshua Batista   return llvm::StringSwitch<LangStandard::Kind>(Name)
74162180deSJoshua Batista       .Case("2016", LangStandard::lang_hlsl2016)
75162180deSJoshua Batista       .Case("2017", LangStandard::lang_hlsl2017)
76162180deSJoshua Batista       .Case("2018", LangStandard::lang_hlsl2018)
77162180deSJoshua Batista       .Case("2021", LangStandard::lang_hlsl2021)
78162180deSJoshua Batista       .Case("202x", LangStandard::lang_hlsl202x)
792222e27dSChris B       .Case("202y", LangStandard::lang_hlsl202y)
80162180deSJoshua Batista       .Default(LangStandard::lang_unspecified);
81162180deSJoshua Batista }
82162180deSJoshua Batista 
8309d890d7SRainer Orth const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {
8409d890d7SRainer Orth   Kind K = getLangKind(Name);
8509d890d7SRainer Orth   if (K == lang_unspecified)
8609d890d7SRainer Orth     return nullptr;
8709d890d7SRainer Orth 
8809d890d7SRainer Orth   return &getLangStandardForKind(K);
8909d890d7SRainer Orth }
9009d890d7SRainer Orth 
9193471e65SHaojian Wu LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,
9293471e65SHaojian Wu                                                      const llvm::Triple &T) {
9393471e65SHaojian Wu   switch (Lang) {
9493471e65SHaojian Wu   case Language::Unknown:
9593471e65SHaojian Wu   case Language::LLVM_IR:
96e66b670fSNathan Lanza   case Language::CIR:
9793471e65SHaojian Wu     llvm_unreachable("Invalid input kind!");
9893471e65SHaojian Wu   case Language::OpenCL:
9993471e65SHaojian Wu     return LangStandard::lang_opencl12;
10093471e65SHaojian Wu   case Language::OpenCLCXX:
10193471e65SHaojian Wu     return LangStandard::lang_openclcpp10;
10293471e65SHaojian Wu   case Language::Asm:
10393471e65SHaojian Wu   case Language::C:
104a844378bSSunil Srivastava     // The PS4 uses C99 as the default C standard.
105a844378bSSunil Srivastava     if (T.isPS4())
10693471e65SHaojian Wu       return LangStandard::lang_gnu99;
10793471e65SHaojian Wu     return LangStandard::lang_gnu17;
10893471e65SHaojian Wu   case Language::ObjC:
10993471e65SHaojian Wu     return LangStandard::lang_gnu11;
11093471e65SHaojian Wu   case Language::CXX:
11193471e65SHaojian Wu   case Language::ObjCXX:
1128ef04488SYaxun (Sam) Liu   case Language::CUDA:
1138ef04488SYaxun (Sam) Liu   case Language::HIP:
1143e99b8d9SFangrui Song     return LangStandard::lang_gnucxx17;
11593471e65SHaojian Wu   case Language::HLSL:
116*48864038SChris B     return LangStandard::lang_hlsl202x;
11793471e65SHaojian Wu   }
11893471e65SHaojian Wu   llvm_unreachable("unhandled Language kind!");
11993471e65SHaojian Wu }
120