1 //===--- AVR.h - Declare AVR target feature support -------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file declares AVR TargetInfo objects.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
15 #define LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
17 #include "clang/Basic/TargetInfo.h"
18 #include "clang/Basic/TargetOptions.h"
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/Support/Compiler.h"
26 class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
28 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
29 : TargetInfo(Triple) {
40 DefaultAlignForAttributeAligned = 8;
47 DoubleFormat = &llvm::APFloat::IEEEsingle();
50 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
51 SizeType = UnsignedInt;
52 PtrDiffType = SignedInt;
53 IntPtrType = SignedInt;
54 Char16Type = UnsignedInt;
56 Char32Type = UnsignedLong;
57 SigAtomicType = SignedChar;
58 resetDataLayout("e-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");
61 void getTargetDefines(const LangOptions &Opts,
62 MacroBuilder &Builder) const override;
64 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
66 BuiltinVaListKind getBuiltinVaListKind() const override {
67 return TargetInfo::VoidPtrBuiltinVaList;
70 const char *getClobbers() const override { return ""; }
72 ArrayRef<const char *> getGCCRegNames() const override {
73 static const char *const GCCRegNames[] = {
74 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
75 "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
76 "r20", "r21", "r22", "r23", "r24", "r25", "X", "Y", "Z", "SP"
78 return llvm::makeArrayRef(GCCRegNames);
81 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
85 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
86 static const TargetInfo::AddlRegName AddlRegNames[] = {
92 return llvm::makeArrayRef(AddlRegNames);
95 bool validateAsmConstraint(const char *&Name,
96 TargetInfo::ConstraintInfo &Info) const override {
97 // There aren't any multi-character AVR specific constraints.
98 if (StringRef(Name).size() > 1)
104 case 'a': // Simple upper registers
105 case 'b': // Base pointer registers pairs
106 case 'd': // Upper register
107 case 'l': // Lower registers
108 case 'e': // Pointer register pairs
109 case 'q': // Stack pointer register
110 case 'r': // Any register
111 case 'w': // Special upper register pairs
112 case 't': // Temporary register
114 case 'X': // Pointer register pair X
116 case 'Y': // Pointer register pair Y
118 case 'Z': // Pointer register pair Z
119 Info.setAllowsRegister();
121 case 'I': // 6-bit positive integer constant
122 Info.setRequiresImmediate(0, 63);
124 case 'J': // 6-bit negative integer constant
125 Info.setRequiresImmediate(-63, 0);
127 case 'K': // Integer constant (Range: 2)
128 Info.setRequiresImmediate(2);
130 case 'L': // Integer constant (Range: 0)
131 Info.setRequiresImmediate(0);
133 case 'M': // 8-bit integer constant
134 Info.setRequiresImmediate(0, 0xff);
136 case 'N': // Integer constant (Range: -1)
137 Info.setRequiresImmediate(-1);
139 case 'O': // Integer constant (Range: 8, 16, 24)
140 Info.setRequiresImmediate({8, 16, 24});
142 case 'P': // Integer constant (Range: 1)
143 Info.setRequiresImmediate(1);
145 case 'R': // Integer constant (Range: -6 to 5)
146 Info.setRequiresImmediate(-6, 5);
148 case 'G': // Floating point constant
149 case 'Q': // A memory address based on Y or Z pointer with displacement.
156 IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
157 // AVR prefers int for 16-bit integers.
158 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
159 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
162 IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
163 // AVR uses int for int_least16_t and int_fast16_t.
164 return BitWidth == 16
165 ? (IsSigned ? SignedInt : UnsignedInt)
166 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
169 bool isValidCPUName(StringRef Name) const override;
170 bool setCPU(const std::string &Name) override {
171 bool isValid = isValidCPUName(Name);
181 } // namespace targets
184 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H