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