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 const AVRTargetMachine &TM); 41 getInstrInfo()42 const AVRInstrInfo *getInstrInfo() const override { return &InstrInfo; } getFrameLowering()43 const TargetFrameLowering *getFrameLowering() const override { return &FrameLowering; } getTargetLowering()44 const AVRTargetLowering *getTargetLowering() const override { return &TLInfo; } getSelectionDAGInfo()45 const AVRSelectionDAGInfo *getSelectionDAGInfo() const override { return &TSInfo; } getRegisterInfo()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 AVRSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS, 53 const TargetMachine &TM); 54 55 // Subtarget feature getters. 56 // See AVR.td for details. hasSRAM()57 bool hasSRAM() const { return m_hasSRAM; } hasJMPCALL()58 bool hasJMPCALL() const { return m_hasJMPCALL; } hasIJMPCALL()59 bool hasIJMPCALL() const { return m_hasIJMPCALL; } hasEIJMPCALL()60 bool hasEIJMPCALL() const { return m_hasEIJMPCALL; } hasADDSUBIW()61 bool hasADDSUBIW() const { return m_hasADDSUBIW; } hasSmallStack()62 bool hasSmallStack() const { return m_hasSmallStack; } hasMOVW()63 bool hasMOVW() const { return m_hasMOVW; } hasLPM()64 bool hasLPM() const { return m_hasLPM; } hasLPMX()65 bool hasLPMX() const { return m_hasLPMX; } hasELPM()66 bool hasELPM() const { return m_hasELPM; } hasELPMX()67 bool hasELPMX() const { return m_hasELPMX; } hasSPM()68 bool hasSPM() const { return m_hasSPM; } hasSPMX()69 bool hasSPMX() const { return m_hasSPMX; } hasDES()70 bool hasDES() const { return m_hasDES; } supportsRMW()71 bool supportsRMW() const { return m_supportsRMW; } supportsMultiplication()72 bool supportsMultiplication() const { return m_supportsMultiplication; } hasBREAK()73 bool hasBREAK() const { return m_hasBREAK; } hasTinyEncoding()74 bool hasTinyEncoding() const { return m_hasTinyEncoding; } 75 76 /// Gets the ELF architecture for the e_flags field 77 /// of an ELF object file. getELFArch()78 unsigned getELFArch() const { 79 assert(ELFArch != 0 && 80 "every device must have an associate ELF architecture"); 81 return ELFArch; 82 } 83 84 private: 85 AVRInstrInfo InstrInfo; 86 AVRFrameLowering FrameLowering; 87 AVRTargetLowering TLInfo; 88 AVRSelectionDAGInfo TSInfo; 89 90 // Subtarget feature settings 91 // See AVR.td for details. 92 bool m_hasSRAM; 93 bool m_hasJMPCALL; 94 bool m_hasIJMPCALL; 95 bool m_hasEIJMPCALL; 96 bool m_hasADDSUBIW; 97 bool m_hasSmallStack; 98 bool m_hasMOVW; 99 bool m_hasLPM; 100 bool m_hasLPMX; 101 bool m_hasELPM; 102 bool m_hasELPMX; 103 bool m_hasSPM; 104 bool m_hasSPMX; 105 bool m_hasDES; 106 bool m_supportsRMW; 107 bool m_supportsMultiplication; 108 bool m_hasBREAK; 109 bool m_hasTinyEncoding; 110 111 /// The ELF e_flags architecture. 112 unsigned ELFArch; 113 114 // Dummy member, used by FeatureSet's. We cannot have a SubtargetFeature with 115 // no variable, so we instead bind pseudo features to this variable. 116 bool m_FeatureSetDummy; 117 }; 118 119 } // end namespace llvm 120 121 #endif // LLVM_AVR_SUBTARGET_H 122