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