123 lines · cpp
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-exception6//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::CIR:25 return "ClangIR";26 case Language::C:27 return "C";28 case Language::CXX:29 return "C++";30 case Language::ObjC:31 return "Objective-C";32 case Language::ObjCXX:33 return "Objective-C++";34 case Language::OpenCL:35 return "OpenCL";36 case Language::OpenCLCXX:37 return "OpenCLC++";38 case Language::CUDA:39 return "CUDA";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, version) \50 static const LangStandard Lang_##id = {name, desc, features, Language::lang, \51 version};52#include "clang/Basic/LangStandards.def"53 54const LangStandard &LangStandard::getLangStandardForKind(Kind K) {55 switch (K) {56 case lang_unspecified:57 llvm::report_fatal_error("getLangStandardForKind() on unspecified kind");58#define LANGSTANDARD(id, name, lang, desc, features, version) \59 case lang_##id: \60 return Lang_##id;61#include "clang/Basic/LangStandards.def"62 }63 llvm_unreachable("Invalid language kind!");64}65 66LangStandard::Kind LangStandard::getLangKind(StringRef Name) {67 return llvm::StringSwitch<Kind>(Name)68#define LANGSTANDARD(id, name, lang, desc, features, version) \69 .Case(name, lang_##id)70#define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id)71#include "clang/Basic/LangStandards.def"72 .Default(lang_unspecified);73}74 75LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) {76 return llvm::StringSwitch<LangStandard::Kind>(Name)77 .Case("2016", LangStandard::lang_hlsl2016)78 .Case("2017", LangStandard::lang_hlsl2017)79 .Case("2018", LangStandard::lang_hlsl2018)80 .Case("2021", LangStandard::lang_hlsl2021)81 .Case("202x", LangStandard::lang_hlsl202x)82 .Case("202y", LangStandard::lang_hlsl202y)83 .Default(LangStandard::lang_unspecified);84}85 86const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {87 Kind K = getLangKind(Name);88 if (K == lang_unspecified)89 return nullptr;90 91 return &getLangStandardForKind(K);92}93 94LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,95 const llvm::Triple &T) {96 switch (Lang) {97 case Language::Unknown:98 case Language::LLVM_IR:99 case Language::CIR:100 llvm_unreachable("Invalid input kind!");101 case Language::OpenCL:102 return LangStandard::lang_opencl12;103 case Language::OpenCLCXX:104 return LangStandard::lang_openclcpp10;105 case Language::Asm:106 case Language::C:107 // The PS4 uses C99 as the default C standard.108 if (T.isPS4())109 return LangStandard::lang_gnu99;110 return LangStandard::lang_gnu17;111 case Language::ObjC:112 return LangStandard::lang_gnu11;113 case Language::CXX:114 case Language::ObjCXX:115 case Language::CUDA:116 case Language::HIP:117 return LangStandard::lang_gnucxx17;118 case Language::HLSL:119 return LangStandard::lang_hlsl202x;120 }121 llvm_unreachable("unhandled Language kind!");122}123