1*12c85518Srobert //===--- CSKY.h - Declare CSKY target feature support -----------*- C++ -*-===// 2*12c85518Srobert // 3*12c85518Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*12c85518Srobert // See https://llvm.org/LICENSE.txt for license information. 5*12c85518Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*12c85518Srobert // 7*12c85518Srobert //===----------------------------------------------------------------------===// 8*12c85518Srobert // 9*12c85518Srobert // This file declares CSKY TargetInfo objects. 10*12c85518Srobert // 11*12c85518Srobert //===----------------------------------------------------------------------===// 12*12c85518Srobert 13*12c85518Srobert #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H 14*12c85518Srobert #define LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H 15*12c85518Srobert 16*12c85518Srobert #include "clang/Basic/MacroBuilder.h" 17*12c85518Srobert #include "clang/Basic/TargetInfo.h" 18*12c85518Srobert #include "llvm/Support/CSKYTargetParser.h" 19*12c85518Srobert 20*12c85518Srobert namespace clang { 21*12c85518Srobert namespace targets { 22*12c85518Srobert 23*12c85518Srobert class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo { 24*12c85518Srobert protected: 25*12c85518Srobert std::string ABI; 26*12c85518Srobert llvm::CSKY::ArchKind Arch = llvm::CSKY::ArchKind::INVALID; 27*12c85518Srobert std::string CPU; 28*12c85518Srobert 29*12c85518Srobert bool HardFloat = false; 30*12c85518Srobert bool HardFloatABI = false; 31*12c85518Srobert bool FPUV2_SF = false; 32*12c85518Srobert bool FPUV2_DF = false; 33*12c85518Srobert bool FPUV3_SF = false; 34*12c85518Srobert bool FPUV3_DF = false; 35*12c85518Srobert bool VDSPV2 = false; 36*12c85518Srobert bool VDSPV1 = false; 37*12c85518Srobert bool DSPV2 = false; 38*12c85518Srobert bool is3E3R1 = false; 39*12c85518Srobert 40*12c85518Srobert public: CSKYTargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)41*12c85518Srobert CSKYTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 42*12c85518Srobert : TargetInfo(Triple) { 43*12c85518Srobert NoAsmVariants = true; 44*12c85518Srobert LongLongAlign = 32; 45*12c85518Srobert SuitableAlign = 32; 46*12c85518Srobert DoubleAlign = LongDoubleAlign = 32; 47*12c85518Srobert SizeType = UnsignedInt; 48*12c85518Srobert PtrDiffType = SignedInt; 49*12c85518Srobert IntPtrType = SignedInt; 50*12c85518Srobert WCharType = SignedInt; 51*12c85518Srobert WIntType = UnsignedInt; 52*12c85518Srobert 53*12c85518Srobert UseZeroLengthBitfieldAlignment = true; 54*12c85518Srobert MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 55*12c85518Srobert resetDataLayout("e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-" 56*12c85518Srobert "v64:32:32-v128:32:32-a:0:32-Fi32-n32"); 57*12c85518Srobert 58*12c85518Srobert setABI("abiv2"); 59*12c85518Srobert } 60*12c85518Srobert getABI()61*12c85518Srobert StringRef getABI() const override { return ABI; } setABI(const std::string & Name)62*12c85518Srobert bool setABI(const std::string &Name) override { 63*12c85518Srobert if (Name == "abiv2" || Name == "abiv1") { 64*12c85518Srobert ABI = Name; 65*12c85518Srobert return true; 66*12c85518Srobert } 67*12c85518Srobert return false; 68*12c85518Srobert } 69*12c85518Srobert 70*12c85518Srobert bool setCPU(const std::string &Name) override; 71*12c85518Srobert 72*12c85518Srobert bool isValidCPUName(StringRef Name) const override; 73*12c85518Srobert 74*12c85518Srobert unsigned getMinGlobalAlign(uint64_t) const override; 75*12c85518Srobert 76*12c85518Srobert ArrayRef<Builtin::Info> getTargetBuiltins() const override; 77*12c85518Srobert getBuiltinVaListKind()78*12c85518Srobert BuiltinVaListKind getBuiltinVaListKind() const override { 79*12c85518Srobert return VoidPtrBuiltinVaList; 80*12c85518Srobert } 81*12c85518Srobert 82*12c85518Srobert bool validateAsmConstraint(const char *&Name, 83*12c85518Srobert TargetInfo::ConstraintInfo &info) const override; 84*12c85518Srobert getClobbers()85*12c85518Srobert const char *getClobbers() const override { return ""; } 86*12c85518Srobert 87*12c85518Srobert void getTargetDefines(const LangOptions &Opts, 88*12c85518Srobert MacroBuilder &Builder) const override; 89*12c85518Srobert bool hasFeature(StringRef Feature) const override; 90*12c85518Srobert bool handleTargetFeatures(std::vector<std::string> &Features, 91*12c85518Srobert DiagnosticsEngine &Diags) override; 92*12c85518Srobert 93*12c85518Srobert /// Whether target allows to overalign ABI-specified preferred alignment allowsLargerPreferedTypeAlignment()94*12c85518Srobert bool allowsLargerPreferedTypeAlignment() const override { return false; } 95*12c85518Srobert hasBitIntType()96*12c85518Srobert bool hasBitIntType() const override { return true; } 97*12c85518Srobert 98*12c85518Srobert protected: 99*12c85518Srobert ArrayRef<const char *> getGCCRegNames() const override; 100*12c85518Srobert 101*12c85518Srobert ArrayRef<GCCRegAlias> getGCCRegAliases() const override; 102*12c85518Srobert }; 103*12c85518Srobert 104*12c85518Srobert } // namespace targets 105*12c85518Srobert } // namespace clang 106*12c85518Srobert 107*12c85518Srobert #endif // LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H 108