Index: lib/Target/ARM/ARM.h =================================================================== RCS file: /var/cvs/llvm/llvm/lib/Target/ARM/ARM.h,v retrieving revision 1.8 diff -u -r1.8 ARM.h --- lib/Target/ARM/ARM.h 19 Jan 2007 07:51:42 -0000 1.8 +++ lib/Target/ARM/ARM.h 27 Jun 2007 18:13:11 -0000 @@ -23,6 +23,7 @@ class ARMTargetMachine; class FunctionPass; +class MachineCodeEmitter; // Enums corresponding to ARM condition codes namespace ARMCC { @@ -88,6 +89,8 @@ FunctionPass *createARMISelDag(ARMTargetMachine &TM); FunctionPass *createARMCodePrinterPass(std::ostream &O, ARMTargetMachine &TM); +FunctionPass *createARMCodeEmitterPass(ARMTargetMachine &TM, + MachineCodeEmitter &MCE); FunctionPass *createARMLoadStoreOptimizationPass(); FunctionPass *createARMConstantIslandPass(); Index: lib/Target/ARM/ARMTargetMachine.cpp =================================================================== RCS file: /var/cvs/llvm/llvm/lib/Target/ARM/ARMTargetMachine.cpp,v retrieving revision 1.28 diff -u -r1.28 ARMTargetMachine.cpp --- lib/Target/ARM/ARMTargetMachine.cpp 16 May 2007 20:51:47 -0000 1.28 +++ lib/Target/ARM/ARMTargetMachine.cpp 27 Jun 2007 18:13:11 -0000 @@ -36,12 +33,26 @@ /// ThumbTargetMachine - Create an Thumb architecture model. /// +unsigned ThumbTargetMachine::getJITMatchQuality() { +#if defined(__arm__) + return 10; +#endif + return 0; +} + unsigned ThumbTargetMachine::getModuleMatchQuality(const Module &M) { std::string TT = M.getTargetTriple(); if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "thumb-") return 20; - return M.getPointerSize() == Module::Pointer32; + if (M.getEndianness() == Module::LittleEndian && + M.getPointerSize() == Module::Pointer32) + return 10; // Weak match + else if (M.getEndianness() != Module::AnyEndianness || + M.getPointerSize() != Module::AnyPointerSize) + return 0; // Match for some other target + + return getJITMatchQuality()/2; } ThumbTargetMachine::ThumbTargetMachine(const Module &M, const std::string &FS) @@ -66,14 +77,29 @@ std::string("e-p:32:32-f64:64:64-i64:64:64"))), InstrInfo(Subtarget), FrameInfo(Subtarget), + JITInfo(*this), TLInfo(*this) {} +unsigned ARMTargetMachine::getJITMatchQuality() { +#if defined(__thumb__) + return 10; +#endif + return 0; +} + unsigned ARMTargetMachine::getModuleMatchQuality(const Module &M) { std::string TT = M.getTargetTriple(); if (TT.size() >= 4 && std::string(TT.begin(), TT.begin()+4) == "arm-") return 20; - return M.getPointerSize() == Module::Pointer32; + if (M.getEndianness() == Module::LittleEndian && + M.getPointerSize() == Module::Pointer32) + return 10; // Weak match + else if (M.getEndianness() != Module::AnyEndianness || + M.getPointerSize() != Module::AnyPointerSize) + return 0; // Match for some other target + + return getJITMatchQuality()/2; } @@ -106,3 +129,22 @@ PM.add(createARMCodePrinterPass(Out, *this)); return false; } + +bool ARMTargetMachine::addCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE) { + // FIXME: Move this to TargetJITInfo! + setRelocationModel(Reloc::Static); + + setCodeModel(CodeModel::Large); + + // Machine code emitter pass for ARM. + PM.add(createARMCodeEmitterPass(*this, MCE)); + return false; +} + +bool ARMTargetMachine::addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE) { + // Machine code emitter pass for ARM. + PM.add(createARMCodeEmitterPass(*this, MCE)); + return false; +} Index: lib/Target/ARM/ARMTargetMachine.h =================================================================== RCS file: /var/cvs/llvm/llvm/lib/Target/ARM/ARMTargetMachine.h,v retrieving revision 1.11 diff -u -r1.11 ARMTargetMachine.h --- lib/Target/ARM/ARMTargetMachine.h 16 May 2007 20:52:46 -0000 1.11 +++ lib/Target/ARM/ARMTargetMachine.h 27 Jun 2007 18:13:11 -0000 @@ -20,6 +20,7 @@ #include "llvm/Target/TargetFrameInfo.h" #include "ARMInstrInfo.h" #include "ARMFrameInfo.h" +#include "ARMJITInfo.h" #include "ARMSubtarget.h" #include "ARMISelLowering.h" @@ -32,6 +33,7 @@ const TargetData DataLayout; // Calculates type size & alignment ARMInstrInfo InstrInfo; ARMFrameInfo FrameInfo; + ARMJITInfo JITInfo; ARMTargetLowering TLInfo; public: @@ -39,6 +41,7 @@ virtual const ARMInstrInfo *getInstrInfo() const { return &InstrInfo; } virtual const TargetFrameInfo *getFrameInfo() const { return &FrameInfo; } + virtual TargetJITInfo *getJITInfo() { return &JITInfo; } virtual const MRegisterInfo *getRegisterInfo() const { return &InstrInfo.getRegisterInfo(); } @@ -48,6 +51,7 @@ return const_cast(&TLInfo); } static unsigned getModuleMatchQuality(const Module &M); + static unsigned getJITMatchQuality(); virtual const TargetAsmInfo *createTargetAsmInfo() const; @@ -56,6 +60,10 @@ virtual bool addPreEmitPass(FunctionPassManager &PM, bool Fast); virtual bool addAssemblyEmitter(FunctionPassManager &PM, bool Fast, std::ostream &Out); + virtual bool addCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE); + virtual bool addSimpleCodeEmitter(FunctionPassManager &PM, bool Fast, + MachineCodeEmitter &MCE); }; /// ThumbTargetMachine - Thumb target machine. @@ -64,6 +72,7 @@ public: ThumbTargetMachine(const Module &M, const std::string &FS); + static unsigned getJITMatchQuality(); static unsigned getModuleMatchQuality(const Module &M); };