blob: eefd96ab4aea1245952ccefd60bde563b5b1d5ab [file] [log] [blame]
Jia Liudd6c1cd2012-02-17 01:23:50 +00001//===-- MipsTargetMachine.h - Define TargetMachine for Mips -----*- C++ -*-===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00007//
Akira Hatanakae2489122011-04-15 21:51:11 +00008//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +00009//
10// This file declares the Mips specific subclass of TargetMachine.
11//
Akira Hatanakae2489122011-04-15 21:51:11 +000012//===----------------------------------------------------------------------===//
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000013
14#ifndef MIPSTARGETMACHINE_H
15#define MIPSTARGETMACHINE_H
16
Craig Topperb25fda92012-03-17 18:46:09 +000017#include "MipsSubtarget.h"
Reed Kotler1595f362013-04-09 19:46:01 +000018#include "llvm/CodeGen/Passes.h"
19#include "llvm/CodeGen/SelectionDAGISel.h"
Anton Korobeynikov2f931282011-01-10 12:39:04 +000020#include "llvm/Target/TargetFrameLowering.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000021#include "llvm/Target/TargetMachine.h"
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000022
23namespace llvm {
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000024class formatted_raw_ostream;
25class MipsRegisterInfo;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000026
Akira Hatanaka30651802012-07-31 21:39:17 +000027class MipsTargetMachine : public LLVMTargetMachine {
Eric Christopher4e7d1e72014-07-18 23:41:32 +000028 MipsSubtarget *Subtarget;
29 MipsSubtarget DefaultSubtarget;
30 MipsSubtarget NoMips16Subtarget;
31 MipsSubtarget Mips16Subtarget;
Bruno Cardoso Lopesd1d9c782011-07-21 16:28:51 +000032
Akira Hatanaka30651802012-07-31 21:39:17 +000033public:
Eric Christopherdaa9dbb2014-07-03 00:10:24 +000034 MipsTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
35 const TargetOptions &Options, Reloc::Model RM,
36 CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000037
Akira Hatanaka7bc144c2012-12-12 20:09:58 +000038 virtual ~MipsTargetMachine() {}
Akira Hatanakab7fa3c92012-07-31 21:49:49 +000039
Craig Topper56c590a2014-04-29 07:58:02 +000040 void addAnalysisPasses(PassManagerBase &PM) override;
Reed Kotler1595f362013-04-09 19:46:01 +000041
Eric Christopher4e7d1e72014-07-18 23:41:32 +000042 const MipsSubtarget *getSubtargetImpl() const override {
43 if (Subtarget)
44 return Subtarget;
45 return &DefaultSubtarget;
46 }
Eric Christopherb9fd9ed2014-08-07 22:02:54 +000047 MipsSubtarget *getSubtargetImpl() {
48 return static_cast<MipsSubtarget *>(TargetMachine::getSubtargetImpl());
49 }
Eric Christopherd9134482014-08-04 21:25:23 +000050
Eric Christopher4e7d1e72014-07-18 23:41:32 +000051 /// \brief Reset the subtarget for the Mips target.
52 void resetSubtarget(MachineFunction *MF);
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000053
Akira Hatanaka30651802012-07-31 21:39:17 +000054 // Pass Pipeline Configuration
Craig Topper56c590a2014-04-29 07:58:02 +000055 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Eric Christopherb9fd9ed2014-08-07 22:02:54 +000056 bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) override;
Akira Hatanaka30651802012-07-31 21:39:17 +000057};
Dan Gohmanbb919df2010-05-11 17:31:57 +000058
Akira Hatanaka30651802012-07-31 21:39:17 +000059/// MipsebTargetMachine - Mips32/64 big endian target machine.
Akira Hatanaka3d673cc2011-09-21 03:00:58 +000060///
61class MipsebTargetMachine : public MipsTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000062 virtual void anchor();
Akira Hatanaka3d673cc2011-09-21 03:00:58 +000063public:
64 MipsebTargetMachine(const Target &T, StringRef TT,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000065 StringRef CPU, StringRef FS, const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000066 Reloc::Model RM, CodeModel::Model CM,
67 CodeGenOpt::Level OL);
Akira Hatanaka3d673cc2011-09-21 03:00:58 +000068};
69
Akira Hatanaka30651802012-07-31 21:39:17 +000070/// MipselTargetMachine - Mips32/64 little endian target machine.
Bruno Cardoso Lopes326a0372008-06-04 01:45:25 +000071///
72class MipselTargetMachine : public MipsTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000073 virtual void anchor();
Bruno Cardoso Lopes326a0372008-06-04 01:45:25 +000074public:
Evan Cheng2129f592011-07-19 06:37:02 +000075 MipselTargetMachine(const Target &T, StringRef TT,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000076 StringRef CPU, StringRef FS, const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000077 Reloc::Model RM, CodeModel::Model CM,
78 CodeGenOpt::Level OL);
Bruno Cardoso Lopes326a0372008-06-04 01:45:25 +000079};
80
Bruno Cardoso Lopes35e43c42007-06-06 07:42:06 +000081} // End llvm namespace
82
83#endif