1 //===-- X86TargetMachine.h - Define TargetMachine for the X86 ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file declares the X86 specific subclass of TargetMachine. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef X86TARGETMACHINE_H 15 #define X86TARGETMACHINE_H 16 17 #include "X86.h" 18 #include "X86ELFWriterInfo.h" 19 #include "X86InstrInfo.h" 20 #include "X86ISelLowering.h" 21 #include "X86FrameLowering.h" 22 #include "X86JITInfo.h" 23 #include "X86SelectionDAGInfo.h" 24 #include "X86Subtarget.h" 25 #include "llvm/Target/TargetMachine.h" 26 #include "llvm/Target/TargetData.h" 27 #include "llvm/Target/TargetFrameLowering.h" 28 29 namespace llvm { 30 31 class formatted_raw_ostream; 32 class StringRef; 33 34 class X86TargetMachine : public LLVMTargetMachine { 35 X86Subtarget Subtarget; 36 X86FrameLowering FrameLowering; 37 X86ELFWriterInfo ELFWriterInfo; 38 39 public: 40 X86TargetMachine(const Target &T, StringRef TT, 41 StringRef CPU, StringRef FS, 42 Reloc::Model RM, CodeModel::Model CM, 43 CodeGenOpt::Level OL, 44 bool is64Bit); 45 46 virtual const X86InstrInfo *getInstrInfo() const { 47 llvm_unreachable("getInstrInfo not implemented"); 48 } 49 virtual const TargetFrameLowering *getFrameLowering() const { 50 return &FrameLowering; 51 } 52 virtual X86JITInfo *getJITInfo() { 53 llvm_unreachable("getJITInfo not implemented"); 54 } 55 virtual const X86Subtarget *getSubtargetImpl() const{ return &Subtarget; } 56 virtual const X86TargetLowering *getTargetLowering() const { 57 llvm_unreachable("getTargetLowering not implemented"); 58 } 59 virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const { 60 llvm_unreachable("getSelectionDAGInfo not implemented"); 61 } 62 virtual const X86RegisterInfo *getRegisterInfo() const { 63 return &getInstrInfo()->getRegisterInfo(); 64 } 65 virtual const X86ELFWriterInfo *getELFWriterInfo() const { 66 return Subtarget.isTargetELF() ? &ELFWriterInfo : 0; 67 } 68 69 // Set up the pass pipeline. 70 virtual bool addInstSelector(PassManagerBase &PM); 71 virtual bool addPreRegAlloc(PassManagerBase &PM); 72 virtual bool addPostRegAlloc(PassManagerBase &PM); 73 virtual bool addPreEmitPass(PassManagerBase &PM); 74 virtual bool addCodeEmitter(PassManagerBase &PM, 75 JITCodeEmitter &JCE); 76 }; 77 78 /// X86_32TargetMachine - X86 32-bit target machine. 79 /// 80 class X86_32TargetMachine : public X86TargetMachine { 81 const TargetData DataLayout; // Calculates type size & alignment 82 X86InstrInfo InstrInfo; 83 X86SelectionDAGInfo TSInfo; 84 X86TargetLowering TLInfo; 85 X86JITInfo JITInfo; 86 public: 87 X86_32TargetMachine(const Target &T, StringRef TT, 88 StringRef CPU, StringRef FS, 89 Reloc::Model RM, CodeModel::Model CM, 90 CodeGenOpt::Level OL); 91 virtual const TargetData *getTargetData() const { return &DataLayout; } 92 virtual const X86TargetLowering *getTargetLowering() const { 93 return &TLInfo; 94 } 95 virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const { 96 return &TSInfo; 97 } 98 virtual const X86InstrInfo *getInstrInfo() const { 99 return &InstrInfo; 100 } 101 virtual X86JITInfo *getJITInfo() { 102 return &JITInfo; 103 } 104 }; 105 106 /// X86_64TargetMachine - X86 64-bit target machine. 107 /// 108 class X86_64TargetMachine : public X86TargetMachine { 109 const TargetData DataLayout; // Calculates type size & alignment 110 X86InstrInfo InstrInfo; 111 X86SelectionDAGInfo TSInfo; 112 X86TargetLowering TLInfo; 113 X86JITInfo JITInfo; 114 public: 115 X86_64TargetMachine(const Target &T, StringRef TT, 116 StringRef CPU, StringRef FS, 117 Reloc::Model RM, CodeModel::Model CM, 118 CodeGenOpt::Level OL); 119 virtual const TargetData *getTargetData() const { return &DataLayout; } 120 virtual const X86TargetLowering *getTargetLowering() const { 121 return &TLInfo; 122 } 123 virtual const X86SelectionDAGInfo *getSelectionDAGInfo() const { 124 return &TSInfo; 125 } 126 virtual const X86InstrInfo *getInstrInfo() const { 127 return &InstrInfo; 128 } 129 virtual X86JITInfo *getJITInfo() { 130 return &JITInfo; 131 } 132 }; 133 134 } // End llvm namespace 135 136 #endif 137