WebAssembly.h revision 326941
1100384Speter//=== WebAssembly.h - Declare WebAssembly target feature support *- C++ -*-===//
2100384Speter//
3100384Speter//                     The LLVM Compiler Infrastructure
4100384Speter//
5100384Speter// This file is distributed under the University of Illinois Open Source
6100384Speter// License. See LICENSE.TXT for details.
7100384Speter//
8100384Speter//===----------------------------------------------------------------------===//
9100384Speter//
10100384Speter// This file declares WebAssembly TargetInfo objects.
11100384Speter//
12100384Speter//===----------------------------------------------------------------------===//
13100384Speter
14100384Speter#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_WEBASSEMBLY_H
15100384Speter#define LLVM_CLANG_LIB_BASIC_TARGETS_WEBASSEMBLY_H
16100384Speter
17100384Speter#include "clang/Basic/TargetInfo.h"
18100384Speter#include "clang/Basic/TargetOptions.h"
19100384Speter#include "llvm/ADT/Triple.h"
20100384Speter#include "llvm/Support/Compiler.h"
21100384Speter
22100384Speternamespace clang {
23100384Speternamespace targets {
24100384Speter
25100384Speterclass LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
26100384Speter  static const Builtin::Info BuiltinInfo[];
27118031Sobrien
28118031Sobrien  enum SIMDEnum {
29118031Sobrien    NoSIMD,
30104738Speter    SIMD128,
31104738Speter  } SIMDLevel;
32100384Speter
33100384Speter  bool HasNontrappingFPToInt;
34100384Speter
35100384Speterpublic:
36100384Speter  explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
37100384Speter      : TargetInfo(T), SIMDLevel(NoSIMD), HasNontrappingFPToInt(false) {
38123746Speter    NoAsmVariants = true;
39100384Speter    SuitableAlign = 128;
40100384Speter    LargeArrayMinWidth = 128;
41100384Speter    LargeArrayAlign = 128;
42100384Speter    SimdDefaultAlign = 128;
43100384Speter    SigAtomicType = SignedLong;
44100384Speter    LongDoubleWidth = LongDoubleAlign = 128;
45100384Speter    LongDoubleFormat = &llvm::APFloat::IEEEquad();
46100384Speter    SizeType = UnsignedInt;
47100384Speter    PtrDiffType = SignedInt;
48100384Speter    IntPtrType = SignedInt;
49100384Speter  }
50100384Speter
51100384Speterprotected:
52100384Speter  void getTargetDefines(const LangOptions &Opts,
53100384Speter                        MacroBuilder &Builder) const override;
54100384Speter
55146950Spsprivate:
56100384Speter  bool
57100384Speter  initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
58100384Speter                 StringRef CPU,
59100384Speter                 const std::vector<std::string> &FeaturesVec) const override {
60100384Speter    if (CPU == "bleeding-edge") {
61100384Speter      Features["simd128"] = true;
62113859Sjhb      Features["nontrapping-fptoint"] = true;
63100384Speter    }
64100384Speter    return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
65100384Speter  }
66100384Speter
67100384Speter  bool hasFeature(StringRef Feature) const final;
68100384Speter
69127140Sjhb  bool handleTargetFeatures(std::vector<std::string> &Features,
70100384Speter                            DiagnosticsEngine &Diags) final;
71100384Speter
72100384Speter  bool isValidCPUName(StringRef Name) const final;
73100384Speter
74100384Speter  bool setCPU(const std::string &Name) final { return isValidCPUName(Name); }
75100384Speter
76100384Speter  ArrayRef<Builtin::Info> getTargetBuiltins() const final;
77100384Speter
78100384Speter  BuiltinVaListKind getBuiltinVaListKind() const final {
79119333Speter    return VoidPtrBuiltinVaList;
80119333Speter  }
81119333Speter
82100384Speter  ArrayRef<const char *> getGCCRegNames() const final { return None; }
83121719Speter
84121719Speter  ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
85121719Speter    return None;
86121719Speter  }
87121719Speter
88100384Speter  bool validateAsmConstraint(const char *&Name,
89119333Speter                             TargetInfo::ConstraintInfo &Info) const final {
90100384Speter    return false;
91127140Sjhb  }
92127140Sjhb
93136152Sjhb  const char *getClobbers() const final { return ""; }
94100384Speter
95136152Sjhb  bool isCLZForZeroUndef() const final { return false; }
96136152Sjhb
97136152Sjhb  bool hasInt128Type() const final { return true; }
98136152Sjhb
99136152Sjhb  IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
100100384Speter    // WebAssembly prefers long long for explicitly 64-bit integers.
101100384Speter    return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
102127140Sjhb                          : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
103127140Sjhb  }
104127140Sjhb
105100384Speter  IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
106100384Speter    // WebAssembly uses long long for int_least64_t and int_fast64_t.
107100384Speter    return BitWidth == 64
108100384Speter               ? (IsSigned ? SignedLongLong : UnsignedLongLong)
109100384Speter               : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
110100384Speter  }
111100384Speter};
112100384Speterclass LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo
113100384Speter    : public WebAssemblyTargetInfo {
114100384Speterpublic:
115100384Speter  explicit WebAssembly32TargetInfo(const llvm::Triple &T,
116100384Speter                                   const TargetOptions &Opts)
117100384Speter      : WebAssemblyTargetInfo(T, Opts) {
118100384Speter    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
119100384Speter    resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
120100384Speter  }
121127140Sjhb
122100384Speterprotected:
123100384Speter  void getTargetDefines(const LangOptions &Opts,
124100384Speter                        MacroBuilder &Builder) const override;
125100384Speter};
126128597Smarcel
127100384Speterclass LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo
128100384Speter    : public WebAssemblyTargetInfo {
129100384Speterpublic:
130100384Speter  explicit WebAssembly64TargetInfo(const llvm::Triple &T,
131100384Speter                                   const TargetOptions &Opts)
132100384Speter      : WebAssemblyTargetInfo(T, Opts) {
133100384Speter    LongAlign = LongWidth = 64;
134100384Speter    PointerAlign = PointerWidth = 64;
135100384Speter    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
136100384Speter    SizeType = UnsignedLong;
137100384Speter    PtrDiffType = SignedLong;
138100384Speter    IntPtrType = SignedLong;
139100384Speter    resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
140100384Speter  }
141100384Speter
142100384Speterprotected:
143100384Speter  void getTargetDefines(const LangOptions &Opts,
144100384Speter                        MacroBuilder &Builder) const override;
145100384Speter};
146100384Speter} // namespace targets
147128260Speter} // namespace clang
148100384Speter#endif // LLVM_CLANG_LIB_BASIC_TARGETS_WEBASSEMBLY_H
149100384Speter