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