diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Basic/Targets/WebAssembly.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/Basic/Targets/WebAssembly.cpp | 96 | 
1 files changed, 96 insertions, 0 deletions
diff --git a/contrib/llvm/tools/clang/lib/Basic/Targets/WebAssembly.cpp b/contrib/llvm/tools/clang/lib/Basic/Targets/WebAssembly.cpp new file mode 100644 index 000000000000..915aad4b563b --- /dev/null +++ b/contrib/llvm/tools/clang/lib/Basic/Targets/WebAssembly.cpp @@ -0,0 +1,96 @@ +//===--- WebAssembly.cpp - Implement WebAssembly target feature support ---===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements WebAssembly TargetInfo objects. +// +//===----------------------------------------------------------------------===// + +#include "WebAssembly.h" +#include "Targets.h" +#include "clang/Basic/Builtins.h" +#include "clang/Basic/Diagnostic.h" +#include "clang/Basic/TargetBuiltins.h" +#include "llvm/ADT/StringSwitch.h" + +using namespace clang; +using namespace clang::targets; + +const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS)                                               \ +  {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER)                                    \ +  {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr}, +#include "clang/Basic/BuiltinsWebAssembly.def" +}; + +bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { +  return llvm::StringSwitch<bool>(Feature) +      .Case("simd128", SIMDLevel >= SIMD128) +      .Case("nontrapping-fptoint", HasNontrappingFPToInt) +      .Default(false); +} + +bool WebAssemblyTargetInfo::isValidCPUName(StringRef Name) const { +  return llvm::StringSwitch<bool>(Name) +      .Case("mvp", true) +      .Case("bleeding-edge", true) +      .Case("generic", true) +      .Default(false); +} + +void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts, +                                             MacroBuilder &Builder) const { +  defineCPUMacros(Builder, "wasm", /*Tuning=*/false); +  if (SIMDLevel >= SIMD128) +    Builder.defineMacro("__wasm_simd128__"); +} + +bool WebAssemblyTargetInfo::handleTargetFeatures( +    std::vector<std::string> &Features, DiagnosticsEngine &Diags) { +  for (const auto &Feature : Features) { +    if (Feature == "+simd128") { +      SIMDLevel = std::max(SIMDLevel, SIMD128); +      continue; +    } +    if (Feature == "-simd128") { +      SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1)); +      continue; +    } +    if (Feature == "+nontrapping-fptoint") { +      HasNontrappingFPToInt = true; +      continue; +    } +    if (Feature == "-nontrapping-fptoint") { +      HasNontrappingFPToInt = false; +      continue; +    } + +    Diags.Report(diag::err_opt_not_valid_with_opt) +        << Feature << "-target-feature"; +    return false; +  } +  return true; +} + +ArrayRef<Builtin::Info> WebAssemblyTargetInfo::getTargetBuiltins() const { +  return llvm::makeArrayRef(BuiltinInfo, clang::WebAssembly::LastTSBuiltin - +                                             Builtin::FirstTSBuiltin); +} + +void WebAssembly32TargetInfo::getTargetDefines(const LangOptions &Opts, +                                               MacroBuilder &Builder) const { +  WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); +  defineCPUMacros(Builder, "wasm32", /*Tuning=*/false); +} + +void WebAssembly64TargetInfo::getTargetDefines(const LangOptions &Opts, +                                               MacroBuilder &Builder) const { +  WebAssemblyTargetInfo::getTargetDefines(Opts, Builder); +  defineCPUMacros(Builder, "wasm64", /*Tuning=*/false); +}  | 
