forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- AVRSubtarget.h - Define Subtarget for the AVR -----------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file declares the AVR specific subclass of TargetSubtargetInfo.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef LLVM_AVR_SUBTARGET_H
 | |
| #define LLVM_AVR_SUBTARGET_H
 | |
| 
 | |
| #include "llvm/Target/TargetSubtargetInfo.h"
 | |
| #include "llvm/IR/DataLayout.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,
 | |
|                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);
 | |
| 
 | |
|   // 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
 |