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"
1816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "X86FrameLowering.h"
19a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "X86ISelLowering.h"
20a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "X86InstrInfo.h"
2133464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "X86JITInfo.h"
22ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman#include "X86SelectionDAGInfo.h"
2333464912237efaa0ed7060829e66b59055bdd48bAnton Korobeynikov#include "X86Subtarget.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
2516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h"
26a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/Target/TargetMachine.h"
27b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
298247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick
30439661395fd2a2a832dba01c65bc88718528313cEvan Chengclass StringRef;
31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
321911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass X86TargetMachine : public LLVMTargetMachine {
33922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  X86Subtarget       Subtarget;
34922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  X86FrameLowering   FrameLowering;
35922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  InstrItineraryData InstrItins;
36fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey
37b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattnerpublic:
388247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick  X86TargetMachine(const Target &T, StringRef TT,
398a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                   StringRef CPU, StringRef FS, const TargetOptions &Options,
4034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   Reloc::Model RM, CodeModel::Model CM,
41b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                   CodeGenOpt::Level OL,
4234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng                   bool is64Bit);
43b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner
440febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86InstrInfo     *getInstrInfo() const {
450febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getInstrInfo not implemented");
460febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
4716c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  virtual const TargetFrameLowering  *getFrameLowering() const {
4816c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov    return &FrameLowering;
4916c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov  }
500febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual       X86JITInfo       *getJITInfo()         {
510febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getJITInfo not implemented");
520febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
53c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman  virtual const X86Subtarget     *getSubtargetImpl() const{ return &Subtarget; }
540febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86TargetLowering *getTargetLowering() const {
550febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getTargetLowering not implemented");
5698d0d7d6f0b4b4f44105bacd3af9570d0e4d9346Chris Lattner  }
578247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick  virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const {
580febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    llvm_unreachable("getSelectionDAGInfo not implemented");
59ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman  }
60c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman  virtual const X86RegisterInfo  *getRegisterInfo() const {
610febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &getInstrInfo()->getRegisterInfo();
62fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner  }
63922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  virtual const InstrItineraryData *getInstrItineraryData() const {
64922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick    return &InstrItins;
65922d314e8f9f0d8e447c055485a2969ee9cf2dd2Andrew Trick  }
66fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner
67aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  /// \brief Register X86 analysis passes with a pass manager.
68aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth  virtual void addAnalysisPasses(PassManagerBase &PM);
69aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth
701911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner  // Set up the pass pipeline.
71061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick  virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
72843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick
73b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  virtual bool addCodeEmitter(PassManagerBase &PM,
74cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar                              JITCodeEmitter &JCE);
75b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner};
7625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
7725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// X86_32TargetMachine - X86 32-bit target machine.
7825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng///
7925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengclass X86_32TargetMachine : public X86TargetMachine {
802d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
813574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  const DataLayout  DL; // Calculates type size & alignment
820febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86InstrInfo      InstrInfo;
830febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86TargetLowering TLInfo;
84ba836a2e803e51cc26279a8522f05c7452729fe3Richard Smith  X86SelectionDAGInfo TSInfo;
850febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86JITInfo        JITInfo;
8625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic:
87439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  X86_32TargetMachine(const Target &T, StringRef TT,
888a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                      StringRef CPU, StringRef FS, const TargetOptions &Options,
89b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      Reloc::Model RM, CodeModel::Model CM,
90b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      CodeGenOpt::Level OL);
913574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  virtual const DataLayout *getDataLayout() const { return &DL; }
920febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86TargetLowering *getTargetLowering() const {
930febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TLInfo;
940febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
958247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick  virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const {
960febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TSInfo;
970febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
980febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86InstrInfo     *getInstrInfo() const {
990febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &InstrInfo;
1000febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1010febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual       X86JITInfo       *getJITInfo()         {
1020febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &JITInfo;
1030febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
10425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng};
10525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
10625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// X86_64TargetMachine - X86 64-bit target machine.
10725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng///
10825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengclass X86_64TargetMachine : public X86TargetMachine {
1092d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
1103574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  const DataLayout  DL; // Calculates type size & alignment
1110febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86InstrInfo      InstrInfo;
1120febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86TargetLowering TLInfo;
113ba836a2e803e51cc26279a8522f05c7452729fe3Richard Smith  X86SelectionDAGInfo TSInfo;
1140febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  X86JITInfo        JITInfo;
11525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic:
116439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  X86_64TargetMachine(const Target &T, StringRef TT,
1178a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky                      StringRef CPU, StringRef FS, const TargetOptions &Options,
118b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      Reloc::Model RM, CodeModel::Model CM,
119b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                      CodeGenOpt::Level OL);
1203574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow  virtual const DataLayout *getDataLayout() const { return &DL; }
1210febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86TargetLowering *getTargetLowering() const {
1220febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TLInfo;
1230febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1248247e0dca6759d9a22ac4c5cf305fac052b285acAndrew Trick  virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const {
1250febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &TSInfo;
1260febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1270febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual const X86InstrInfo     *getInstrInfo() const {
1280febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &InstrInfo;
1290febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
1300febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  virtual       X86JITInfo       *getJITInfo()         {
1310febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola    return &JITInfo;
1320febc4657b0edbf16b55ca5365d2b6aab45be7c5Rafael Espindola  }
13325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng};
13425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng
135d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
136d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
137b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#endif
138