xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/LoongArch.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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