X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FMips%2FMipsTargetMachine.h;h=38b2ecff7d7f1b1906bf8a03096798bf33e044a1;hb=cac05d9b5837f7d5bc73d9d87b555ca9e562d351;hp=85fafadde7c4bc5a0f5cc2a770d52c59fe158eaa;hpb=e8f1018130e24bd20d193003eddaa7e16e48d4bd;p=oota-llvm.git diff --git a/lib/Target/Mips/MipsTargetMachine.h b/lib/Target/Mips/MipsTargetMachine.h index 85fafadde7c..38b2ecff7d7 100644 --- a/lib/Target/Mips/MipsTargetMachine.h +++ b/lib/Target/Mips/MipsTargetMachine.h @@ -1,4 +1,4 @@ -//===-- MipsTargetMachine.h - Define TargetMachine for Mips -00--*- C++ -*-===// +//===-- MipsTargetMachine.h - Define TargetMachine for Mips -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -11,81 +11,83 @@ // //===----------------------------------------------------------------------===// -#ifndef MIPSTARGETMACHINE_H -#define MIPSTARGETMACHINE_H +#ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H +#define LLVM_LIB_TARGET_MIPS_MIPSTARGETMACHINE_H +#include "MCTargetDesc/MipsABIInfo.h" #include "MipsSubtarget.h" -#include "MipsInstrInfo.h" -#include "MipsISelLowering.h" +#include "llvm/CodeGen/BasicTTIImpl.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/SelectionDAGISel.h" +#include "llvm/Target/TargetFrameLowering.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetFrameInfo.h" namespace llvm { - class raw_ostream; - - class MipsTargetMachine : public LLVMTargetMachine { - MipsSubtarget Subtarget; - const TargetData DataLayout; // Calculates type size & alignment - MipsInstrInfo InstrInfo; - TargetFrameInfo FrameInfo; - MipsTargetLowering TLInfo; - - protected: - virtual const TargetAsmInfo *createTargetAsmInfo() const; - 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, - MipsTargetMachine &tm, - CodeGenOpt::Level OptLevel, - bool verbose); - static AsmPrinterCtorFn AsmPrinterCtor; - - public: - MipsTargetMachine(const Module &M, const std::string &FS, bool isLittle); - - static void registerAsmPrinter(AsmPrinterCtorFn F) { - AsmPrinterCtor = F; - } - - virtual const MipsInstrInfo *getInstrInfo() const - { return &InstrInfo; } - virtual const TargetFrameInfo *getFrameInfo() const - { return &FrameInfo; } - virtual const MipsSubtarget *getSubtargetImpl() const - { return &Subtarget; } - virtual const TargetData *getTargetData() const - { return &DataLayout;} - - virtual const MipsRegisterInfo *getRegisterInfo() const { - return &InstrInfo.getRegisterInfo(); - } - - virtual MipsTargetLowering *getTargetLowering() const { - return const_cast(&TLInfo); - } - - static unsigned getModuleMatchQuality(const Module &M); - - // Pass Pipeline Configuration - virtual bool addInstSelector(PassManagerBase &PM, - CodeGenOpt::Level OptLevel); - virtual bool addPreEmitPass(PassManagerBase &PM, - CodeGenOpt::Level OptLevel); - virtual bool addAssemblyEmitter(PassManagerBase &PM, - CodeGenOpt::Level OptLevel, - bool Verbose, raw_ostream &Out); - }; - -/// MipselTargetMachine - Mipsel target machine. +class formatted_raw_ostream; +class MipsRegisterInfo; + +class MipsTargetMachine : public LLVMTargetMachine { + bool isLittle; + std::unique_ptr TLOF; + // Selected ABI + MipsABIInfo ABI; + MipsSubtarget *Subtarget; + MipsSubtarget DefaultSubtarget; + MipsSubtarget NoMips16Subtarget; + MipsSubtarget Mips16Subtarget; + + mutable StringMap> SubtargetMap; + +public: + MipsTargetMachine(const Target &T, const Triple &TT, StringRef CPU, + StringRef FS, const TargetOptions &Options, Reloc::Model RM, + CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle); + ~MipsTargetMachine() override; + + TargetIRAnalysis getTargetIRAnalysis() override; + + const MipsSubtarget *getSubtargetImpl() const { + if (Subtarget) + return Subtarget; + return &DefaultSubtarget; + } + + const MipsSubtarget *getSubtargetImpl(const Function &F) const override; + + /// \brief Reset the subtarget for the Mips target. + void resetSubtarget(MachineFunction *MF); + + // Pass Pipeline Configuration + TargetPassConfig *createPassConfig(PassManagerBase &PM) override; + + TargetLoweringObjectFile *getObjFileLowering() const override { + return TLOF.get(); + } + + bool isLittleEndian() const { return isLittle; } + const MipsABIInfo &getABI() const { return ABI; } +}; + +/// MipsebTargetMachine - Mips32/64 big endian target machine. /// -class MipselTargetMachine : public MipsTargetMachine { +class MipsebTargetMachine : public MipsTargetMachine { + virtual void anchor(); public: - MipselTargetMachine(const Module &M, const std::string &FS); + MipsebTargetMachine(const Target &T, const Triple &TT, StringRef CPU, + StringRef FS, const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL); +}; - static unsigned getModuleMatchQuality(const Module &M); +/// MipselTargetMachine - Mips32/64 little endian target machine. +/// +class MipselTargetMachine : public MipsTargetMachine { + virtual void anchor(); +public: + MipselTargetMachine(const Target &T, const Triple &TT, StringRef CPU, + StringRef FS, const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL); }; } // End llvm namespace