1a7dea167SDimitry Andric //===--- LangStandards.cpp - Language Standard Definitions ----------------===// 2a7dea167SDimitry Andric // 3a7dea167SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a7dea167SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5a7dea167SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a7dea167SDimitry Andric // 7a7dea167SDimitry Andric //===----------------------------------------------------------------------===// 8a7dea167SDimitry Andric 9a7dea167SDimitry Andric #include "clang/Basic/LangStandard.h" 1081ad6265SDimitry Andric #include "clang/Config/config.h" 11a7dea167SDimitry Andric #include "llvm/ADT/StringSwitch.h" 12a7dea167SDimitry Andric #include "llvm/Support/ErrorHandling.h" 1306c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 14a7dea167SDimitry Andric using namespace clang; 15a7dea167SDimitry Andric 165f757f3fSDimitry Andric StringRef clang::languageToString(Language L) { 175f757f3fSDimitry Andric switch (L) { 185f757f3fSDimitry Andric case Language::Unknown: 195f757f3fSDimitry Andric return "Unknown"; 205f757f3fSDimitry Andric case Language::Asm: 215f757f3fSDimitry Andric return "Asm"; 225f757f3fSDimitry Andric case Language::LLVM_IR: 235f757f3fSDimitry Andric return "LLVM IR"; 24*0fca6ea1SDimitry Andric case Language::CIR: 25*0fca6ea1SDimitry Andric return "ClangIR"; 265f757f3fSDimitry Andric case Language::C: 275f757f3fSDimitry Andric return "C"; 285f757f3fSDimitry Andric case Language::CXX: 295f757f3fSDimitry Andric return "C++"; 305f757f3fSDimitry Andric case Language::ObjC: 315f757f3fSDimitry Andric return "Objective-C"; 325f757f3fSDimitry Andric case Language::ObjCXX: 335f757f3fSDimitry Andric return "Objective-C++"; 345f757f3fSDimitry Andric case Language::OpenCL: 355f757f3fSDimitry Andric return "OpenCL"; 365f757f3fSDimitry Andric case Language::OpenCLCXX: 375f757f3fSDimitry Andric return "OpenCLC++"; 385f757f3fSDimitry Andric case Language::CUDA: 395f757f3fSDimitry Andric return "CUDA"; 405f757f3fSDimitry Andric case Language::RenderScript: 415f757f3fSDimitry Andric return "RenderScript"; 425f757f3fSDimitry Andric case Language::HIP: 435f757f3fSDimitry Andric return "HIP"; 445f757f3fSDimitry Andric case Language::HLSL: 455f757f3fSDimitry Andric return "HLSL"; 465f757f3fSDimitry Andric } 475f757f3fSDimitry Andric 485f757f3fSDimitry Andric llvm_unreachable("unhandled language kind"); 495f757f3fSDimitry Andric } 505f757f3fSDimitry Andric 51a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) \ 52a7dea167SDimitry Andric static const LangStandard Lang_##id = {name, desc, features, Language::lang}; 53a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def" 54a7dea167SDimitry Andric 55a7dea167SDimitry Andric const LangStandard &LangStandard::getLangStandardForKind(Kind K) { 56a7dea167SDimitry Andric switch (K) { 57a7dea167SDimitry Andric case lang_unspecified: 58a7dea167SDimitry Andric llvm::report_fatal_error("getLangStandardForKind() on unspecified kind"); 59a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) \ 60a7dea167SDimitry Andric case lang_##id: return Lang_##id; 61a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def" 62a7dea167SDimitry Andric } 63a7dea167SDimitry Andric llvm_unreachable("Invalid language kind!"); 64a7dea167SDimitry Andric } 65a7dea167SDimitry Andric 66a7dea167SDimitry Andric LangStandard::Kind LangStandard::getLangKind(StringRef Name) { 67a7dea167SDimitry Andric return llvm::StringSwitch<Kind>(Name) 68a7dea167SDimitry Andric #define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id) 69a7dea167SDimitry Andric #define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id) 70a7dea167SDimitry Andric #include "clang/Basic/LangStandards.def" 71a7dea167SDimitry Andric .Default(lang_unspecified); 72a7dea167SDimitry Andric } 73a7dea167SDimitry Andric 74*0fca6ea1SDimitry Andric LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) { 75*0fca6ea1SDimitry Andric return llvm::StringSwitch<LangStandard::Kind>(Name) 76*0fca6ea1SDimitry Andric .Case("2016", LangStandard::lang_hlsl2016) 77*0fca6ea1SDimitry Andric .Case("2017", LangStandard::lang_hlsl2017) 78*0fca6ea1SDimitry Andric .Case("2018", LangStandard::lang_hlsl2018) 79*0fca6ea1SDimitry Andric .Case("2021", LangStandard::lang_hlsl2021) 80*0fca6ea1SDimitry Andric .Case("202x", LangStandard::lang_hlsl202x) 81*0fca6ea1SDimitry Andric .Default(LangStandard::lang_unspecified); 82*0fca6ea1SDimitry Andric } 83*0fca6ea1SDimitry Andric 84a7dea167SDimitry Andric const LangStandard *LangStandard::getLangStandardForName(StringRef Name) { 85a7dea167SDimitry Andric Kind K = getLangKind(Name); 86a7dea167SDimitry Andric if (K == lang_unspecified) 87a7dea167SDimitry Andric return nullptr; 88a7dea167SDimitry Andric 89a7dea167SDimitry Andric return &getLangStandardForKind(K); 90a7dea167SDimitry Andric } 91a7dea167SDimitry Andric 9281ad6265SDimitry Andric LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang, 9381ad6265SDimitry Andric const llvm::Triple &T) { 9481ad6265SDimitry Andric switch (Lang) { 9581ad6265SDimitry Andric case Language::Unknown: 9681ad6265SDimitry Andric case Language::LLVM_IR: 97*0fca6ea1SDimitry Andric case Language::CIR: 9881ad6265SDimitry Andric llvm_unreachable("Invalid input kind!"); 9981ad6265SDimitry Andric case Language::OpenCL: 10081ad6265SDimitry Andric return LangStandard::lang_opencl12; 10181ad6265SDimitry Andric case Language::OpenCLCXX: 10281ad6265SDimitry Andric return LangStandard::lang_openclcpp10; 10381ad6265SDimitry Andric case Language::Asm: 10481ad6265SDimitry Andric case Language::C: 105753f127fSDimitry Andric // The PS4 uses C99 as the default C standard. 106753f127fSDimitry Andric if (T.isPS4()) 10781ad6265SDimitry Andric return LangStandard::lang_gnu99; 10881ad6265SDimitry Andric return LangStandard::lang_gnu17; 10981ad6265SDimitry Andric case Language::ObjC: 11081ad6265SDimitry Andric return LangStandard::lang_gnu11; 11181ad6265SDimitry Andric case Language::CXX: 11281ad6265SDimitry Andric case Language::ObjCXX: 11306c3fb27SDimitry Andric case Language::CUDA: 11406c3fb27SDimitry Andric case Language::HIP: 115bdd1243dSDimitry Andric return LangStandard::lang_gnucxx17; 11681ad6265SDimitry Andric case Language::RenderScript: 11781ad6265SDimitry Andric return LangStandard::lang_c99; 11881ad6265SDimitry Andric case Language::HLSL: 11981ad6265SDimitry Andric return LangStandard::lang_hlsl2021; 12081ad6265SDimitry Andric } 12181ad6265SDimitry Andric llvm_unreachable("unhandled Language kind!"); 12281ad6265SDimitry Andric } 123