blob: cb45c8205fbee28f1abbedc427038254d75a103a [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- AArch64.h - Declare AArch64 target feature support -----*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Erich Keaneebba5922017-07-21 22:37:03 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file declares AArch64 TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H
14#define LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H
15
16#include "OSTargets.h"
17#include "clang/Basic/TargetBuiltins.h"
18#include "llvm/Support/TargetParser.h"
19
20namespace clang {
21namespace targets {
22
23class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo {
24 virtual void setDataLayout() = 0;
25 static const TargetInfo::GCCRegAlias GCCRegAliases[];
26 static const char *const GCCRegNames[];
27
28 enum FPUModeEnum { FPUMode, NeonMode = (1 << 0), SveMode = (1 << 1) };
29
30 unsigned FPU;
31 unsigned CRC;
32 unsigned Crypto;
33 unsigned Unaligned;
34 unsigned HasFullFP16;
Junmo Park4b9b9fb2018-04-17 22:38:40 +000035 unsigned HasDotProd;
Bryan Chan223307b2018-10-25 23:47:00 +000036 unsigned HasFP16FML;
Erich Keaneebba5922017-07-21 22:37:03 +000037 llvm::AArch64::ArchKind ArchKind;
38
39 static const Builtin::Info BuiltinInfo[];
40
41 std::string ABI;
42
43public:
Tim Northoverad4c5db2017-07-24 17:06:23 +000044 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +000045
Tim Northoverad4c5db2017-07-24 17:06:23 +000046 StringRef getABI() const override;
47 bool setABI(const std::string &Name) override;
Erich Keaneebba5922017-07-21 22:37:03 +000048
Tim Northoverad4c5db2017-07-24 17:06:23 +000049 bool isValidCPUName(StringRef Name) const override;
Erich Keane3ec17432018-02-08 23:14:15 +000050 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
Tim Northoverad4c5db2017-07-24 17:06:23 +000051 bool setCPU(const std::string &Name) override;
Erich Keaneebba5922017-07-21 22:37:03 +000052
Akira Hatanaka502775a2017-12-09 00:02:37 +000053 bool useFP16ConversionIntrinsics() const override {
54 return false;
55 }
56
Erich Keaneebba5922017-07-21 22:37:03 +000057 void getTargetDefinesARMV81A(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +000058 MacroBuilder &Builder) const;
Erich Keaneebba5922017-07-21 22:37:03 +000059 void getTargetDefinesARMV82A(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +000060 MacroBuilder &Builder) const;
Erich Keaneebba5922017-07-21 22:37:03 +000061 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +000062 MacroBuilder &Builder) const override;
Erich Keaneebba5922017-07-21 22:37:03 +000063
Tim Northoverad4c5db2017-07-24 17:06:23 +000064 ArrayRef<Builtin::Info> getTargetBuiltins() const override;
Erich Keaneebba5922017-07-21 22:37:03 +000065
Tim Northoverad4c5db2017-07-24 17:06:23 +000066 bool hasFeature(StringRef Feature) const override;
Erich Keaneebba5922017-07-21 22:37:03 +000067 bool handleTargetFeatures(std::vector<std::string> &Features,
Tim Northoverad4c5db2017-07-24 17:06:23 +000068 DiagnosticsEngine &Diags) override;
Erich Keaneebba5922017-07-21 22:37:03 +000069
Tim Northoverad4c5db2017-07-24 17:06:23 +000070 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
Erich Keaneebba5922017-07-21 22:37:03 +000071
Tim Northoverad4c5db2017-07-24 17:06:23 +000072 bool isCLZForZeroUndef() const override;
Erich Keaneebba5922017-07-21 22:37:03 +000073
Tim Northoverad4c5db2017-07-24 17:06:23 +000074 BuiltinVaListKind getBuiltinVaListKind() const override;
Erich Keaneebba5922017-07-21 22:37:03 +000075
76 ArrayRef<const char *> getGCCRegNames() const override;
77 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Erich Keaneebba5922017-07-21 22:37:03 +000078 bool validateAsmConstraint(const char *&Name,
Tim Northoverad4c5db2017-07-24 17:06:23 +000079 TargetInfo::ConstraintInfo &Info) const override;
Erich Keaneebba5922017-07-21 22:37:03 +000080 bool
81 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Tim Northoverad4c5db2017-07-24 17:06:23 +000082 std::string &SuggestedModifier) const override;
83 const char *getClobbers() const override;
Erich Keaneebba5922017-07-21 22:37:03 +000084
Mikhail Maltsev89f7b462018-04-30 09:11:08 +000085 StringRef getConstraintRegister(StringRef Constraint,
86 StringRef Expression) const override {
87 return Expression;
88 }
89
Tim Northoverad4c5db2017-07-24 17:06:23 +000090 int getEHDataRegisterNumber(unsigned RegNo) const override;
Erich Keaneebba5922017-07-21 22:37:03 +000091};
92
93class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {
Erich Keaneebba5922017-07-21 22:37:03 +000094public:
Tim Northoverad4c5db2017-07-24 17:06:23 +000095 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
96
Erich Keaneebba5922017-07-21 22:37:03 +000097 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +000098 MacroBuilder &Builder) const override;
99private:
100 void setDataLayout() override;
Erich Keaneebba5922017-07-21 22:37:03 +0000101};
102
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000103class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo
Erich Keaneebba5922017-07-21 22:37:03 +0000104 : public WindowsTargetInfo<AArch64leTargetInfo> {
105 const llvm::Triple Triple;
106
107public:
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000108 WindowsARM64TargetInfo(const llvm::Triple &Triple,
109 const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000110
Tim Northoverad4c5db2017-07-24 17:06:23 +0000111 void setDataLayout() override;
Erich Keaneebba5922017-07-21 22:37:03 +0000112
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000113 BuiltinVaListKind getBuiltinVaListKind() const override;
114
115 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
116};
117
118// Windows ARM, MS (C++) ABI
119class LLVM_LIBRARY_VISIBILITY MicrosoftARM64TargetInfo
120 : public WindowsARM64TargetInfo {
121public:
122 MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
123 const TargetOptions &Opts);
124
Erich Keaneebba5922017-07-21 22:37:03 +0000125 void getVisualStudioDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000126 MacroBuilder &Builder) const;
Erich Keaneebba5922017-07-21 22:37:03 +0000127 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000128 MacroBuilder &Builder) const override;
Sanjin Sijaric56391d62018-07-26 22:18:28 +0000129 TargetInfo::CallingConvKind
130 getCallingConvKind(bool ClangABICompat4) const override;
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000131};
Erich Keaneebba5922017-07-21 22:37:03 +0000132
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000133// ARM64 MinGW target
134class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo
135 : public WindowsARM64TargetInfo {
136public:
137 MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000138};
139
140class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {
Erich Keaneebba5922017-07-21 22:37:03 +0000141public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000142 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000143 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000144 MacroBuilder &Builder) const override;
145
146private:
147 void setDataLayout() override;
Erich Keaneebba5922017-07-21 22:37:03 +0000148};
149
150class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
151 : public DarwinTargetInfo<AArch64leTargetInfo> {
Erich Keaneebba5922017-07-21 22:37:03 +0000152public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000153 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000154
Tim Northoverad4c5db2017-07-24 17:06:23 +0000155 BuiltinVaListKind getBuiltinVaListKind() const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000156
Tim Northoverad4c5db2017-07-24 17:06:23 +0000157 protected:
158 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
159 MacroBuilder &Builder) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000160};
161
162// 64-bit RenderScript is aarch64
163class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo
164 : public AArch64leTargetInfo {
165public:
166 RenderScript64TargetInfo(const llvm::Triple &Triple,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000167 const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000168
169 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000170 MacroBuilder &Builder) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000171};
172
173} // namespace targets
174} // namespace clang
175
176#endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H