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