AVR.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. //===--- AVR.h - Declare AVR 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 AVR TargetInfo objects.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
  13. #define LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
  14. #include "clang/Basic/TargetInfo.h"
  15. #include "clang/Basic/TargetOptions.h"
  16. #include "llvm/ADT/Triple.h"
  17. #include "llvm/Support/Compiler.h"
  18. namespace clang {
  19. namespace targets {
  20. // AVR Target
  21. class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
  22. public:
  23. AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
  24. : TargetInfo(Triple) {
  25. TLSSupported = false;
  26. PointerWidth = 16;
  27. PointerAlign = 8;
  28. IntWidth = 16;
  29. IntAlign = 8;
  30. LongWidth = 32;
  31. LongAlign = 8;
  32. LongLongWidth = 64;
  33. LongLongAlign = 8;
  34. SuitableAlign = 8;
  35. DefaultAlignForAttributeAligned = 8;
  36. HalfWidth = 16;
  37. HalfAlign = 8;
  38. FloatWidth = 32;
  39. FloatAlign = 8;
  40. DoubleWidth = 32;
  41. DoubleAlign = 8;
  42. DoubleFormat = &llvm::APFloat::IEEEsingle();
  43. LongDoubleWidth = 32;
  44. LongDoubleAlign = 8;
  45. LongDoubleFormat = &llvm::APFloat::IEEEsingle();
  46. SizeType = UnsignedInt;
  47. PtrDiffType = SignedInt;
  48. IntPtrType = SignedInt;
  49. Char16Type = UnsignedInt;
  50. WIntType = SignedInt;
  51. Int16Type = SignedInt;
  52. Char32Type = UnsignedLong;
  53. SigAtomicType = SignedChar;
  54. resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");
  55. }
  56. void getTargetDefines(const LangOptions &Opts,
  57. MacroBuilder &Builder) const override;
  58. ArrayRef<Builtin::Info> getTargetBuiltins() const override {
  59. return std::nullopt;
  60. }
  61. BuiltinVaListKind getBuiltinVaListKind() const override {
  62. return TargetInfo::VoidPtrBuiltinVaList;
  63. }
  64. const char *getClobbers() const override { return ""; }
  65. ArrayRef<const char *> getGCCRegNames() const override {
  66. static const char *const GCCRegNames[] = {
  67. "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
  68. "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
  69. "r20", "r21", "r22", "r23", "r24", "r25", "X", "Y", "Z", "SP"};
  70. return llvm::ArrayRef(GCCRegNames);
  71. }
  72. ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
  73. return std::nullopt;
  74. }
  75. ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
  76. static const TargetInfo::AddlRegName AddlRegNames[] = {
  77. {{"r26", "r27"}, 26},
  78. {{"r28", "r29"}, 27},
  79. {{"r30", "r31"}, 28},
  80. {{"SPL", "SPH"}, 29},
  81. };
  82. return llvm::ArrayRef(AddlRegNames);
  83. }
  84. bool validateAsmConstraint(const char *&Name,
  85. TargetInfo::ConstraintInfo &Info) const override {
  86. // There aren't any multi-character AVR specific constraints.
  87. if (StringRef(Name).size() > 1)
  88. return false;
  89. switch (*Name) {
  90. default:
  91. return false;
  92. case 'a': // Simple upper registers
  93. case 'b': // Base pointer registers pairs
  94. case 'd': // Upper register
  95. case 'l': // Lower registers
  96. case 'e': // Pointer register pairs
  97. case 'q': // Stack pointer register
  98. case 'r': // Any register
  99. case 'w': // Special upper register pairs
  100. case 't': // Temporary register
  101. case 'x':
  102. case 'X': // Pointer register pair X
  103. case 'y':
  104. case 'Y': // Pointer register pair Y
  105. case 'z':
  106. case 'Z': // Pointer register pair Z
  107. Info.setAllowsRegister();
  108. return true;
  109. case 'I': // 6-bit positive integer constant
  110. Info.setRequiresImmediate(0, 63);
  111. return true;
  112. case 'J': // 6-bit negative integer constant
  113. Info.setRequiresImmediate(-63, 0);
  114. return true;
  115. case 'K': // Integer constant (Range: 2)
  116. Info.setRequiresImmediate(2);
  117. return true;
  118. case 'L': // Integer constant (Range: 0)
  119. Info.setRequiresImmediate(0);
  120. return true;
  121. case 'M': // 8-bit integer constant
  122. Info.setRequiresImmediate(0, 0xff);
  123. return true;
  124. case 'N': // Integer constant (Range: -1)
  125. Info.setRequiresImmediate(-1);
  126. return true;
  127. case 'O': // Integer constant (Range: 8, 16, 24)
  128. Info.setRequiresImmediate({8, 16, 24});
  129. return true;
  130. case 'P': // Integer constant (Range: 1)
  131. Info.setRequiresImmediate(1);
  132. return true;
  133. case 'R': // Integer constant (Range: -6 to 5)
  134. Info.setRequiresImmediate(-6, 5);
  135. return true;
  136. case 'G': // Floating point constant
  137. case 'Q': // A memory address based on Y or Z pointer with displacement.
  138. return true;
  139. }
  140. return false;
  141. }
  142. IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
  143. // AVR prefers int for 16-bit integers.
  144. return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
  145. : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
  146. }
  147. IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
  148. // AVR uses int for int_least16_t and int_fast16_t.
  149. return BitWidth == 16
  150. ? (IsSigned ? SignedInt : UnsignedInt)
  151. : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
  152. }
  153. bool isValidCPUName(StringRef Name) const override;
  154. void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
  155. bool setCPU(const std::string &Name) override;
  156. StringRef getABI() const override { return ABI; }
  157. protected:
  158. std::string CPU;
  159. StringRef ABI;
  160. StringRef DefineName;
  161. StringRef Arch;
  162. int NumFlashBanks = 0;
  163. };
  164. } // namespace targets
  165. } // namespace clang
  166. #endif // LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H