|  | //===-- AVRSubtarget.h - Define Subtarget for the AVR -----------*- C++ -*-===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file declares the AVR specific subclass of TargetSubtargetInfo. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_AVR_SUBTARGET_H | 
|  | #define LLVM_AVR_SUBTARGET_H | 
|  |  | 
|  | #include "llvm/CodeGen/TargetSubtargetInfo.h" | 
|  | #include "llvm/IR/DataLayout.h" | 
|  | #include "llvm/Target/TargetMachine.h" | 
|  |  | 
|  | #include "AVRFrameLowering.h" | 
|  | #include "AVRISelLowering.h" | 
|  | #include "AVRInstrInfo.h" | 
|  | #include "AVRSelectionDAGInfo.h" | 
|  |  | 
|  | #define GET_SUBTARGETINFO_HEADER | 
|  | #include "AVRGenSubtargetInfo.inc" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | /// A specific AVR target MCU. | 
|  | class AVRSubtarget : public AVRGenSubtargetInfo { | 
|  | public: | 
|  | //! Creates an AVR subtarget. | 
|  | //! \param TT  The target triple. | 
|  | //! \param CPU The CPU to target. | 
|  | //! \param FS  The feature string. | 
|  | //! \param TM  The target machine. | 
|  | AVRSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, | 
|  | const AVRTargetMachine &TM); | 
|  |  | 
|  | const AVRInstrInfo *getInstrInfo() const override { return &InstrInfo; } | 
|  | const TargetFrameLowering *getFrameLowering() const override { return &FrameLowering; } | 
|  | const AVRTargetLowering *getTargetLowering() const override { return &TLInfo; } | 
|  | const AVRSelectionDAGInfo *getSelectionDAGInfo() const override { return &TSInfo; } | 
|  | const AVRRegisterInfo *getRegisterInfo() const override { return &InstrInfo.getRegisterInfo(); } | 
|  |  | 
|  | /// Parses a subtarget feature string, setting appropriate options. | 
|  | /// \note Definition of function is auto generated by `tblgen`. | 
|  | void ParseSubtargetFeatures(StringRef CPU, StringRef FS); | 
|  |  | 
|  | AVRSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS, | 
|  | const TargetMachine &TM); | 
|  |  | 
|  | // Subtarget feature getters. | 
|  | // See AVR.td for details. | 
|  | bool hasSRAM() const { return m_hasSRAM; } | 
|  | bool hasJMPCALL() const { return m_hasJMPCALL; } | 
|  | bool hasIJMPCALL() const { return m_hasIJMPCALL; } | 
|  | bool hasEIJMPCALL() const { return m_hasEIJMPCALL; } | 
|  | bool hasADDSUBIW() const { return m_hasADDSUBIW; } | 
|  | bool hasSmallStack() const { return m_hasSmallStack; } | 
|  | bool hasMOVW() const { return m_hasMOVW; } | 
|  | bool hasLPM() const { return m_hasLPM; } | 
|  | bool hasLPMX() const { return m_hasLPMX; } | 
|  | bool hasELPM() const { return m_hasELPM; } | 
|  | bool hasELPMX() const { return m_hasELPMX; } | 
|  | bool hasSPM() const { return m_hasSPM; } | 
|  | bool hasSPMX() const { return m_hasSPMX; } | 
|  | bool hasDES() const { return m_hasDES; } | 
|  | bool supportsRMW() const { return m_supportsRMW; } | 
|  | bool supportsMultiplication() const { return m_supportsMultiplication; } | 
|  | bool hasBREAK() const { return m_hasBREAK; } | 
|  | bool hasTinyEncoding() const { return m_hasTinyEncoding; } | 
|  |  | 
|  | /// Gets the ELF architecture for the e_flags field | 
|  | /// of an ELF object file. | 
|  | unsigned getELFArch() const { | 
|  | assert(ELFArch != 0 && | 
|  | "every device must have an associate ELF architecture"); | 
|  | return ELFArch; | 
|  | } | 
|  |  | 
|  | private: | 
|  | AVRInstrInfo InstrInfo; | 
|  | AVRFrameLowering FrameLowering; | 
|  | AVRTargetLowering TLInfo; | 
|  | AVRSelectionDAGInfo TSInfo; | 
|  |  | 
|  | // Subtarget feature settings | 
|  | // See AVR.td for details. | 
|  | bool m_hasSRAM; | 
|  | bool m_hasJMPCALL; | 
|  | bool m_hasIJMPCALL; | 
|  | bool m_hasEIJMPCALL; | 
|  | bool m_hasADDSUBIW; | 
|  | bool m_hasSmallStack; | 
|  | bool m_hasMOVW; | 
|  | bool m_hasLPM; | 
|  | bool m_hasLPMX; | 
|  | bool m_hasELPM; | 
|  | bool m_hasELPMX; | 
|  | bool m_hasSPM; | 
|  | bool m_hasSPMX; | 
|  | bool m_hasDES; | 
|  | bool m_supportsRMW; | 
|  | bool m_supportsMultiplication; | 
|  | bool m_hasBREAK; | 
|  | bool m_hasTinyEncoding; | 
|  |  | 
|  | /// The ELF e_flags architecture. | 
|  | unsigned ELFArch; | 
|  |  | 
|  | // Dummy member, used by FeatureSet's. We cannot have a SubtargetFeature with | 
|  | // no variable, so we instead bind pseudo features to this variable. | 
|  | bool m_FeatureSetDummy; | 
|  | }; | 
|  |  | 
|  | } // end namespace llvm | 
|  |  | 
|  | #endif // LLVM_AVR_SUBTARGET_H |