1 //===--- WebAssembly.cpp - Implement WebAssembly target feature support ---===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements WebAssembly TargetInfo objects. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "WebAssembly.h" 15 #include "Targets.h" 16 #include "clang/Basic/Builtins.h" 17 #include "clang/Basic/Diagnostic.h" 18 #include "clang/Basic/TargetBuiltins.h" 19 #include "llvm/ADT/StringSwitch.h" 20 21 using namespace clang; 22 using namespace clang::targets; 23 24 const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = { 25 #define BUILTIN(ID, TYPE, ATTRS) \ 26 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, 27 #define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \ 28 {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, 29 #include "clang/Basic/BuiltinsWebAssembly.def" 30 }; 31 32 bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { 33 return llvm::StringSwitch<bool>(Feature) 34 .Case("simd128", SIMDLevel >= SIMD128) 35 .Case("nontrapping-fptoint", HasNontrappingFPToInt) 36 .Default(false); 37 } 38 39 bool WebAssemblyTargetInfo::isValidCPUName(StringRef Name) const { 40 return llvm::StringSwitch<bool>(Name) 41 .Case("mvp", true) 42 .Case("bleeding-edge", true) 43 .Case("generic", true) 44 .Default(false); 45 } 46 47 void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts, 48 MacroBuilder &Builder) const { 49 defineCPUMacros(Builder, "wasm", /*Tuning=*/false); 50 if (SIMDLevel >= SIMD128) 51 Builder.defineMacro("__wasm_simd128__"); 52 } 53 54 bool WebAssemblyTargetInfo::handleTargetFeatures( 55 std::vector<std::string> &Features, DiagnosticsEngine &Diags) { 56 for (const auto &Feature : Features) { 57 if (Feature == "+simd128") { 58 SIMDLevel = std::max(SIMDLevel, SIMD128); 59 continue; 60 } 61 if (Feature == "-simd128") { 62 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); 63 continue; 64 } 65 if (Feature == "+nontrapping-fptoint") { 66 HasNontrappingFPToInt = true; 67 continue; 68 } 69 if (Feature == "-nontrapping-fptoint") { 70 HasNontrappingFPToInt = false; 71 continue; 72 } 73 74 Diags.Report(diag::err_opt_not_valid_with_opt) 75 << Feature << "-target-feature"; 76 return false; 77 } 78 return true; 79 } 80 81 ArrayRef<Builtin::Info> WebAssemblyTargetInfo::getTargetBuiltins() const { 82 return llvm::makeArrayRef(BuiltinInfo, clang::WebAssembly::LastTSBuiltin - 83 Builtin::FirstTSBuiltin); 84 } 85 86 void WebAssembly32TargetInfo::getTargetDefines(const LangOptions &Opts, 87 MacroBuilder &Builder) const { 88 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); 89 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false); 90 } 91 92 void WebAssembly64TargetInfo::getTargetDefines(const LangOptions &Opts, 93 MacroBuilder &Builder) const { 94 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); 95 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false); 96 } 97