| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 1 | //===--- RISCV.h - Declare RISCV target feature support ---------*- C++ -*-===// | 
|  | 2 | // | 
| Chandler Carruth | 2946cd7 | 2019-01-19 08:50:56 +0000 | [diff] [blame] | 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 | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 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: | 
| Zakk Chen | 294d1ea | 2020-07-16 10:32:01 -0700 | [diff] [blame] | 27 | std::string ABI, CPU; | 
| Shiva Chen | 4891dbf | 2018-04-05 12:54:00 +0000 | [diff] [blame] | 28 | bool HasM; | 
|  | 29 | bool HasA; | 
|  | 30 | bool HasF; | 
|  | 31 | bool HasD; | 
|  | 32 | bool HasC; | 
| Scott Egerton | 61ff29637 | 2020-04-09 17:51:26 +0100 | [diff] [blame] | 33 | bool HasB; | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 34 |  | 
|  | 35 | public: | 
|  | 36 | RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &) | 
| Shiva Chen | 4891dbf | 2018-04-05 12:54:00 +0000 | [diff] [blame] | 37 | : TargetInfo(Triple), HasM(false), HasA(false), HasF(false), | 
| Scott Egerton | 61ff29637 | 2020-04-09 17:51:26 +0100 | [diff] [blame] | 38 | HasD(false), HasC(false), HasB(false) { | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 39 | LongDoubleWidth = 128; | 
|  | 40 | LongDoubleAlign = 128; | 
|  | 41 | LongDoubleFormat = &llvm::APFloat::IEEEquad(); | 
|  | 42 | SuitableAlign = 128; | 
|  | 43 | WCharType = SignedInt; | 
|  | 44 | WIntType = UnsignedInt; | 
|  | 45 | } | 
|  | 46 |  | 
| Zakk Chen | 294d1ea | 2020-07-16 10:32:01 -0700 | [diff] [blame] | 47 | bool setCPU(const std::string &Name) override { | 
|  | 48 | if (!isValidCPUName(Name)) | 
|  | 49 | return false; | 
|  | 50 | CPU = Name; | 
|  | 51 | return true; | 
|  | 52 | } | 
|  | 53 |  | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 54 | StringRef getABI() const override { return ABI; } | 
|  | 55 | void getTargetDefines(const LangOptions &Opts, | 
|  | 56 | MacroBuilder &Builder) const override; | 
|  | 57 |  | 
|  | 58 | ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; } | 
|  | 59 |  | 
|  | 60 | BuiltinVaListKind getBuiltinVaListKind() const override { | 
|  | 61 | return TargetInfo::VoidPtrBuiltinVaList; | 
|  | 62 | } | 
|  | 63 |  | 
|  | 64 | const char *getClobbers() const override { return ""; } | 
|  | 65 |  | 
|  | 66 | ArrayRef<const char *> getGCCRegNames() const override; | 
|  | 67 |  | 
| Alex Bradbury | 77d4a8f | 2019-07-08 09:38:06 +0000 | [diff] [blame] | 68 | int getEHDataRegisterNumber(unsigned RegNo) const override { | 
|  | 69 | if (RegNo == 0) | 
|  | 70 | return 10; | 
|  | 71 | else if (RegNo == 1) | 
|  | 72 | return 11; | 
|  | 73 | else | 
|  | 74 | return -1; | 
|  | 75 | } | 
|  | 76 |  | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 77 | ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; | 
|  | 78 |  | 
|  | 79 | bool validateAsmConstraint(const char *&Name, | 
| Lewis Revill | 5665ef3 | 2019-06-11 12:44:01 +0000 | [diff] [blame] | 80 | TargetInfo::ConstraintInfo &Info) const override; | 
| Shiva Chen | 4891dbf | 2018-04-05 12:54:00 +0000 | [diff] [blame] | 81 |  | 
|  | 82 | bool hasFeature(StringRef Feature) const override; | 
|  | 83 |  | 
|  | 84 | bool handleTargetFeatures(std::vector<std::string> &Features, | 
|  | 85 | DiagnosticsEngine &Diags) override; | 
| Erich Keane | 8a1c999 | 2020-04-29 12:48:07 -0700 | [diff] [blame] | 86 |  | 
|  | 87 | bool hasExtIntType() const override { return true; } | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 88 | }; | 
|  | 89 | class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo { | 
|  | 90 | public: | 
|  | 91 | RISCV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) | 
|  | 92 | : RISCVTargetInfo(Triple, Opts) { | 
|  | 93 | IntPtrType = SignedInt; | 
|  | 94 | PtrDiffType = SignedInt; | 
|  | 95 | SizeType = UnsignedInt; | 
|  | 96 | resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128"); | 
|  | 97 | } | 
|  | 98 |  | 
|  | 99 | bool setABI(const std::string &Name) override { | 
| Alex Bradbury | e078967a | 2019-07-18 18:29:59 +0000 | [diff] [blame] | 100 | if (Name == "ilp32" || Name == "ilp32f" || Name == "ilp32d") { | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 101 | ABI = Name; | 
|  | 102 | return true; | 
|  | 103 | } | 
|  | 104 | return false; | 
|  | 105 | } | 
| Sam Elliott | f260630 | 2019-08-27 15:41:16 +0000 | [diff] [blame] | 106 |  | 
| Zakk Chen | 294d1ea | 2020-07-16 10:32:01 -0700 | [diff] [blame] | 107 | bool isValidCPUName(StringRef Name) const override; | 
|  | 108 | void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; | 
|  | 109 |  | 
| Sam Elliott | f260630 | 2019-08-27 15:41:16 +0000 | [diff] [blame] | 110 | void setMaxAtomicWidth() override { | 
|  | 111 | MaxAtomicPromoteWidth = 128; | 
|  | 112 |  | 
|  | 113 | if (HasA) | 
|  | 114 | MaxAtomicInlineWidth = 32; | 
|  | 115 | } | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 116 | }; | 
|  | 117 | class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : public RISCVTargetInfo { | 
|  | 118 | public: | 
|  | 119 | RISCV64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) | 
|  | 120 | : RISCVTargetInfo(Triple, Opts) { | 
|  | 121 | LongWidth = LongAlign = PointerWidth = PointerAlign = 64; | 
|  | 122 | IntMaxType = Int64Type = SignedLong; | 
|  | 123 | resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n64-S128"); | 
|  | 124 | } | 
|  | 125 |  | 
|  | 126 | bool setABI(const std::string &Name) override { | 
| Alex Bradbury | e078967a | 2019-07-18 18:29:59 +0000 | [diff] [blame] | 127 | if (Name == "lp64" || Name == "lp64f" || Name == "lp64d") { | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 128 | ABI = Name; | 
|  | 129 | return true; | 
|  | 130 | } | 
|  | 131 | return false; | 
|  | 132 | } | 
| Sam Elliott | f260630 | 2019-08-27 15:41:16 +0000 | [diff] [blame] | 133 |  | 
| Zakk Chen | 294d1ea | 2020-07-16 10:32:01 -0700 | [diff] [blame] | 134 | bool isValidCPUName(StringRef Name) const override; | 
|  | 135 | void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; | 
|  | 136 |  | 
| Sam Elliott | f260630 | 2019-08-27 15:41:16 +0000 | [diff] [blame] | 137 | void setMaxAtomicWidth() override { | 
|  | 138 | MaxAtomicPromoteWidth = 128; | 
|  | 139 |  | 
|  | 140 | if (HasA) | 
|  | 141 | MaxAtomicInlineWidth = 64; | 
|  | 142 | } | 
| Alex Bradbury | 71f4545 | 2018-01-11 13:36:56 +0000 | [diff] [blame] | 143 | }; | 
|  | 144 | } // namespace targets | 
|  | 145 | } // namespace clang | 
|  | 146 |  | 
|  | 147 | #endif // LLVM_CLANG_LIB_BASIC_TARGETS_RISCV_H |