1e5dd7070Spatrick //===--- ARC.h - Declare ARC target feature support -------------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick // 9e5dd7070Spatrick // This file declares ARC TargetInfo objects. 10e5dd7070Spatrick // 11e5dd7070Spatrick //===----------------------------------------------------------------------===// 12e5dd7070Spatrick 13e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_ARC_H 14e5dd7070Spatrick #define LLVM_CLANG_LIB_BASIC_TARGETS_ARC_H 15e5dd7070Spatrick 16e5dd7070Spatrick #include "clang/Basic/TargetInfo.h" 17e5dd7070Spatrick #include "clang/Basic/TargetOptions.h" 18e5dd7070Spatrick #include "llvm/ADT/Triple.h" 19e5dd7070Spatrick #include "llvm/Support/Compiler.h" 20e5dd7070Spatrick 21e5dd7070Spatrick namespace clang { 22e5dd7070Spatrick namespace targets { 23e5dd7070Spatrick 24e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY ARCTargetInfo : public TargetInfo { 25e5dd7070Spatrick public: ARCTargetInfo(const llvm::Triple & Triple,const TargetOptions &)26e5dd7070Spatrick ARCTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 27e5dd7070Spatrick : TargetInfo(Triple) { 28e5dd7070Spatrick NoAsmVariants = true; 29e5dd7070Spatrick LongLongAlign = 32; 30e5dd7070Spatrick SuitableAlign = 32; 31e5dd7070Spatrick DoubleAlign = LongDoubleAlign = 32; 32e5dd7070Spatrick SizeType = UnsignedInt; 33e5dd7070Spatrick PtrDiffType = SignedInt; 34e5dd7070Spatrick IntPtrType = SignedInt; 35e5dd7070Spatrick UseZeroLengthBitfieldAlignment = true; 36e5dd7070Spatrick resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-" 37e5dd7070Spatrick "i32:32:32-f32:32:32-i64:32-f64:32-a:0:32-n32"); 38e5dd7070Spatrick } 39e5dd7070Spatrick 40e5dd7070Spatrick void getTargetDefines(const LangOptions &Opts, 41e5dd7070Spatrick MacroBuilder &Builder) const override; 42e5dd7070Spatrick getTargetBuiltins()43*12c85518Srobert ArrayRef<Builtin::Info> getTargetBuiltins() const override { 44*12c85518Srobert return std::nullopt; 45*12c85518Srobert } 46e5dd7070Spatrick getBuiltinVaListKind()47e5dd7070Spatrick BuiltinVaListKind getBuiltinVaListKind() const override { 48e5dd7070Spatrick return TargetInfo::VoidPtrBuiltinVaList; 49e5dd7070Spatrick } 50e5dd7070Spatrick getClobbers()51e5dd7070Spatrick const char *getClobbers() const override { return ""; } 52e5dd7070Spatrick getGCCRegNames()53e5dd7070Spatrick ArrayRef<const char *> getGCCRegNames() const override { 54e5dd7070Spatrick static const char *const GCCRegNames[] = { 55e5dd7070Spatrick "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", 56e5dd7070Spatrick "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", 57e5dd7070Spatrick "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", 58e5dd7070Spatrick "r24", "r25", "gp", "sp", "fp", "ilink1", "r30", "blink"}; 59*12c85518Srobert return llvm::ArrayRef(GCCRegNames); 60e5dd7070Spatrick } 61e5dd7070Spatrick getGCCRegAliases()62e5dd7070Spatrick ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 63*12c85518Srobert return std::nullopt; 64e5dd7070Spatrick } 65e5dd7070Spatrick validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info)66e5dd7070Spatrick bool validateAsmConstraint(const char *&Name, 67e5dd7070Spatrick TargetInfo::ConstraintInfo &Info) const override { 68e5dd7070Spatrick return false; 69e5dd7070Spatrick } 70ec727ea7Spatrick hasBitIntType()71*12c85518Srobert bool hasBitIntType() const override { return true; } 72*12c85518Srobert isCLZForZeroUndef()73*12c85518Srobert bool isCLZForZeroUndef() const override { return false; } 74e5dd7070Spatrick }; 75e5dd7070Spatrick 76e5dd7070Spatrick } // namespace targets 77e5dd7070Spatrick } // namespace clang 78e5dd7070Spatrick 79e5dd7070Spatrick #endif // LLVM_CLANG_LIB_BASIC_TARGETS_ARC_H 80