Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/AVR.h
35268 views
//===--- AVR.h - Declare AVR target feature support -------------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file declares AVR TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H13#define LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H1415#include "clang/Basic/TargetInfo.h"16#include "clang/Basic/TargetOptions.h"17#include "llvm/Support/Compiler.h"18#include "llvm/TargetParser/Triple.h"1920namespace clang {21namespace targets {2223// AVR Target24class LLVM_LIBRARY_VISIBILITY AVRTargetInfo : public TargetInfo {25public:26AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)27: TargetInfo(Triple) {28TLSSupported = false;29PointerWidth = 16;30PointerAlign = 8;31IntWidth = 16;32IntAlign = 8;33LongWidth = 32;34LongAlign = 8;35LongLongWidth = 64;36LongLongAlign = 8;37SuitableAlign = 8;38DefaultAlignForAttributeAligned = 8;39HalfWidth = 16;40HalfAlign = 8;41FloatWidth = 32;42FloatAlign = 8;43DoubleWidth = 32;44DoubleAlign = 8;45DoubleFormat = &llvm::APFloat::IEEEsingle();46LongDoubleWidth = 32;47LongDoubleAlign = 8;48LongDoubleFormat = &llvm::APFloat::IEEEsingle();49SizeType = UnsignedInt;50PtrDiffType = SignedInt;51IntPtrType = SignedInt;52Char16Type = UnsignedInt;53WIntType = SignedInt;54Int16Type = SignedInt;55Char32Type = UnsignedLong;56SigAtomicType = SignedChar;57resetDataLayout("e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8");58}5960void getTargetDefines(const LangOptions &Opts,61MacroBuilder &Builder) const override;6263ArrayRef<Builtin::Info> getTargetBuiltins() const override {64return std::nullopt;65}6667BuiltinVaListKind getBuiltinVaListKind() const override {68return TargetInfo::VoidPtrBuiltinVaList;69}7071std::string_view getClobbers() const override { return ""; }7273ArrayRef<const char *> getGCCRegNames() const override {74static const char *const GCCRegNames[] = {75"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9",76"r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",77"r20", "r21", "r22", "r23", "r24", "r25", "X", "Y", "Z", "SP"};78return llvm::ArrayRef(GCCRegNames);79}8081ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {82return std::nullopt;83}8485ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {86static const TargetInfo::AddlRegName AddlRegNames[] = {87{{"r26", "r27"}, 26},88{{"r28", "r29"}, 27},89{{"r30", "r31"}, 28},90{{"SPL", "SPH"}, 29},91};92return llvm::ArrayRef(AddlRegNames);93}9495bool validateAsmConstraint(const char *&Name,96TargetInfo::ConstraintInfo &Info) const override {97// There aren't any multi-character AVR specific constraints.98if (StringRef(Name).size() > 1)99return false;100101switch (*Name) {102default:103return false;104case 'a': // Simple upper registers105case 'b': // Base pointer registers pairs106case 'd': // Upper register107case 'l': // Lower registers108case 'e': // Pointer register pairs109case 'q': // Stack pointer register110case 'r': // Any register111case 'w': // Special upper register pairs112case 't': // Temporary register113case 'x':114case 'X': // Pointer register pair X115case 'y':116case 'Y': // Pointer register pair Y117case 'z':118case 'Z': // Pointer register pair Z119Info.setAllowsRegister();120return true;121case 'I': // 6-bit positive integer constant122Info.setRequiresImmediate(0, 63);123return true;124case 'J': // 6-bit negative integer constant125Info.setRequiresImmediate(-63, 0);126return true;127case 'K': // Integer constant (Range: 2)128Info.setRequiresImmediate(2);129return true;130case 'L': // Integer constant (Range: 0)131Info.setRequiresImmediate(0);132return true;133case 'M': // 8-bit integer constant134Info.setRequiresImmediate(0, 0xff);135return true;136case 'N': // Integer constant (Range: -1)137Info.setRequiresImmediate(-1);138return true;139case 'O': // Integer constant (Range: 8, 16, 24)140Info.setRequiresImmediate({8, 16, 24});141return true;142case 'P': // Integer constant (Range: 1)143Info.setRequiresImmediate(1);144return true;145case 'R': // Integer constant (Range: -6 to 5)146Info.setRequiresImmediate(-6, 5);147return true;148case 'G': // Floating point constant 0.0149Info.setRequiresImmediate(0);150return true;151case 'Q': // A memory address based on Y or Z pointer with displacement.152return true;153}154155return false;156}157158IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {159// AVR prefers int for 16-bit integers.160return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)161: TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);162}163164IntType getLeastIntTypeByWidth(unsigned BitWidth, bool IsSigned) const final {165// AVR uses int for int_least16_t and int_fast16_t.166return BitWidth == 16167? (IsSigned ? SignedInt : UnsignedInt)168: TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);169}170171bool isValidCPUName(StringRef Name) const override;172void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;173bool setCPU(const std::string &Name) override;174std::optional<std::string> handleAsmEscapedChar(char EscChar) const override;175StringRef getABI() const override { return ABI; }176177std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {178return std::make_pair(32, 32);179}180181protected:182std::string CPU;183StringRef ABI;184StringRef DefineName;185StringRef Arch;186int NumFlashBanks = 0;187};188189} // namespace targets190} // namespace clang191192#endif // LLVM_CLANG_LIB_BASIC_TARGETS_AVR_H193194195