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