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