X86TargetMachine.h revision cfe9a605eea542d91e3db74289b69b7e317d90a6
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 17b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#include "llvm/Target/TargetMachine.h" 1807000c6f01d8f57170f2d4c77a86d934bdc5c696Owen Anderson#include "llvm/Target/TargetData.h" 198bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h" 20c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng#include "X86.h" 21fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling#include "X86ELFWriterInfo.h" 22b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#include "X86InstrInfo.h" 231e60a9165dc4d6ce5650dacc026f2942696af920Chris Lattner#include "X86JITInfo.h" 24fb5792f416089d8d8d0c6ee62c1f41a55d2cf75dNate Begeman#include "X86Subtarget.h" 25c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng#include "X86ISelLowering.h" 26b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner 27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 28cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson 2971847813bc419f7a0667468136a07429c6d9f164David Greeneclass formatted_raw_ostream; 30d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 311911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattnerclass X86TargetMachine : public LLVMTargetMachine { 32c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng X86Subtarget Subtarget; 33fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling const TargetData DataLayout; // Calculates type size & alignment 34c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng TargetFrameInfo FrameInfo; 35aa3c1410b427909da350f2b5e8d4ec3db62a3618Evan Cheng X86InstrInfo InstrInfo; 36c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng X86JITInfo JITInfo; 37c4c6257c1a154279bf10e9498d46d6c1793dbaa7Evan Cheng X86TargetLowering TLInfo; 38fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling X86ELFWriterInfo ELFWriterInfo; 39aabe38bf0c773dffed5c12a35e894915418af512Evan Cheng Reloc::Model DefRelocModel; // Reloc model before it's overridden. 40fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey 41fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskeyprotected: 42fde1b3bb2f15b74c713d98a79fcddaff1ac00dd1Jim Laskey virtual const TargetAsmInfo *createTargetAsmInfo() const; 433c3bc48d331db26aaff3ff4f7a61f60a17fea112Anton Korobeynikov 44b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattnerpublic: 4551b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar X86TargetMachine(const Target &T, const Module &M, const std::string &FS, 4651b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar bool is64Bit); 47b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner 48d029cd2d5a159823f20a91d30fd782aae871c589Chris Lattner virtual const X86InstrInfo *getInstrInfo() const { return &InstrInfo; } 49d029cd2d5a159823f20a91d30fd782aae871c589Chris Lattner virtual const TargetFrameInfo *getFrameInfo() const { return &FrameInfo; } 50c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman virtual X86JITInfo *getJITInfo() { return &JITInfo; } 51c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman virtual const X86Subtarget *getSubtargetImpl() const{ return &Subtarget; } 5298d0d7d6f0b4b4f44105bacd3af9570d0e4d9346Chris Lattner virtual X86TargetLowering *getTargetLowering() const { 5398d0d7d6f0b4b4f44105bacd3af9570d0e4d9346Chris Lattner return const_cast<X86TargetLowering*>(&TLInfo); 5498d0d7d6f0b4b4f44105bacd3af9570d0e4d9346Chris Lattner } 55c9f5f3f64f896d0a8c8fa35a1dd98bc57b8960f6Dan Gohman virtual const X86RegisterInfo *getRegisterInfo() const { 56fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner return &InstrInfo.getRegisterInfo(); 57fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner } 58a69571c7991813c93cba64e88eced6899ce93d81Owen Anderson virtual const TargetData *getTargetData() const { return &DataLayout; } 59fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling virtual const X86ELFWriterInfo *getELFWriterInfo() const { 60eb1ac3385096dd6f45a1548f3492f21648f55b4cBill Wendling return Subtarget.isTargetELF() ? &ELFWriterInfo : 0; 61fcdea7baf0e5fa83210a76d429c389a8059466faBill Wendling } 62fde4b51baae5746bc8d7eccff7a9a1e2b6e6e8e9Chris Lattner 631911fd4f85aebcd4d7b8f27313c5a363eebf49cbChris Lattner // Set up the pass pipeline. 6498a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel); 6598a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPreRegAlloc(PassManagerBase &PM, CodeGenOpt::Level OptLevel); 6698a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addPostRegAlloc(PassManagerBase &PM, CodeGenOpt::Level OptLevel); 6798a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addAssemblyEmitter(PassManagerBase &PM, 6898a366d547772010e94609e4584489b3e5ce0043Bill Wendling CodeGenOpt::Level OptLevel, 6971847813bc419f7a0667468136a07429c6d9f164David Greene bool Verbose, formatted_raw_ostream &Out); 7098a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, 71cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar MachineCodeEmitter &MCE); 72a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, 73cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar JITCodeEmitter &JCE); 74ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, 75cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar ObjectCodeEmitter &OCE); 7698a366d547772010e94609e4584489b3e5ce0043Bill Wendling virtual bool addSimpleCodeEmitter(PassManagerBase &PM, 7798a366d547772010e94609e4584489b3e5ce0043Bill Wendling CodeGenOpt::Level OptLevel, 78cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar MachineCodeEmitter &MCE); 79a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes virtual bool addSimpleCodeEmitter(PassManagerBase &PM, 80a3f99f90338d89354384ca25f53ca4450a1a9d18Bruno Cardoso Lopes CodeGenOpt::Level OptLevel, 81cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar JITCodeEmitter &JCE); 82ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes virtual bool addSimpleCodeEmitter(PassManagerBase &PM, 83ac57e6e498abccb117e0d61c2fa0f733845e50cbBruno Cardoso Lopes CodeGenOpt::Level OptLevel, 84cfe9a605eea542d91e3db74289b69b7e317d90a6Daniel Dunbar ObjectCodeEmitter &OCE); 85b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner}; 8625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 8725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// X86_32TargetMachine - X86 32-bit target machine. 8825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// 8925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengclass X86_32TargetMachine : public X86TargetMachine { 9025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic: 9151b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar X86_32TargetMachine(const Target &T, const Module &M, const std::string &FS); 9225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 9325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng static unsigned getJITMatchQuality(); 9425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng static unsigned getModuleMatchQuality(const Module &M); 9525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng}; 9625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 9725ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// X86_64TargetMachine - X86 64-bit target machine. 9825ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng/// 9925ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengclass X86_64TargetMachine : public X86TargetMachine { 10025ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Chengpublic: 10151b198af83cb0080c2709b04c129a3d774c07765Daniel Dunbar X86_64TargetMachine(const Target &T, const Module &M, const std::string &FS); 10225ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 10325ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng static unsigned getJITMatchQuality(); 10425ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng static unsigned getModuleMatchQuality(const Module &M); 10525ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng}; 10625ab690a43cbbb591b76d49e3595b019c32f4b3fEvan Cheng 107d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 108d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 109b4f68ed32ede4cf7d31ce9e516e4074dad0a24eeChris Lattner#endif 110