109d890d7SRainer Orth //===--- LangStandards.cpp - Language Standard Definitions ----------------===// 209d890d7SRainer Orth // 309d890d7SRainer Orth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409d890d7SRainer Orth // See https://llvm.org/LICENSE.txt for license information. 509d890d7SRainer Orth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609d890d7SRainer Orth // 709d890d7SRainer Orth //===----------------------------------------------------------------------===// 809d890d7SRainer Orth 909d890d7SRainer Orth #include "clang/Basic/LangStandard.h" 102e270947SCassie Jones #include "clang/Config/config.h" 1109d890d7SRainer Orth #include "llvm/ADT/StringSwitch.h" 1209d890d7SRainer Orth #include "llvm/Support/ErrorHandling.h" 1362c7f035SArchibald Elliott #include "llvm/TargetParser/Triple.h" 1409d890d7SRainer Orth using namespace clang; 1509d890d7SRainer Orth 16703895b1SYusra Syeda StringRef clang::languageToString(Language L) { 17703895b1SYusra Syeda switch (L) { 18703895b1SYusra Syeda case Language::Unknown: 19703895b1SYusra Syeda return "Unknown"; 20703895b1SYusra Syeda case Language::Asm: 21703895b1SYusra Syeda return "Asm"; 22703895b1SYusra Syeda case Language::LLVM_IR: 23703895b1SYusra Syeda return "LLVM IR"; 24e66b670fSNathan Lanza case Language::CIR: 25e66b670fSNathan Lanza return "ClangIR"; 26703895b1SYusra Syeda case Language::C: 27703895b1SYusra Syeda return "C"; 28703895b1SYusra Syeda case Language::CXX: 29703895b1SYusra Syeda return "C++"; 30703895b1SYusra Syeda case Language::ObjC: 31703895b1SYusra Syeda return "Objective-C"; 32703895b1SYusra Syeda case Language::ObjCXX: 33703895b1SYusra Syeda return "Objective-C++"; 34703895b1SYusra Syeda case Language::OpenCL: 35703895b1SYusra Syeda return "OpenCL"; 36703895b1SYusra Syeda case Language::OpenCLCXX: 37703895b1SYusra Syeda return "OpenCLC++"; 38703895b1SYusra Syeda case Language::CUDA: 39703895b1SYusra Syeda return "CUDA"; 40703895b1SYusra Syeda case Language::HIP: 41703895b1SYusra Syeda return "HIP"; 42703895b1SYusra Syeda case Language::HLSL: 43703895b1SYusra Syeda return "HLSL"; 44703895b1SYusra Syeda } 45703895b1SYusra Syeda 46703895b1SYusra Syeda llvm_unreachable("unhandled language kind"); 47703895b1SYusra Syeda } 48703895b1SYusra Syeda 4909d890d7SRainer Orth #define LANGSTANDARD(id, name, lang, desc, features) \ 5009d890d7SRainer Orth static const LangStandard Lang_##id = {name, desc, features, Language::lang}; 5109d890d7SRainer Orth #include "clang/Basic/LangStandards.def" 5209d890d7SRainer Orth 5309d890d7SRainer Orth const LangStandard &LangStandard::getLangStandardForKind(Kind K) { 5409d890d7SRainer Orth switch (K) { 5509d890d7SRainer Orth case lang_unspecified: 5609d890d7SRainer Orth llvm::report_fatal_error("getLangStandardForKind() on unspecified kind"); 5709d890d7SRainer Orth #define LANGSTANDARD(id, name, lang, desc, features) \ 5809d890d7SRainer Orth case lang_##id: return Lang_##id; 5909d890d7SRainer Orth #include "clang/Basic/LangStandards.def" 6009d890d7SRainer Orth } 6109d890d7SRainer Orth llvm_unreachable("Invalid language kind!"); 6209d890d7SRainer Orth } 6309d890d7SRainer Orth 6409d890d7SRainer Orth LangStandard::Kind LangStandard::getLangKind(StringRef Name) { 6509d890d7SRainer Orth return llvm::StringSwitch<Kind>(Name) 6609d890d7SRainer Orth #define LANGSTANDARD(id, name, lang, desc, features) .Case(name, lang_##id) 6709d890d7SRainer Orth #define LANGSTANDARD_ALIAS(id, alias) .Case(alias, lang_##id) 6809d890d7SRainer Orth #include "clang/Basic/LangStandards.def" 6909d890d7SRainer Orth .Default(lang_unspecified); 7009d890d7SRainer Orth } 7109d890d7SRainer Orth 72162180deSJoshua Batista LangStandard::Kind LangStandard::getHLSLLangKind(StringRef Name) { 73162180deSJoshua Batista return llvm::StringSwitch<LangStandard::Kind>(Name) 74162180deSJoshua Batista .Case("2016", LangStandard::lang_hlsl2016) 75162180deSJoshua Batista .Case("2017", LangStandard::lang_hlsl2017) 76162180deSJoshua Batista .Case("2018", LangStandard::lang_hlsl2018) 77162180deSJoshua Batista .Case("2021", LangStandard::lang_hlsl2021) 78162180deSJoshua Batista .Case("202x", LangStandard::lang_hlsl202x) 792222e27dSChris B .Case("202y", LangStandard::lang_hlsl202y) 80162180deSJoshua Batista .Default(LangStandard::lang_unspecified); 81162180deSJoshua Batista } 82162180deSJoshua Batista 8309d890d7SRainer Orth const LangStandard *LangStandard::getLangStandardForName(StringRef Name) { 8409d890d7SRainer Orth Kind K = getLangKind(Name); 8509d890d7SRainer Orth if (K == lang_unspecified) 8609d890d7SRainer Orth return nullptr; 8709d890d7SRainer Orth 8809d890d7SRainer Orth return &getLangStandardForKind(K); 8909d890d7SRainer Orth } 9009d890d7SRainer Orth 9193471e65SHaojian Wu LangStandard::Kind clang::getDefaultLanguageStandard(clang::Language Lang, 9293471e65SHaojian Wu const llvm::Triple &T) { 9393471e65SHaojian Wu switch (Lang) { 9493471e65SHaojian Wu case Language::Unknown: 9593471e65SHaojian Wu case Language::LLVM_IR: 96e66b670fSNathan Lanza case Language::CIR: 9793471e65SHaojian Wu llvm_unreachable("Invalid input kind!"); 9893471e65SHaojian Wu case Language::OpenCL: 9993471e65SHaojian Wu return LangStandard::lang_opencl12; 10093471e65SHaojian Wu case Language::OpenCLCXX: 10193471e65SHaojian Wu return LangStandard::lang_openclcpp10; 10293471e65SHaojian Wu case Language::Asm: 10393471e65SHaojian Wu case Language::C: 104a844378bSSunil Srivastava // The PS4 uses C99 as the default C standard. 105a844378bSSunil Srivastava if (T.isPS4()) 10693471e65SHaojian Wu return LangStandard::lang_gnu99; 10793471e65SHaojian Wu return LangStandard::lang_gnu17; 10893471e65SHaojian Wu case Language::ObjC: 10993471e65SHaojian Wu return LangStandard::lang_gnu11; 11093471e65SHaojian Wu case Language::CXX: 11193471e65SHaojian Wu case Language::ObjCXX: 1128ef04488SYaxun (Sam) Liu case Language::CUDA: 1138ef04488SYaxun (Sam) Liu case Language::HIP: 1143e99b8d9SFangrui Song return LangStandard::lang_gnucxx17; 11593471e65SHaojian Wu case Language::HLSL: 116*48864038SChris B return LangStandard::lang_hlsl202x; 11793471e65SHaojian Wu } 11893471e65SHaojian Wu llvm_unreachable("unhandled Language kind!"); 11993471e65SHaojian Wu } 120