clang 22.0.0git
AVR.h
Go to the documentation of this file.
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
13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
14#define LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
15
18#include "llvm/Support/Compiler.h"
19#include "llvm/TargetParser/Triple.h"
20
21namespace clang {
22namespace targets {
23
24// AVR Target
25class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {
26public:
27 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
28 : TargetInfo(Triple) {
29 TLSSupported = false;
30 PointerWidth = 16;
31 PointerAlign = 8;
32 ShortWidth = 16;
33 ShortAlign = 8;
34 IntWidth = 16;
35 IntAlign = 8;
36 LongWidth = 32;
37 LongAlign = 8;
38 LongLongWidth = 64;
39 LongLongAlign = 8;
40 SuitableAlign = 8;
42 HalfWidth = 16;
43 HalfAlign = 8;
44 FloatWidth = 32;
45 FloatAlign = 8;
46 DoubleWidth = 32;
47 DoubleAlign = 8;
48 DoubleFormat = &llvm::APFloat::IEEEsingle();
49 LongDoubleWidth = 32;
51 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
60 resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8:16-a:8");
61 }
62
63 void getTargetDefines(const LangOptions &Opts,
64 MacroBuilder &Builder) const override;
65
67 return {};
68 }
69
70 bool allowsLargerPreferedTypeAlignment() const override { return false; }
71
75
76 std::string_view getClobbers() const override { return ""; }
77
79 static const char *const GCCRegNames[] = {
80 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",
81 "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
82 "r20", "r21", "r22", "r23", "r24", "r25", "X", "Y", "Z", "SP"};
84 }
85
87 return {};
88 }
89
91 static const TargetInfo::AddlRegName AddlRegNames[] = {
92 {{"r26", "r27"}, 26},
93 {{"r28", "r29"}, 27},
94 {{"r30", "r31"}, 28},
95 {{"SPL", "SPH"}, 29},
96 };
98 }
99
100 bool validateAsmConstraint(const char *&Name,
101 TargetInfo::ConstraintInfo &Info) const override {
102 // There aren't any multi-character AVR specific constraints.
103 if (StringRef(Name).size() > 1)
104 return false;
105
106 switch (*Name) {
107 default:
108 return false;
109 case 'a': // Simple upper registers
110 case 'b': // Base pointer registers pairs
111 case 'd': // Upper register
112 case 'l': // Lower registers
113 case 'e': // Pointer register pairs
114 case 'q': // Stack pointer register
115 case 'r': // Any register
116 case 'w': // Special upper register pairs
117 case 't': // Temporary register
118 case 'x':
119 case 'X': // Pointer register pair X
120 case 'y':
121 case 'Y': // Pointer register pair Y
122 case 'z':
123 case 'Z': // Pointer register pair Z
124 Info.setAllowsRegister();
125 return true;
126 case 'I': // 6-bit positive integer constant
127 // Due to issue https://github.com/llvm/llvm-project/issues/51513, we
128 // allow value 64 in the frontend and let it be denied in the backend.
129 Info.setRequiresImmediate(0, 64);
130 return true;
131 case 'J': // 6-bit negative integer constant
132 Info.setRequiresImmediate(-63, 0);
133 return true;
134 case 'K': // Integer constant (Range: 2)
135 Info.setRequiresImmediate(2);
136 return true;
137 case 'L': // Integer constant (Range: 0)
138 Info.setRequiresImmediate(0);
139 return true;
140 case 'M': // 8-bit integer constant
141 Info.setRequiresImmediate(0, 0xff);
142 return true;
143 case 'N': // Integer constant (Range: -1)
144 Info.setRequiresImmediate(-1);
145 return true;
146 case 'O': // Integer constant (Range: 8, 16, 24)
147 Info.setRequiresImmediate({8, 16, 24});
148 return true;
149 case 'P': // Integer constant (Range: 1)
150 Info.setRequiresImmediate(1);
151 return true;
152 case 'R': // Integer constant (Range: -6 to 5)
153 Info.setRequiresImmediate(-6, 5);
154 return true;
155 case 'G': // Floating point constant 0.0
156 Info.setRequiresImmediate(0);
157 return true;
158 case 'Q': // A memory address based on Y or Z pointer with displacement.
159 return true;
160 }
161
162 return false;
163 }
164
165 IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
166 // AVR prefers int for 16-bit integers.
167 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
168 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
169 }
170
171 IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
172 // AVR uses int for int_least16_t and int_fast16_t.
173 return BitWidth == 16
174 ? (IsSigned ? SignedInt : UnsignedInt)
175 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
176 }
177
178 bool isValidCPUName(StringRef Name) const override;
179 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
180 bool setCPU(const std::string &Name) override;
181 std::optional<std::string> handleAsmEscapedChar(char EscChar) const override;
182 StringRef getABI() const override { return ABI; }
183
184 std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
185 return std::make_pair(32, 32);
186 }
187
188protected:
189 std::string CPU;
190 StringRef ABI;
191 StringRef DefineName;
192 StringRef Arch;
194};
195
196} // namespace targets
197} // namespace clang
198
199#endif // LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H
Defines the clang::TargetOptions class.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
TargetInfo(const llvm::Triple &T)
virtual IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return the smallest integer type with at least the specified width.
void resetDataLayout(StringRef DL, const char *UserLabelPrefix="")
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
Definition TargetInfo.h:330
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
Definition TargetInfo.h:335
virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return integer type with specified width.
Options for controlling the target.
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
Definition AVR.h:100
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
Definition AVR.h:72
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
Definition AVR.h:76
ArrayRef< const char * > getGCCRegNames() const override
Definition AVR.h:78
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition AVR.h:86
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
Definition AVR.h:66
IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final
Return the smallest integer type with at least the specified width.
Definition AVR.h:171
bool allowsLargerPreferedTypeAlignment() const override
Whether target allows to overalign ABI-specified preferred alignment.
Definition AVR.h:70
StringRef getABI() const override
Get the ABI currently in use.
Definition AVR.h:182
ArrayRef< TargetInfo::AddlRegName > getGCCAddlRegNames() const override
Definition AVR.h:90
std::pair< unsigned, unsigned > hardwareInterferenceSizes() const override
The first value in the pair is the minimum offset between two objects to avoid false sharing (destruc...
Definition AVR.h:184
IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final
Return integer type with specified width.
Definition AVR.h:165
AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Definition AVR.h:27
Defines the clang::TargetInfo interface.
const TargetInfo::AddlRegName AddlRegNames[]
Definition X86.cpp:100
static const char *const GCCRegNames[]
Definition X86.cpp:73
The JSON file list parser is used to communicate input to InstallAPI.
void setRequiresImmediate(int Min, int Max)
const llvm::fltSemantics * DoubleFormat
Definition TargetInfo.h:143
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Definition TargetInfo.h:146
const llvm::fltSemantics * LongDoubleFormat
Definition TargetInfo.h:143
unsigned char DefaultAlignForAttributeAligned
Definition TargetInfo.h:134