1e5dd7070Spatrick //===--- LangStandards.cpp - Language Standard Definitions ----------------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick 
9e5dd7070Spatrick #include "clang/Basic/LangStandard.h"
10*12c85518Srobert #include "clang/Config/config.h"
11e5dd7070Spatrick #include "llvm/ADT/StringSwitch.h"
12*12c85518Srobert #include "llvm/ADT/Triple.h"
13e5dd7070Spatrick #include "llvm/Support/ErrorHandling.h"
14e5dd7070Spatrick using namespace clang;
15e5dd7070Spatrick 
16e5dd7070Spatrick #define LANGSTANDARD(id, name, lang, desc, features)                           \
17e5dd7070Spatrick   static const LangStandard Lang_##id = {name, desc, features, Language::lang};
18e5dd7070Spatrick #include "clang/Basic/LangStandards.def"
19e5dd7070Spatrick 
getLangStandardForKind(Kind K)20e5dd7070Spatrick const LangStandard &LangStandard::getLangStandardForKind(Kind K) {
21e5dd7070Spatrick   switch (K) {
22e5dd7070Spatrick   case lang_unspecified:
23e5dd7070Spatrick     llvm::report_fatal_error("getLangStandardForKind() on unspecified kind");
24e5dd7070Spatrick #define LANGSTANDARD(id, name, lang, desc, features) \
25e5dd7070Spatrick     case lang_##id: return Lang_##id;
26e5dd7070Spatrick #include "clang/Basic/LangStandards.def"
27e5dd7070Spatrick   }
28e5dd7070Spatrick   llvm_unreachable("Invalid language kind!");
29e5dd7070Spatrick }
30e5dd7070Spatrick 
getLangKind(StringRef Name)31e5dd7070Spatrick LangStandard::Kind LangStandard::getLangKind(StringRef Name) {
32e5dd7070Spatrick   return llvm::StringSwitch<Kind>(Name)
33e5dd7070Spatrick #define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id)
34e5dd7070Spatrick #define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id)
35e5dd7070Spatrick #include "clang/Basic/LangStandards.def"
36e5dd7070Spatrick       .Default(lang_unspecified);
37e5dd7070Spatrick }
38e5dd7070Spatrick 
getLangStandardForName(StringRef Name)39e5dd7070Spatrick const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {
40e5dd7070Spatrick   Kind K = getLangKind(Name);
41e5dd7070Spatrick   if (K == lang_unspecified)
42e5dd7070Spatrick     return nullptr;
43e5dd7070Spatrick 
44e5dd7070Spatrick   return &getLangStandardForKind(K);
45e5dd7070Spatrick }
46e5dd7070Spatrick 
getDefaultLanguageStandard(clang::Language Lang,const llvm::Triple & T)47*12c85518Srobert LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,
48*12c85518Srobert                                                      const llvm::Triple &T) {
49*12c85518Srobert   switch (Lang) {
50*12c85518Srobert   case Language::Unknown:
51*12c85518Srobert   case Language::LLVM_IR:
52*12c85518Srobert     llvm_unreachable("Invalid input kind!");
53*12c85518Srobert   case Language::OpenCL:
54*12c85518Srobert     return LangStandard::lang_opencl12;
55*12c85518Srobert   case Language::OpenCLCXX:
56*12c85518Srobert     return LangStandard::lang_openclcpp10;
57*12c85518Srobert   case Language::CUDA:
58*12c85518Srobert     return LangStandard::lang_cuda;
59*12c85518Srobert   case Language::Asm:
60*12c85518Srobert   case Language::C:
61*12c85518Srobert     // The PS4 uses C99 as the default C standard.
62*12c85518Srobert     if (T.isPS4())
63*12c85518Srobert       return LangStandard::lang_gnu99;
64*12c85518Srobert     return LangStandard::lang_gnu17;
65*12c85518Srobert   case Language::ObjC:
66*12c85518Srobert     return LangStandard::lang_gnu11;
67*12c85518Srobert   case Language::CXX:
68*12c85518Srobert   case Language::ObjCXX:
69*12c85518Srobert     if (T.isPS())
70*12c85518Srobert       return LangStandard::lang_gnucxx14;
71*12c85518Srobert     return LangStandard::lang_gnucxx17;
72*12c85518Srobert   case Language::RenderScript:
73*12c85518Srobert     return LangStandard::lang_c99;
74*12c85518Srobert   case Language::HIP:
75*12c85518Srobert     return LangStandard::lang_hip;
76*12c85518Srobert   case Language::HLSL:
77*12c85518Srobert     return LangStandard::lang_hlsl2021;
78*12c85518Srobert   }
79*12c85518Srobert   llvm_unreachable("unhandled Language kind!");
80*12c85518Srobert }
81