X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FARM%2FARMTargetMachine.h;h=4100d2e0268841fc90ee8ae6603277a5550685ee;hb=53551e2476b6ef291fd256a24b1f144587e1e073;hp=9a3d7ed5fef34429bd7c0f647641d431b0a273ce;hpb=42bf74be1402df7409efbea089310d4c276fde37;p=oota-llvm.git diff --git a/lib/Target/ARM/ARMTargetMachine.h b/lib/Target/ARM/ARMTargetMachine.h index 9a3d7ed5fef..4100d2e0268 100644 --- a/lib/Target/ARM/ARMTargetMachine.h +++ b/lib/Target/ARM/ARMTargetMachine.h @@ -14,79 +14,172 @@ #ifndef ARMTARGETMACHINE_H #define ARMTARGETMACHINE_H -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetFrameInfo.h" +#include "ARMFrameLowering.h" +#include "ARMISelLowering.h" #include "ARMInstrInfo.h" -#include "ARMFrameInfo.h" #include "ARMJITInfo.h" +#include "ARMSelectionDAGInfo.h" #include "ARMSubtarget.h" -#include "ARMISelLowering.h" +#include "Thumb1FrameLowering.h" +#include "Thumb1InstrInfo.h" +#include "Thumb2InstrInfo.h" +#include "llvm/IR/DataLayout.h" +#include "llvm/MC/MCStreamer.h" +#include "llvm/Target/TargetMachine.h" namespace llvm { -class Module; +class ARMBaseTargetMachine : public LLVMTargetMachine { +protected: + ARMSubtarget Subtarget; +public: + ARMBaseTargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, + const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL, + bool isLittle); + + const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; } + const ARMTargetLowering *getTargetLowering() const override { + // Implemented by derived classes + llvm_unreachable("getTargetLowering not implemented"); + } + const InstrItineraryData *getInstrItineraryData() const override { + return &getSubtargetImpl()->getInstrItineraryData(); + } -class ARMTargetMachine : public LLVMTargetMachine { - ARMSubtarget Subtarget; - const TargetData DataLayout; // Calculates type size & alignment - ARMInstrInfo InstrInfo; - ARMFrameInfo FrameInfo; - ARMJITInfo JITInfo; - ARMTargetLowering TLInfo; - Reloc::Model DefRelocModel; // Reloc model before it's overridden. + /// \brief Register ARM analysis passes with a pass manager. + void addAnalysisPasses(PassManagerBase &PM) override; -protected: - // To avoid having target depend on the asmprinter stuff libraries, asmprinter - // set this functions to ctor pointer at startup time if they are linked in. - typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o, - ARMTargetMachine &tm, - bool fast, bool verbose); - static AsmPrinterCtorFn AsmPrinterCtor; + // Pass Pipeline Configuration + TargetPassConfig *createPassConfig(PassManagerBase &PM) override; -public: - ARMTargetMachine(const Module &M, const std::string &FS, bool isThumb = false); + bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE) override; +}; - virtual const ARMInstrInfo *getInstrInfo() const { return &InstrInfo; } - virtual const ARMFrameInfo *getFrameInfo() const { return &FrameInfo; } - virtual ARMJITInfo *getJITInfo() { return &JITInfo; } - virtual const ARMRegisterInfo *getRegisterInfo() const { +/// ARMTargetMachine - ARM target machine. +/// +class ARMTargetMachine : public ARMBaseTargetMachine { + virtual void anchor(); + ARMInstrInfo InstrInfo; + ARMTargetLowering TLInfo; + ARMFrameLowering FrameLowering; + public: + ARMTargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, + const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL, + bool isLittle); + + const ARMRegisterInfo *getRegisterInfo() const override { return &InstrInfo.getRegisterInfo(); } - virtual const TargetData *getTargetData() const { return &DataLayout; } - virtual const ARMSubtarget *getSubtargetImpl() const { return &Subtarget; } - virtual ARMTargetLowering *getTargetLowering() const { - return const_cast(&TLInfo); - } - static void registerAsmPrinter(AsmPrinterCtorFn F) { - AsmPrinterCtor = F; + const ARMTargetLowering *getTargetLowering() const override { + return &TLInfo; } - static unsigned getModuleMatchQuality(const Module &M); - static unsigned getJITMatchQuality(); + const ARMSelectionDAGInfo *getSelectionDAGInfo() const override { + return getSubtargetImpl()->getSelectionDAGInfo(); + } + const ARMFrameLowering *getFrameLowering() const override { + return &FrameLowering; + } + const ARMInstrInfo *getInstrInfo() const override { return &InstrInfo; } + const DataLayout *getDataLayout() const override { + return getSubtargetImpl()->getDataLayout(); + } +}; - virtual const TargetAsmInfo *createTargetAsmInfo() const; +/// ARMLETargetMachine - ARM little endian target machine. +/// +class ARMLETargetMachine : public ARMTargetMachine { + void anchor() override; +public: + ARMLETargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL); +}; - // Pass Pipeline Configuration - virtual bool addInstSelector(PassManagerBase &PM, bool Fast); - virtual bool addPreEmitPass(PassManagerBase &PM, bool Fast); - virtual bool addAssemblyEmitter(PassManagerBase &PM, bool Fast, - bool Verbose, raw_ostream &Out); - virtual bool addCodeEmitter(PassManagerBase &PM, bool Fast, - bool DumpAsm, MachineCodeEmitter &MCE); - virtual bool addSimpleCodeEmitter(PassManagerBase &PM, bool Fast, - bool DumpAsm, MachineCodeEmitter &MCE); +/// ARMBETargetMachine - ARM big endian target machine. +/// +class ARMBETargetMachine : public ARMTargetMachine { + void anchor() override; +public: + ARMBETargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL); }; /// ThumbTargetMachine - Thumb target machine. +/// Due to the way architectures are handled, this represents both +/// Thumb-1 and Thumb-2. +/// +class ThumbTargetMachine : public ARMBaseTargetMachine { + virtual void anchor(); + // Either Thumb1InstrInfo or Thumb2InstrInfo. + std::unique_ptr InstrInfo; + ARMTargetLowering TLInfo; + // Either Thumb1FrameLowering or ARMFrameLowering. + std::unique_ptr FrameLowering; +public: + ThumbTargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, + const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL, + bool isLittle); + + /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo + const ARMBaseRegisterInfo *getRegisterInfo() const override { + return &InstrInfo->getRegisterInfo(); + } + + const ARMTargetLowering *getTargetLowering() const override { + return &TLInfo; + } + + const ARMSelectionDAGInfo *getSelectionDAGInfo() const override { + return getSubtargetImpl()->getSelectionDAGInfo(); + } + + /// returns either Thumb1InstrInfo or Thumb2InstrInfo + const ARMBaseInstrInfo *getInstrInfo() const override { + return InstrInfo.get(); + } + /// returns either Thumb1FrameLowering or ARMFrameLowering + const ARMFrameLowering *getFrameLowering() const override { + return FrameLowering.get(); + } + const DataLayout *getDataLayout() const override { + return getSubtargetImpl()->getDataLayout(); + } +}; + +/// ThumbLETargetMachine - Thumb little endian target machine. /// -class ThumbTargetMachine : public ARMTargetMachine { +class ThumbLETargetMachine : public ThumbTargetMachine { + void anchor() override; public: - ThumbTargetMachine(const Module &M, const std::string &FS); + ThumbLETargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL); +}; - static unsigned getJITMatchQuality(); - static unsigned getModuleMatchQuality(const Module &M); +/// ThumbBETargetMachine - Thumb big endian target machine. +/// +class ThumbBETargetMachine : public ThumbTargetMachine { + void anchor() override; +public: + ThumbBETargetMachine(const Target &T, StringRef TT, StringRef CPU, + StringRef FS, const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL); }; } // end namespace llvm