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