forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			174 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			C++
		
	
	
	
//=== WebAssembly.h - Declare WebAssembly target feature support *- C++ -*-===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// This file declares WebAssembly TargetInfo objects.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_WEBASSEMBLY_H
 | 
						|
#define LLVM_CLANG_LIB_BASIC_TARGETS_WEBASSEMBLY_H
 | 
						|
 | 
						|
#include "clang/Basic/TargetInfo.h"
 | 
						|
#include "clang/Basic/TargetOptions.h"
 | 
						|
#include "llvm/ADT/Triple.h"
 | 
						|
#include "llvm/Support/Compiler.h"
 | 
						|
 | 
						|
namespace clang {
 | 
						|
namespace targets {
 | 
						|
 | 
						|
class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
 | 
						|
  static const Builtin::Info BuiltinInfo[];
 | 
						|
 | 
						|
  enum SIMDEnum {
 | 
						|
    NoSIMD,
 | 
						|
    SIMD128,
 | 
						|
    UnimplementedSIMD128,
 | 
						|
  } SIMDLevel = NoSIMD;
 | 
						|
 | 
						|
  bool HasNontrappingFPToInt = false;
 | 
						|
  bool HasSignExt = false;
 | 
						|
  bool HasExceptionHandling = false;
 | 
						|
  bool HasBulkMemory = false;
 | 
						|
  bool HasAtomics = false;
 | 
						|
  bool HasMutableGlobals = false;
 | 
						|
  bool HasMultivalue = false;
 | 
						|
  bool HasTailCall = false;
 | 
						|
  bool HasReferenceTypes = false;
 | 
						|
 | 
						|
  std::string ABI;
 | 
						|
 | 
						|
public:
 | 
						|
  explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
 | 
						|
      : TargetInfo(T) {
 | 
						|
    NoAsmVariants = true;
 | 
						|
    SuitableAlign = 128;
 | 
						|
    LargeArrayMinWidth = 128;
 | 
						|
    LargeArrayAlign = 128;
 | 
						|
    SimdDefaultAlign = 128;
 | 
						|
    SigAtomicType = SignedLong;
 | 
						|
    LongDoubleWidth = LongDoubleAlign = 128;
 | 
						|
    LongDoubleFormat = &llvm::APFloat::IEEEquad();
 | 
						|
    MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
 | 
						|
    // size_t being unsigned long for both wasm32 and wasm64 makes mangled names
 | 
						|
    // more consistent between the two.
 | 
						|
    SizeType = UnsignedLong;
 | 
						|
    PtrDiffType = SignedLong;
 | 
						|
    IntPtrType = SignedLong;
 | 
						|
  }
 | 
						|
 | 
						|
  StringRef getABI() const override;
 | 
						|
  bool setABI(const std::string &Name) override;
 | 
						|
 | 
						|
protected:
 | 
						|
  void getTargetDefines(const LangOptions &Opts,
 | 
						|
                        MacroBuilder &Builder) const override;
 | 
						|
 | 
						|
private:
 | 
						|
  static void setSIMDLevel(llvm::StringMap<bool> &Features, SIMDEnum Level);
 | 
						|
 | 
						|
  bool
 | 
						|
  initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
 | 
						|
                 StringRef CPU,
 | 
						|
                 const std::vector<std::string> &FeaturesVec) const override;
 | 
						|
  bool hasFeature(StringRef Feature) const final;
 | 
						|
 | 
						|
  bool handleTargetFeatures(std::vector<std::string> &Features,
 | 
						|
                            DiagnosticsEngine &Diags) final;
 | 
						|
 | 
						|
  bool isValidCPUName(StringRef Name) const final;
 | 
						|
  void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const final;
 | 
						|
 | 
						|
  bool setCPU(const std::string &Name) final { return isValidCPUName(Name); }
 | 
						|
 | 
						|
  ArrayRef<Builtin::Info> getTargetBuiltins() const final;
 | 
						|
 | 
						|
  BuiltinVaListKind getBuiltinVaListKind() const final {
 | 
						|
    return VoidPtrBuiltinVaList;
 | 
						|
  }
 | 
						|
 | 
						|
  ArrayRef<const char *> getGCCRegNames() const final { return None; }
 | 
						|
 | 
						|
  ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
 | 
						|
    return None;
 | 
						|
  }
 | 
						|
 | 
						|
  bool validateAsmConstraint(const char *&Name,
 | 
						|
                             TargetInfo::ConstraintInfo &Info) const final {
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  const char *getClobbers() const final { return ""; }
 | 
						|
 | 
						|
  bool isCLZForZeroUndef() const final { return false; }
 | 
						|
 | 
						|
  bool hasInt128Type() const final { return true; }
 | 
						|
 | 
						|
  IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
 | 
						|
    // WebAssembly prefers long long for explicitly 64-bit integers.
 | 
						|
    return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
 | 
						|
                          : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
 | 
						|
  }
 | 
						|
 | 
						|
  IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
 | 
						|
    // WebAssembly uses long long for int_least64_t and int_fast64_t.
 | 
						|
    return BitWidth == 64
 | 
						|
               ? (IsSigned ? SignedLongLong : UnsignedLongLong)
 | 
						|
               : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
 | 
						|
  }
 | 
						|
 | 
						|
  CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
 | 
						|
    switch (CC) {
 | 
						|
    case CC_C:
 | 
						|
    case CC_Swift:
 | 
						|
      return CCCR_OK;
 | 
						|
    default:
 | 
						|
      return CCCR_Warning;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  bool hasExtIntType() const override { return true; }
 | 
						|
 | 
						|
  bool hasProtectedVisibility() const override { return false; }
 | 
						|
};
 | 
						|
 | 
						|
class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo
 | 
						|
    : public WebAssemblyTargetInfo {
 | 
						|
public:
 | 
						|
  explicit WebAssembly32TargetInfo(const llvm::Triple &T,
 | 
						|
                                   const TargetOptions &Opts)
 | 
						|
      : WebAssemblyTargetInfo(T, Opts) {
 | 
						|
    resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
 | 
						|
  }
 | 
						|
 | 
						|
protected:
 | 
						|
  void getTargetDefines(const LangOptions &Opts,
 | 
						|
                        MacroBuilder &Builder) const override;
 | 
						|
};
 | 
						|
 | 
						|
class LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo
 | 
						|
    : public WebAssemblyTargetInfo {
 | 
						|
public:
 | 
						|
  explicit WebAssembly64TargetInfo(const llvm::Triple &T,
 | 
						|
                                   const TargetOptions &Opts)
 | 
						|
      : WebAssemblyTargetInfo(T, Opts) {
 | 
						|
    LongAlign = LongWidth = 64;
 | 
						|
    PointerAlign = PointerWidth = 64;
 | 
						|
    SizeType = UnsignedLong;
 | 
						|
    PtrDiffType = SignedLong;
 | 
						|
    IntPtrType = SignedLong;
 | 
						|
    resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
 | 
						|
  }
 | 
						|
 | 
						|
protected:
 | 
						|
  void getTargetDefines(const LangOptions &Opts,
 | 
						|
                        MacroBuilder &Builder) const override;
 | 
						|
};
 | 
						|
} // namespace targets
 | 
						|
} // namespace clang
 | 
						|
#endif // LLVM_CLANG_LIB_BASIC_TARGETS_WEBASSEMBLY_H
 |