Path: blob/main/contrib/llvm-project/clang/lib/Basic/LangStandards.cpp
35233 views
//===--- LangStandards.cpp - Language Standard Definitions ----------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "clang/Basic/LangStandard.h"9#include "clang/Config/config.h"10#include "llvm/ADT/StringSwitch.h"11#include "llvm/Support/ErrorHandling.h"12#include "llvm/TargetParser/Triple.h"13using namespace clang;1415StringRef clang::languageToString(Language L) {16switch (L) {17case Language::Unknown:18return "Unknown";19case Language::Asm:20return "Asm";21case Language::LLVM_IR:22return "LLVM IR";23case Language::CIR:24return "ClangIR";25case Language::C:26return "C";27case Language::CXX:28return "C++";29case Language::ObjC:30return "Objective-C";31case Language::ObjCXX:32return "Objective-C++";33case Language::OpenCL:34return "OpenCL";35case Language::OpenCLCXX:36return "OpenCLC++";37case Language::CUDA:38return "CUDA";39case Language::RenderScript:40return "RenderScript";41case Language::HIP:42return "HIP";43case Language::HLSL:44return "HLSL";45}4647llvm_unreachable("unhandled language kind");48}4950#define LANGSTANDARD(id, name, lang, desc, features) \51static const LangStandard Lang_##id = {name, desc, features, Language::lang};52#include "clang/Basic/LangStandards.def"5354const LangStandard &LangStandard::getLangStandardForKind(Kind K) {55switch (K) {56case lang_unspecified:57llvm::report_fatal_error("getLangStandardForKind() on unspecified kind");58#define LANGSTANDARD(id, name, lang, desc, features) \59case lang_##id: return Lang_##id;60#include "clang/Basic/LangStandards.def"61}62llvm_unreachable("Invalid language kind!");63}6465LangStandard::Kind LangStandard::getLangKind(StringRef Name) {66return llvm::StringSwitch<Kind>(Name)67#define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id)68#define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id)69#include "clang/Basic/LangStandards.def"70.Default(lang_unspecified);71}7273LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) {74return llvm::StringSwitch<LangStandard::Kind>(Name)75.Case("2016", LangStandard::lang_hlsl2016)76.Case("2017", LangStandard::lang_hlsl2017)77.Case("2018", LangStandard::lang_hlsl2018)78.Case("2021", LangStandard::lang_hlsl2021)79.Case("202x", LangStandard::lang_hlsl202x)80.Default(LangStandard::lang_unspecified);81}8283const LangStandard *LangStandard::getLangStandardForName(StringRef Name) {84Kind K = getLangKind(Name);85if (K == lang_unspecified)86return nullptr;8788return &getLangStandardForKind(K);89}9091LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang,92const llvm::Triple &T) {93switch (Lang) {94case Language::Unknown:95case Language::LLVM_IR:96case Language::CIR:97llvm_unreachable("Invalid input kind!");98case Language::OpenCL:99return LangStandard::lang_opencl12;100case Language::OpenCLCXX:101return LangStandard::lang_openclcpp10;102case Language::Asm:103case Language::C:104// The PS4 uses C99 as the default C standard.105if (T.isPS4())106return LangStandard::lang_gnu99;107return LangStandard::lang_gnu17;108case Language::ObjC:109return LangStandard::lang_gnu11;110case Language::CXX:111case Language::ObjCXX:112case Language::CUDA:113case Language::HIP:114return LangStandard::lang_gnucxx17;115case Language::RenderScript:116return LangStandard::lang_c99;117case Language::HLSL:118return LangStandard::lang_hlsl2021;119}120llvm_unreachable("unhandled Language kind!");121}122123124