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