ARMTargetMachine.h revision 194178
1//===-- ARMTargetMachine.h - Define TargetMachine for ARM -------*- 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 ARM specific subclass of TargetMachine. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef ARMTARGETMACHINE_H 15#define ARMTARGETMACHINE_H 16 17#include "llvm/Target/TargetMachine.h" 18#include "llvm/Target/TargetData.h" 19#include "llvm/Target/TargetFrameInfo.h" 20#include "ARMInstrInfo.h" 21#include "ARMFrameInfo.h" 22#include "ARMJITInfo.h" 23#include "ARMSubtarget.h" 24#include "ARMISelLowering.h" 25 26namespace llvm { 27 28class Module; 29 30class ARMTargetMachine : public LLVMTargetMachine { 31 ARMSubtarget Subtarget; 32 const TargetData DataLayout; // Calculates type size & alignment 33 ARMInstrInfo InstrInfo; 34 ARMFrameInfo FrameInfo; 35 ARMJITInfo JITInfo; 36 ARMTargetLowering TLInfo; 37 Reloc::Model DefRelocModel; // Reloc model before it's overridden. 38 39protected: 40 // To avoid having target depend on the asmprinter stuff libraries, asmprinter 41 // set this functions to ctor pointer at startup time if they are linked in. 42 typedef FunctionPass *(*AsmPrinterCtorFn)(raw_ostream &o, 43 ARMTargetMachine &tm, 44 CodeGenOpt::Level OptLevel, 45 bool verbose); 46 static AsmPrinterCtorFn AsmPrinterCtor; 47 48public: 49 ARMTargetMachine(const Module &M, const std::string &FS, bool isThumb = false); 50 51 virtual const ARMInstrInfo *getInstrInfo() const { return &InstrInfo; } 52 virtual const ARMFrameInfo *getFrameInfo() const { return &FrameInfo; } 53 virtual ARMJITInfo *getJITInfo() { return &JITInfo; } 54 virtual const ARMRegisterInfo *getRegisterInfo() const { 55 return &InstrInfo.getRegisterInfo(); 56 } 57 virtual const TargetData *getTargetData() const { return &DataLayout; } 58 virtual const ARMSubtarget *getSubtargetImpl() const { return &Subtarget; } 59 virtual ARMTargetLowering *getTargetLowering() const { 60 return const_cast<ARMTargetLowering*>(&TLInfo); 61 } 62 63 static void registerAsmPrinter(AsmPrinterCtorFn F) { 64 AsmPrinterCtor = F; 65 } 66 67 static unsigned getModuleMatchQuality(const Module &M); 68 static unsigned getJITMatchQuality(); 69 70 virtual const TargetAsmInfo *createTargetAsmInfo() const; 71 72 // Pass Pipeline Configuration 73 virtual bool addInstSelector(PassManagerBase &PM, CodeGenOpt::Level OptLevel); 74 virtual bool addPreRegAlloc(PassManagerBase &PM, CodeGenOpt::Level OptLevel); 75 virtual bool addPreEmitPass(PassManagerBase &PM, CodeGenOpt::Level OptLevel); 76 virtual bool addAssemblyEmitter(PassManagerBase &PM, 77 CodeGenOpt::Level OptLevel, 78 bool Verbose, raw_ostream &Out); 79 virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, 80 bool DumpAsm, MachineCodeEmitter &MCE); 81 virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, 82 bool DumpAsm, JITCodeEmitter &MCE); 83 virtual bool addSimpleCodeEmitter(PassManagerBase &PM, 84 CodeGenOpt::Level OptLevel, 85 bool DumpAsm, 86 MachineCodeEmitter &MCE); 87 virtual bool addSimpleCodeEmitter(PassManagerBase &PM, 88 CodeGenOpt::Level OptLevel, 89 bool DumpAsm, 90 JITCodeEmitter &MCE); 91}; 92 93/// ThumbTargetMachine - Thumb target machine. 94/// 95class ThumbTargetMachine : public ARMTargetMachine { 96public: 97 ThumbTargetMachine(const Module &M, const std::string &FS); 98 99 static unsigned getJITMatchQuality(); 100 static unsigned getModuleMatchQuality(const Module &M); 101}; 102 103} // end namespace llvm 104 105#endif 106