ARM.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. //===--- ARM.h - Declare ARM 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 ARM TargetInfo objects.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H
  13. #define LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H
  14. #include "OSTargets.h"
  15. #include "clang/Basic/TargetInfo.h"
  16. #include "clang/Basic/TargetOptions.h"
  17. #include "llvm/ADT/Triple.h"
  18. #include "llvm/Support/Compiler.h"
  19. #include "llvm/Support/TargetParser.h"
  20. namespace clang {
  21. namespace targets {
  22. class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
  23. // Possible FPU choices.
  24. enum FPUMode {
  25. VFP2FPU = (1 << 0),
  26. VFP3FPU = (1 << 1),
  27. VFP4FPU = (1 << 2),
  28. NeonFPU = (1 << 3),
  29. FPARMV8 = (1 << 4)
  30. };
  31. enum MVEMode {
  32. MVE_INT = (1 << 0),
  33. MVE_FP = (1 << 1)
  34. };
  35. // Possible HWDiv features.
  36. enum HWDivMode { HWDivThumb = (1 << 0), HWDivARM = (1 << 1) };
  37. static bool FPUModeIsVFP(FPUMode Mode) {
  38. return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
  39. }
  40. static const TargetInfo::GCCRegAlias GCCRegAliases[];
  41. static const char *const GCCRegNames[];
  42. std::string ABI, CPU;
  43. StringRef CPUProfile;
  44. StringRef CPUAttr;
  45. enum { FP_Default, FP_VFP, FP_Neon } FPMath;
  46. llvm::ARM::ISAKind ArchISA;
  47. llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
  48. llvm::ARM::ProfileKind ArchProfile;
  49. unsigned ArchVersion;
  50. unsigned FPU : 5;
  51. unsigned MVE : 2;
  52. unsigned IsAAPCS : 1;
  53. unsigned HWDiv : 2;
  54. // Initialized via features.
  55. unsigned SoftFloat : 1;
  56. unsigned SoftFloatABI : 1;
  57. unsigned CRC : 1;
  58. unsigned Crypto : 1;
  59. unsigned DSP : 1;
  60. unsigned Unaligned : 1;
  61. unsigned DotProd : 1;
  62. enum {
  63. LDREX_B = (1 << 0), /// byte (8-bit)
  64. LDREX_H = (1 << 1), /// half (16-bit)
  65. LDREX_W = (1 << 2), /// word (32-bit)
  66. LDREX_D = (1 << 3), /// double (64-bit)
  67. };
  68. uint32_t LDREX;
  69. // ACLE 6.5.1 Hardware floating point
  70. enum {
  71. HW_FP_HP = (1 << 1), /// half (16-bit)
  72. HW_FP_SP = (1 << 2), /// single (32-bit)
  73. HW_FP_DP = (1 << 3), /// double (64-bit)
  74. };
  75. uint32_t HW_FP;
  76. static const Builtin::Info BuiltinInfo[];
  77. void setABIAAPCS();
  78. void setABIAPCS(bool IsAAPCS16);
  79. void setArchInfo();
  80. void setArchInfo(llvm::ARM::ArchKind Kind);
  81. void setAtomic();
  82. bool isThumb() const;
  83. bool supportsThumb() const;
  84. bool supportsThumb2() const;
  85. bool hasMVE() const;
  86. bool hasMVEFloat() const;
  87. StringRef getCPUAttr() const;
  88. StringRef getCPUProfile() const;
  89. public:
  90. ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  91. StringRef getABI() const override;
  92. bool setABI(const std::string &Name) override;
  93. // FIXME: This should be based on Arch attributes, not CPU names.
  94. bool
  95. initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
  96. StringRef CPU,
  97. const std::vector<std::string> &FeaturesVec) const override;
  98. bool isValidFeatureName(StringRef Feature) const override {
  99. // We pass soft-float-abi in as a -target-feature, but the backend figures
  100. // this out through other means.
  101. return Feature != "soft-float-abi";
  102. }
  103. bool handleTargetFeatures(std::vector<std::string> &Features,
  104. DiagnosticsEngine &Diags) override;
  105. bool hasFeature(StringRef Feature) const override;
  106. bool isValidCPUName(StringRef Name) const override;
  107. void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
  108. bool setCPU(const std::string &Name) override;
  109. bool setFPMath(StringRef Name) override;
  110. bool useFP16ConversionIntrinsics() const override {
  111. return false;
  112. }
  113. void getTargetDefinesARMV81A(const LangOptions &Opts,
  114. MacroBuilder &Builder) const;
  115. void getTargetDefinesARMV82A(const LangOptions &Opts,
  116. MacroBuilder &Builder) const;
  117. void getTargetDefines(const LangOptions &Opts,
  118. MacroBuilder &Builder) const override;
  119. ArrayRef<Builtin::Info> getTargetBuiltins() const override;
  120. bool isCLZForZeroUndef() const override;
  121. BuiltinVaListKind getBuiltinVaListKind() const override;
  122. ArrayRef<const char *> getGCCRegNames() const override;
  123. ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
  124. bool validateAsmConstraint(const char *&Name,
  125. TargetInfo::ConstraintInfo &Info) const override;
  126. std::string convertConstraint(const char *&Constraint) const override;
  127. bool
  128. validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
  129. std::string &SuggestedModifier) const override;
  130. const char *getClobbers() const override;
  131. StringRef getConstraintRegister(StringRef Constraint,
  132. StringRef Expression) const override {
  133. return Expression;
  134. }
  135. CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
  136. int getEHDataRegisterNumber(unsigned RegNo) const override;
  137. bool hasSjLjLowering() const override;
  138. };
  139. class LLVM_LIBRARY_VISIBILITY ARMleTargetInfo : public ARMTargetInfo {
  140. public:
  141. ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  142. void getTargetDefines(const LangOptions &Opts,
  143. MacroBuilder &Builder) const override;
  144. };
  145. class LLVM_LIBRARY_VISIBILITY ARMbeTargetInfo : public ARMTargetInfo {
  146. public:
  147. ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  148. void getTargetDefines(const LangOptions &Opts,
  149. MacroBuilder &Builder) const override;
  150. };
  151. class LLVM_LIBRARY_VISIBILITY WindowsARMTargetInfo
  152. : public WindowsTargetInfo<ARMleTargetInfo> {
  153. const llvm::Triple Triple;
  154. public:
  155. WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  156. void getVisualStudioDefines(const LangOptions &Opts,
  157. MacroBuilder &Builder) const;
  158. BuiltinVaListKind getBuiltinVaListKind() const override;
  159. CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
  160. };
  161. // Windows ARM + Itanium C++ ABI Target
  162. class LLVM_LIBRARY_VISIBILITY ItaniumWindowsARMleTargetInfo
  163. : public WindowsARMTargetInfo {
  164. public:
  165. ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
  166. const TargetOptions &Opts);
  167. void getTargetDefines(const LangOptions &Opts,
  168. MacroBuilder &Builder) const override;
  169. };
  170. // Windows ARM, MS (C++) ABI
  171. class LLVM_LIBRARY_VISIBILITY MicrosoftARMleTargetInfo
  172. : public WindowsARMTargetInfo {
  173. public:
  174. MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
  175. const TargetOptions &Opts);
  176. void getTargetDefines(const LangOptions &Opts,
  177. MacroBuilder &Builder) const override;
  178. };
  179. // ARM MinGW target
  180. class LLVM_LIBRARY_VISIBILITY MinGWARMTargetInfo : public WindowsARMTargetInfo {
  181. public:
  182. MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  183. void getTargetDefines(const LangOptions &Opts,
  184. MacroBuilder &Builder) const override;
  185. };
  186. // ARM Cygwin target
  187. class LLVM_LIBRARY_VISIBILITY CygwinARMTargetInfo : public ARMleTargetInfo {
  188. public:
  189. CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  190. void getTargetDefines(const LangOptions &Opts,
  191. MacroBuilder &Builder) const override;
  192. };
  193. class LLVM_LIBRARY_VISIBILITY DarwinARMTargetInfo
  194. : public DarwinTargetInfo<ARMleTargetInfo> {
  195. protected:
  196. void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
  197. MacroBuilder &Builder) const override;
  198. public:
  199. DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
  200. };
  201. // 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
  202. class LLVM_LIBRARY_VISIBILITY RenderScript32TargetInfo
  203. : public ARMleTargetInfo {
  204. public:
  205. RenderScript32TargetInfo(const llvm::Triple &Triple,
  206. const TargetOptions &Opts);
  207. void getTargetDefines(const LangOptions &Opts,
  208. MacroBuilder &Builder) const override;
  209. };
  210. } // namespace targets
  211. } // namespace clang
  212. #endif // LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H