X86TargetMachine.h revision 2d24e2a396a1d211baaeedf32148a3b657240170
1b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner//===-- X86TargetMachine.h - Define TargetMachine for the X86 ---*- C++ -*-===//
20e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
3856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//                     The LLVM Compiler Infrastructure
4856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
70e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
8856ba76200ec2302f2fe500bc507f426c7d566c8John Criswell//===----------------------------------------------------------------------===//
90e0a7a45d3d0a8c865a078459d2e1c6d8967a100Misha Brukman//
10b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner// This file declares the X86 specific subclass of TargetMachine.
11b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner//
12b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner//===----------------------------------------------------------------------===//
13b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
14b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#ifndef X86TARGETMACHINE_H
15b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#define X86TARGETMACHINE_H
16b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
17c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng#include "X86.h"
18fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling#include "X86ELFWriterInfo.h"
19b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#include "X86InstrInfo.h"
20c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng#include "X86ISelLowering.h"
2116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "X86FrameLowering.h"
2233464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "X86JITInfo.h"
23ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman#include "X86SelectionDAGInfo.h"
2433464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "X86Subtarget.h"
2533464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/Target/TargetMachine.h"
2633464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "llvm/Target/TargetData.h"
2716c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
28b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
30cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson
3171847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_raw_ostream;
32439661395fd2a2a832dba01c65bc88718528313cEvan Chengclass StringRef;
33d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
341911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass X86TargetMachine : public LLVMTargetMachine {
35c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng  X86Subtarget      Subtarget;
3616c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  X86FrameLowering  FrameLowering;
37fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling  X86ELFWriterInfo  ELFWriterInfo;
38fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey
39b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattnerpublic:
40439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  X86TargetMachine(const Target &T, StringRef TT,
418a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                   StringRef CPU, StringRef FS, const TargetOptions &Options,
4234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   Reloc::Model RM, CodeModel::Model CM,
43b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                   CodeGenOpt::Level OL,
4434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   bool is64Bit);
45b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
460febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86InstrInfo     *getInstrInfo() const {
470febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getInstrInfo not implemented");
480febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
4916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  virtual const TargetFrameLowering  *getFrameLowering() const {
5016c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    return &FrameLowering;
5116c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  }
520febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual       X86JITInfo       *getJITInfo()         {
530febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getJITInfo not implemented");
540febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
55c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman  virtual const X86Subtarget     *getSubtargetImpl() const{ return &Subtarget; }
560febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86TargetLowering *getTargetLowering() const {
570febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getTargetLowering not implemented");
5898d0d7d6f0b4b4f44105bacd3af9570d0e4d9346Chris Lattner  }
59ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const {
600febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getSelectionDAGInfo not implemented");
61ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  }
62c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman  virtual const X86RegisterInfo  *getRegisterInfo() const {
630febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &getInstrInfo()->getRegisterInfo();
64fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner  }
65fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling  virtual const X86ELFWriterInfo *getELFWriterInfo() const {
66eb1ac3385096dd6f45a1548f3492f21648f55b4cBill Wendling    return Subtarget.isTargetELF() ? &ELFWriterInfo : 0;
67fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling  }
68fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner
691911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  // Set up the pass pipeline.
70b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  virtual bool addInstSelector(PassManagerBase &PM);
71b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  virtual bool addPreRegAlloc(PassManagerBase &PM);
72b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  virtual bool addPostRegAlloc(PassManagerBase &PM);
73b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  virtual bool addPreEmitPass(PassManagerBase &PM);
74b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  virtual bool addCodeEmitter(PassManagerBase &PM,
75cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar                              JITCodeEmitter &JCE);
76b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner};
7725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
7825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// X86_32TargetMachine - X86 32-bit target machine.
7925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng///
8025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengclass X86_32TargetMachine : public X86TargetMachine {
812d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
820febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  const TargetData  DataLayout; // Calculates type size & alignment
830febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86InstrInfo      InstrInfo;
840febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86SelectionDAGInfo TSInfo;
850febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86TargetLowering TLInfo;
860febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86JITInfo        JITInfo;
8725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic:
88439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  X86_32TargetMachine(const Target &T, StringRef TT,
898a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                      StringRef CPU, StringRef FS, const TargetOptions &Options,
90b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      Reloc::Model RM, CodeModel::Model CM,
91b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      CodeGenOpt::Level OL);
920febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const TargetData *getTargetData() const { return &DataLayout; }
930febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86TargetLowering *getTargetLowering() const {
940febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TLInfo;
950febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
960febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const {
970febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TSInfo;
980febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
990febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86InstrInfo     *getInstrInfo() const {
1000febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &InstrInfo;
1010febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1020febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual       X86JITInfo       *getJITInfo()         {
1030febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &JITInfo;
1040febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
10525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng};
10625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
10725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// X86_64TargetMachine - X86 64-bit target machine.
10825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng///
10925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengclass X86_64TargetMachine : public X86TargetMachine {
1102d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
1110febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  const TargetData  DataLayout; // Calculates type size & alignment
1120febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86InstrInfo      InstrInfo;
1130febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86SelectionDAGInfo TSInfo;
1140febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86TargetLowering TLInfo;
1150febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86JITInfo        JITInfo;
11625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic:
117439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  X86_64TargetMachine(const Target &T, StringRef TT,
1188a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                      StringRef CPU, StringRef FS, const TargetOptions &Options,
119b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      Reloc::Model RM, CodeModel::Model CM,
120b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      CodeGenOpt::Level OL);
1210febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const TargetData *getTargetData() const { return &DataLayout; }
1220febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86TargetLowering *getTargetLowering() const {
1230febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TLInfo;
1240febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1250febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const {
1260febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TSInfo;
1270febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1280febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86InstrInfo     *getInstrInfo() const {
1290febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &InstrInfo;
1300febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1310febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual       X86JITInfo       *getJITInfo()         {
1320febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &JITInfo;
1330febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
13425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng};
13525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
136d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
137d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
138b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#endif
139