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