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