1e5dd7070Spatrick //===--- MSP430.h - Declare MSP430 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 MSP430 TargetInfo objects. 10e5dd7070Spatrick // 11e5dd7070Spatrick //===----------------------------------------------------------------------===// 12e5dd7070Spatrick 13e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_MSP430_H 14e5dd7070Spatrick #define LLVM_CLANG_LIB_BASIC_TARGETS_MSP430_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 MSP430TargetInfo : public TargetInfo { 25e5dd7070Spatrick static const char *const GCCRegNames[]; 26e5dd7070Spatrick 27e5dd7070Spatrick public: MSP430TargetInfo(const llvm::Triple & Triple,const TargetOptions &)28e5dd7070Spatrick MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &) 29e5dd7070Spatrick : TargetInfo(Triple) { 30e5dd7070Spatrick TLSSupported = false; 31e5dd7070Spatrick IntWidth = 16; 32e5dd7070Spatrick IntAlign = 16; 33e5dd7070Spatrick LongWidth = 32; 34e5dd7070Spatrick LongLongWidth = 64; 35e5dd7070Spatrick LongAlign = LongLongAlign = 16; 36e5dd7070Spatrick FloatWidth = 32; 37e5dd7070Spatrick FloatAlign = 16; 38e5dd7070Spatrick DoubleWidth = LongDoubleWidth = 64; 39e5dd7070Spatrick DoubleAlign = LongDoubleAlign = 16; 40e5dd7070Spatrick PointerWidth = 16; 41e5dd7070Spatrick PointerAlign = 16; 42e5dd7070Spatrick SuitableAlign = 16; 43e5dd7070Spatrick SizeType = UnsignedInt; 44e5dd7070Spatrick IntMaxType = SignedLongLong; 45e5dd7070Spatrick IntPtrType = SignedInt; 46e5dd7070Spatrick PtrDiffType = SignedInt; 47e5dd7070Spatrick SigAtomicType = SignedLong; 48e5dd7070Spatrick resetDataLayout("e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16"); 49e5dd7070Spatrick } 50e5dd7070Spatrick void getTargetDefines(const LangOptions &Opts, 51e5dd7070Spatrick MacroBuilder &Builder) const override; 52e5dd7070Spatrick getTargetBuiltins()53e5dd7070Spatrick ArrayRef<Builtin::Info> getTargetBuiltins() const override { 54e5dd7070Spatrick // FIXME: Implement. 55*12c85518Srobert return std::nullopt; 56e5dd7070Spatrick } 57e5dd7070Spatrick allowsLargerPreferedTypeAlignment()58e5dd7070Spatrick bool allowsLargerPreferedTypeAlignment() const override { return false; } 59e5dd7070Spatrick hasFeature(StringRef Feature)60e5dd7070Spatrick bool hasFeature(StringRef Feature) const override { 61e5dd7070Spatrick return Feature == "msp430"; 62e5dd7070Spatrick } 63e5dd7070Spatrick 64e5dd7070Spatrick ArrayRef<const char *> getGCCRegNames() const override; 65e5dd7070Spatrick getGCCRegAliases()66e5dd7070Spatrick ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 67ec727ea7Spatrick // Make r0 - r3 be recognized by llc (f.e., in clobber list) 68ec727ea7Spatrick static const TargetInfo::GCCRegAlias GCCRegAliases[] = { 69ec727ea7Spatrick {{"r0"}, "pc"}, 70ec727ea7Spatrick {{"r1"}, "sp"}, 71ec727ea7Spatrick {{"r2"}, "sr"}, 72ec727ea7Spatrick {{"r3"}, "cg"}, 73ec727ea7Spatrick }; 74*12c85518Srobert return llvm::ArrayRef(GCCRegAliases); 75e5dd7070Spatrick } 76e5dd7070Spatrick validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info)77e5dd7070Spatrick bool validateAsmConstraint(const char *&Name, 78e5dd7070Spatrick TargetInfo::ConstraintInfo &info) const override { 79e5dd7070Spatrick // FIXME: implement 80e5dd7070Spatrick switch (*Name) { 81e5dd7070Spatrick case 'K': // the constant 1 82e5dd7070Spatrick case 'L': // constant -1^20 .. 1^19 83e5dd7070Spatrick case 'M': // constant 1-4: 84e5dd7070Spatrick return true; 85e5dd7070Spatrick } 86e5dd7070Spatrick // No target constraints for now. 87e5dd7070Spatrick return false; 88e5dd7070Spatrick } 89e5dd7070Spatrick getClobbers()90e5dd7070Spatrick const char *getClobbers() const override { 91e5dd7070Spatrick // FIXME: Is this really right? 92e5dd7070Spatrick return ""; 93e5dd7070Spatrick } 94e5dd7070Spatrick getBuiltinVaListKind()95e5dd7070Spatrick BuiltinVaListKind getBuiltinVaListKind() const override { 96e5dd7070Spatrick // FIXME: implement 97e5dd7070Spatrick return TargetInfo::CharPtrBuiltinVaList; 98e5dd7070Spatrick } 99e5dd7070Spatrick }; 100e5dd7070Spatrick 101e5dd7070Spatrick } // namespace targets 102e5dd7070Spatrick } // namespace clang 103e5dd7070Spatrick #endif // LLVM_CLANG_LIB_BASIC_TARGETS_MSP430_H 104