Clang Project

clang_source_code/lib/Basic/Targets/AArch64.h
1//===--- AArch64.h - Declare AArch64 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 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;
35  unsigned HasDotProd;
36  unsigned HasFP16FML;
37  llvm::AArch64::ArchKind ArchKind;
38
39  static const Builtin::Info BuiltinInfo[];
40
41  std::string ABI;
42
43public:
44  AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
45
46  StringRef getABI() const override;
47  bool setABI(const std::string &Name) override;
48
49  bool isValidCPUName(StringRef Name) const override;
50  void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
51  bool setCPU(const std::string &Name) override;
52
53  bool useFP16ConversionIntrinsics() const override {
54    return false;
55  }
56
57  void getTargetDefinesARMV81A(const LangOptions &Opts,
58                               MacroBuilder &Builder) const;
59  void getTargetDefinesARMV82A(const LangOptions &Opts,
60                               MacroBuilder &Builder) const;
61  void getTargetDefines(const LangOptions &Opts,
62                        MacroBuilder &Builder) const override;
63
64  ArrayRef<Builtin::Info> getTargetBuiltins() const override;
65
66  bool hasFeature(StringRef Feature) const override;
67  bool handleTargetFeatures(std::vector<std::string> &Features,
68                            DiagnosticsEngine &Diags) override;
69
70  CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
71
72  bool isCLZForZeroUndef() const override;
73
74  BuiltinVaListKind getBuiltinVaListKind() const override;
75
76  ArrayRef<const char *> getGCCRegNames() const override;
77  ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
78  bool validateAsmConstraint(const char *&Name,
79                             TargetInfo::ConstraintInfo &Info) const override;
80  bool
81  validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
82                             std::string &SuggestedModifier) const override;
83  const char *getClobbers() const override;
84
85  StringRef getConstraintRegister(StringRef Constraint,
86                                  StringRef Expression) const override {
87    return Expression;
88  }
89
90  int getEHDataRegisterNumber(unsigned RegNo) const override;
91};
92
93class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo {
94public:
95  AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
96
97  void getTargetDefines(const LangOptions &Opts,
98                            MacroBuilder &Builder) const override;
99private:
100  void setDataLayout() override;
101};
102
103class LLVM_LIBRARY_VISIBILITY WindowsARM64TargetInfo
104    : public WindowsTargetInfo<AArch64leTargetInfo> {
105  const llvm::Triple Triple;
106
107public:
108  WindowsARM64TargetInfo(const llvm::Triple &Triple,
109                         const TargetOptions &Opts);
110
111  void setDataLayout() override;
112
113  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
125  void getVisualStudioDefines(const LangOptions &Opts,
126                              MacroBuilder &Builder) const;
127  void getTargetDefines(const LangOptions &Opts,
128                        MacroBuilder &Builder) const override;
129  TargetInfo::CallingConvKind
130  getCallingConvKind(bool ClangABICompat4) const override;
131};
132
133// ARM64 MinGW target
134class LLVM_LIBRARY_VISIBILITY MinGWARM64TargetInfo
135    : public WindowsARM64TargetInfo {
136public:
137  MinGWARM64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
138};
139
140class LLVM_LIBRARY_VISIBILITY AArch64beTargetInfo : public AArch64TargetInfo {
141public:
142  AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
143  void getTargetDefines(const LangOptions &Opts,
144                        MacroBuilder &Builder) const override;
145
146private:
147  void setDataLayout() override;
148};
149
150class LLVM_LIBRARY_VISIBILITY DarwinAArch64TargetInfo
151    : public DarwinTargetInfo<AArch64leTargetInfo> {
152public:
153  DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
154
155  BuiltinVaListKind getBuiltinVaListKind() const override;
156
157 protected:
158  void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
159                    MacroBuilder &Builder) const override;
160};
161
162// 64-bit RenderScript is aarch64
163class LLVM_LIBRARY_VISIBILITY RenderScript64TargetInfo
164    : public AArch64leTargetInfo {
165public:
166  RenderScript64TargetInfo(const llvm::Triple &Triple,
167                           const TargetOptions &Opts);
168
169  void getTargetDefines(const LangOptions &Opts,
170                        MacroBuilder &Builder) const override;
171};
172
173// namespace targets
174// namespace clang
175
176#endif // LLVM_CLANG_LIB_BASIC_TARGETS_AARCH64_H
177