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();
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.
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
Definition TargetInfo.h:333
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
Definition TargetInfo.h:338
virtual IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const
Return integer type with specified width.
void resetDataLayout(StringRef DL)
Set the data layout to the given string.
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