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