Line data Source code
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/CodeGen/TargetSubtargetInfo.h"
18 : #include "llvm/IR/DataLayout.h"
19 : #include "llvm/Target/TargetMachine.h"
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 43227 : const AVRInstrInfo *getInstrInfo() const override { return &InstrInfo; }
43 8510 : const TargetFrameLowering *getFrameLowering() const override { return &FrameLowering; }
44 6452 : const AVRTargetLowering *getTargetLowering() const override { return &TLInfo; }
45 304 : const AVRSelectionDAGInfo *getSelectionDAGInfo() const override { return &TSInfo; }
46 115586 : 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 0 : bool hasSRAM() const { return m_hasSRAM; }
55 0 : bool hasJMPCALL() const { return m_hasJMPCALL; }
56 : bool hasIJMPCALL() const { return m_hasIJMPCALL; }
57 : bool hasEIJMPCALL() const { return m_hasEIJMPCALL; }
58 0 : bool hasADDSUBIW() const { return m_hasADDSUBIW; }
59 : bool hasSmallStack() const { return m_hasSmallStack; }
60 0 : 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
|