1*12c85518Srobert //===-- LoongArch.h - Declare LoongArch 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 LoongArch TargetInfo objects. 10*12c85518Srobert // 11*12c85518Srobert //===----------------------------------------------------------------------===// 12*12c85518Srobert 13*12c85518Srobert #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H 14*12c85518Srobert #define LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H 15*12c85518Srobert 16*12c85518Srobert #include "clang/Basic/TargetInfo.h" 17*12c85518Srobert #include "clang/Basic/TargetOptions.h" 18*12c85518Srobert #include "llvm/ADT/Triple.h" 19*12c85518Srobert #include "llvm/Support/Compiler.h" 20*12c85518Srobert 21*12c85518Srobert namespace clang { 22*12c85518Srobert namespace targets { 23*12c85518Srobert 24*12c85518Srobert class LLVM_LIBRARY_VISIBILITY LoongArchTargetInfo : public TargetInfo { 25*12c85518Srobert protected: 26*12c85518Srobert std::string ABI; 27*12c85518Srobert bool HasFeatureD; 28*12c85518Srobert bool HasFeatureF; 29*12c85518Srobert 30*12c85518Srobert public: LoongArchTargetInfo(const llvm::Triple & Triple,const TargetOptions &)31*12c85518Srobert LoongArchTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 32*12c85518Srobert : TargetInfo(Triple) { 33*12c85518Srobert HasFeatureD = false; 34*12c85518Srobert HasFeatureF = false; 35*12c85518Srobert LongDoubleWidth = 128; 36*12c85518Srobert LongDoubleAlign = 128; 37*12c85518Srobert LongDoubleFormat = &llvm::APFloat::IEEEquad(); 38*12c85518Srobert SuitableAlign = 128; 39*12c85518Srobert WCharType = SignedInt; 40*12c85518Srobert WIntType = UnsignedInt; 41*12c85518Srobert } 42*12c85518Srobert getABI()43*12c85518Srobert StringRef getABI() const override { return ABI; } 44*12c85518Srobert 45*12c85518Srobert void getTargetDefines(const LangOptions &Opts, 46*12c85518Srobert MacroBuilder &Builder) const override; 47*12c85518Srobert 48*12c85518Srobert ArrayRef<Builtin::Info> getTargetBuiltins() const override; 49*12c85518Srobert getBuiltinVaListKind()50*12c85518Srobert BuiltinVaListKind getBuiltinVaListKind() const override { 51*12c85518Srobert return TargetInfo::VoidPtrBuiltinVaList; 52*12c85518Srobert } 53*12c85518Srobert getClobbers()54*12c85518Srobert const char *getClobbers() const override { return ""; } 55*12c85518Srobert 56*12c85518Srobert ArrayRef<const char *> getGCCRegNames() const override; 57*12c85518Srobert getEHDataRegisterNumber(unsigned RegNo)58*12c85518Srobert int getEHDataRegisterNumber(unsigned RegNo) const override { 59*12c85518Srobert if (RegNo == 0) 60*12c85518Srobert return 4; 61*12c85518Srobert if (RegNo == 1) 62*12c85518Srobert return 5; 63*12c85518Srobert return -1; 64*12c85518Srobert } 65*12c85518Srobert 66*12c85518Srobert ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; 67*12c85518Srobert 68*12c85518Srobert bool validateAsmConstraint(const char *&Name, 69*12c85518Srobert TargetInfo::ConstraintInfo &Info) const override; 70*12c85518Srobert std::string convertConstraint(const char *&Constraint) const override; 71*12c85518Srobert hasBitIntType()72*12c85518Srobert bool hasBitIntType() const override { return true; } 73*12c85518Srobert 74*12c85518Srobert bool handleTargetFeatures(std::vector<std::string> &Features, 75*12c85518Srobert DiagnosticsEngine &Diags) override; 76*12c85518Srobert 77*12c85518Srobert bool 78*12c85518Srobert initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, 79*12c85518Srobert StringRef CPU, 80*12c85518Srobert const std::vector<std::string> &FeaturesVec) const override; 81*12c85518Srobert 82*12c85518Srobert bool hasFeature(StringRef Feature) const override; 83*12c85518Srobert }; 84*12c85518Srobert 85*12c85518Srobert class LLVM_LIBRARY_VISIBILITY LoongArch32TargetInfo 86*12c85518Srobert : public LoongArchTargetInfo { 87*12c85518Srobert public: LoongArch32TargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)88*12c85518Srobert LoongArch32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 89*12c85518Srobert : LoongArchTargetInfo(Triple, Opts) { 90*12c85518Srobert IntPtrType = SignedInt; 91*12c85518Srobert PtrDiffType = SignedInt; 92*12c85518Srobert SizeType = UnsignedInt; 93*12c85518Srobert resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128"); 94*12c85518Srobert // TODO: select appropriate ABI. 95*12c85518Srobert setABI("ilp32d"); 96*12c85518Srobert } 97*12c85518Srobert setABI(const std::string & Name)98*12c85518Srobert bool setABI(const std::string &Name) override { 99*12c85518Srobert if (Name == "ilp32d" || Name == "ilp32f" || Name == "ilp32s") { 100*12c85518Srobert ABI = Name; 101*12c85518Srobert return true; 102*12c85518Srobert } 103*12c85518Srobert return false; 104*12c85518Srobert } setMaxAtomicWidth()105*12c85518Srobert void setMaxAtomicWidth() override { 106*12c85518Srobert MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 107*12c85518Srobert } 108*12c85518Srobert }; 109*12c85518Srobert 110*12c85518Srobert class LLVM_LIBRARY_VISIBILITY LoongArch64TargetInfo 111*12c85518Srobert : public LoongArchTargetInfo { 112*12c85518Srobert public: LoongArch64TargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)113*12c85518Srobert LoongArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 114*12c85518Srobert : LoongArchTargetInfo(Triple, Opts) { 115*12c85518Srobert LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 116*12c85518Srobert IntMaxType = Int64Type = SignedLong; 117*12c85518Srobert resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n64-S128"); 118*12c85518Srobert // TODO: select appropriate ABI. 119*12c85518Srobert setABI("lp64d"); 120*12c85518Srobert } 121*12c85518Srobert setABI(const std::string & Name)122*12c85518Srobert bool setABI(const std::string &Name) override { 123*12c85518Srobert if (Name == "lp64d" || Name == "lp64f" || Name == "lp64s") { 124*12c85518Srobert ABI = Name; 125*12c85518Srobert return true; 126*12c85518Srobert } 127*12c85518Srobert return false; 128*12c85518Srobert } setMaxAtomicWidth()129*12c85518Srobert void setMaxAtomicWidth() override { 130*12c85518Srobert MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64; 131*12c85518Srobert } 132*12c85518Srobert }; 133*12c85518Srobert } // end namespace targets 134*12c85518Srobert } // end namespace clang 135*12c85518Srobert 136*12c85518Srobert #endif // LLVM_CLANG_LIB_BASIC_TARGETS_LOONGARCH_H 137