clang 23.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",
81 "r9", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17",
82 "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26",
83 "r27", "r28", "r29", "r30", "r31", "__SP_L__", "__SP_H__"};
85 }
86
88 return {};
89 }
90
92 static const TargetInfo::AddlRegName AddlRegNames[] = {
93 {{"xl", "X"}, 26}, {{"xh"}, 27}, {{"yl", "Y"}, 28},
94 {{"yh"}, 29}, {{"zl", "Z"}, 30}, {{"zh"}, 31}};
96 }
97
98 bool validateAsmConstraint(const char *&Name,
99 TargetInfo::ConstraintInfo &Info) const override {
100 // There aren't any multi-character AVR specific constraints.
101 if (StringRef(Name).size() > 1)
102 return false;
103
104 switch (*Name) {
105 default:
106 return false;
107 case 'a': // Simple upper registers
108 case 'b': // Base pointer registers pairs
109 case 'd': // Upper register
110 case 'l': // Lower registers
111 case 'e': // Pointer register pairs
112 case 'q': // Stack pointer register
113 case 'r': // Any register
114 case 'w': // Special upper register pairs
115 case 't': // Temporary register
116 case 'x':
117 case 'X': // Pointer register pair X
118 case 'y':
119 case 'Y': // Pointer register pair Y
120 case 'z':
121 case 'Z': // Pointer register pair Z
122 Info.setAllowsRegister();
123 return true;
124 case 'I': // 6-bit positive integer constant
125 // Due to issue https://github.com/llvm/llvm-project/issues/51513, we
126 // allow value 64 in the frontend and let it be denied in the backend.
127 Info.setRequiresImmediate(0, 64);
128 return true;
129 case 'J': // 6-bit negative integer constant
130 Info.setRequiresImmediate(-63, 0);
131 return true;
132 case 'K': // Integer constant (Range: 2)
133 Info.setRequiresImmediate(2);
134 return true;
135 case 'L': // Integer constant (Range: 0)
136 Info.setRequiresImmediate(0);
137 return true;
138 case 'M': // 8-bit integer constant
139 Info.setRequiresImmediate(0, 0xff);
140 return true;
141 case 'N': // Integer constant (Range: -1)
142 Info.setRequiresImmediate(-1);
143 return true;
144 case 'O': // Integer constant (Range: 8, 16, 24)
145 Info.setRequiresImmediate({8, 16, 24});
146 return true;
147 case 'P': // Integer constant (Range: 1)
148 Info.setRequiresImmediate(1);
149 return true;
150 case 'R': // Integer constant (Range: -6 to 5)
151 Info.setRequiresImmediate(-6, 5);
152 return true;
153 case 'G': // Floating point constant 0.0
154 Info.setRequiresImmediate(0);
155 return true;
156 case 'Q': // A memory address based on Y or Z pointer with displacement.
157 return true;
158 }
159
160 return false;
161 }
162
163 IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
164 // AVR prefers int for 16-bit integers.
165 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
166 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
167 }
168
169 IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {
170 // AVR uses int for int_least16_t and int_fast16_t.
171 return BitWidth == 16
172 ? (IsSigned ? SignedInt : UnsignedInt)
173 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
174 }
175
176 bool isValidCPUName(StringRef Name) const override;
177 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
178 bool setCPU(const std::string &Name) override;
179 std::optional<std::string> handleAsmEscapedChar(char EscChar) const override;
180 StringRef getABI() const override { return ABI; }
181
182 std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
183 return std::make_pair(32, 32);
184 }
185
186protected:
187 std::string CPU;
188 StringRef ABI;
189 StringRef DefineName;
190 StringRef Arch;
192};
193
194} // namespace targets
195} // namespace clang
196
197#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:334
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
Definition TargetInfo.h:339
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:98
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:87
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:169
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:180
ArrayRef< TargetInfo::AddlRegName > getGCCAddlRegNames() const override
Definition AVR.h:91
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:182
IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final
Return integer type with specified width.
Definition AVR.h:163
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:144
IntType
===-— Target Data Type Query Methods ----------------------------—===//
Definition TargetInfo.h:147
const llvm::fltSemantics * LongDoubleFormat
Definition TargetInfo.h:144
unsigned char DefaultAlignForAttributeAligned
Definition TargetInfo.h:134