120
|
1 //===-- AVRSubtarget.h - Define Subtarget for the AVR -----------*- C++ -*-===//
|
|
2 //
|
|
3 // The LLVM Compiler Infrastructure
|
|
4 //
|
|
5 // This file is distributed under the University of Illinois Open Source
|
|
6 // License. See LICENSE.TXT for details.
|
|
7 //
|
|
8 //===----------------------------------------------------------------------===//
|
|
9 //
|
|
10 // This file declares the AVR specific subclass of TargetSubtargetInfo.
|
|
11 //
|
|
12 //===----------------------------------------------------------------------===//
|
|
13
|
|
14 #ifndef LLVM_AVR_SUBTARGET_H
|
|
15 #define LLVM_AVR_SUBTARGET_H
|
|
16
|
|
17 #include "llvm/IR/DataLayout.h"
|
|
18 #include "llvm/Target/TargetMachine.h"
|
121
|
19 #include "llvm/Target/TargetSubtargetInfo.h"
|
120
|
20
|
|
21 #include "AVRFrameLowering.h"
|
|
22 #include "AVRISelLowering.h"
|
|
23 #include "AVRInstrInfo.h"
|
|
24 #include "AVRSelectionDAGInfo.h"
|
|
25
|
|
26 #define GET_SUBTARGETINFO_HEADER
|
|
27 #include "AVRGenSubtargetInfo.inc"
|
|
28
|
|
29 namespace llvm {
|
|
30
|
|
31 /// A specific AVR target MCU.
|
|
32 class AVRSubtarget : public AVRGenSubtargetInfo {
|
|
33 public:
|
|
34 //! Creates an AVR subtarget.
|
|
35 //! \param TT The target triple.
|
|
36 //! \param CPU The CPU to target.
|
|
37 //! \param FS The feature string.
|
|
38 //! \param TM The target machine.
|
|
39 AVRSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS,
|
|
40 AVRTargetMachine &TM);
|
|
41
|
|
42 const AVRInstrInfo *getInstrInfo() const override { return &InstrInfo; }
|
|
43 const TargetFrameLowering *getFrameLowering() const override { return &FrameLowering; }
|
|
44 const AVRTargetLowering *getTargetLowering() const override { return &TLInfo; }
|
|
45 const AVRSelectionDAGInfo *getSelectionDAGInfo() const override { return &TSInfo; }
|
|
46 const AVRRegisterInfo *getRegisterInfo() const override { return &InstrInfo.getRegisterInfo(); }
|
|
47
|
|
48 /// Parses a subtarget feature string, setting appropriate options.
|
|
49 /// \note Definition of function is auto generated by `tblgen`.
|
|
50 void ParseSubtargetFeatures(StringRef CPU, StringRef FS);
|
|
51
|
|
52 // Subtarget feature getters.
|
|
53 // See AVR.td for details.
|
|
54 bool hasSRAM() const { return m_hasSRAM; }
|
|
55 bool hasJMPCALL() const { return m_hasJMPCALL; }
|
|
56 bool hasIJMPCALL() const { return m_hasIJMPCALL; }
|
|
57 bool hasEIJMPCALL() const { return m_hasEIJMPCALL; }
|
|
58 bool hasADDSUBIW() const { return m_hasADDSUBIW; }
|
|
59 bool hasSmallStack() const { return m_hasSmallStack; }
|
|
60 bool hasMOVW() const { return m_hasMOVW; }
|
|
61 bool hasLPM() const { return m_hasLPM; }
|
|
62 bool hasLPMX() const { return m_hasLPMX; }
|
|
63 bool hasELPM() const { return m_hasELPM; }
|
|
64 bool hasELPMX() const { return m_hasELPMX; }
|
|
65 bool hasSPM() const { return m_hasSPM; }
|
|
66 bool hasSPMX() const { return m_hasSPMX; }
|
|
67 bool hasDES() const { return m_hasDES; }
|
|
68 bool supportsRMW() const { return m_supportsRMW; }
|
|
69 bool supportsMultiplication() const { return m_supportsMultiplication; }
|
|
70 bool hasBREAK() const { return m_hasBREAK; }
|
|
71 bool hasTinyEncoding() const { return m_hasTinyEncoding; }
|
|
72
|
|
73 /// Gets the ELF architecture for the e_flags field
|
|
74 /// of an ELF object file.
|
|
75 unsigned getELFArch() const {
|
|
76 assert(ELFArch != 0 &&
|
|
77 "every device must have an associate ELF architecture");
|
|
78 return ELFArch;
|
|
79 }
|
|
80
|
|
81 private:
|
|
82 AVRInstrInfo InstrInfo;
|
|
83 AVRFrameLowering FrameLowering;
|
|
84 AVRTargetLowering TLInfo;
|
|
85 AVRSelectionDAGInfo TSInfo;
|
|
86
|
|
87 // Subtarget feature settings
|
|
88 // See AVR.td for details.
|
|
89 bool m_hasSRAM;
|
|
90 bool m_hasJMPCALL;
|
|
91 bool m_hasIJMPCALL;
|
|
92 bool m_hasEIJMPCALL;
|
|
93 bool m_hasADDSUBIW;
|
|
94 bool m_hasSmallStack;
|
|
95 bool m_hasMOVW;
|
|
96 bool m_hasLPM;
|
|
97 bool m_hasLPMX;
|
|
98 bool m_hasELPM;
|
|
99 bool m_hasELPMX;
|
|
100 bool m_hasSPM;
|
|
101 bool m_hasSPMX;
|
|
102 bool m_hasDES;
|
|
103 bool m_supportsRMW;
|
|
104 bool m_supportsMultiplication;
|
|
105 bool m_hasBREAK;
|
|
106 bool m_hasTinyEncoding;
|
|
107
|
|
108 /// The ELF e_flags architecture.
|
|
109 unsigned ELFArch;
|
|
110
|
|
111 // Dummy member, used by FeatureSet's. We cannot have a SubtargetFeature with
|
|
112 // no variable, so we instead bind pseudo features to this variable.
|
|
113 bool m_FeatureSetDummy;
|
|
114 };
|
|
115
|
|
116 } // end namespace llvm
|
|
117
|
|
118 #endif // LLVM_AVR_SUBTARGET_H
|