diff options
Diffstat (limited to 'lib/Target/Alpha')
-rw-r--r-- | lib/Target/Alpha/Alpha.h | 2 | ||||
-rw-r--r-- | lib/Target/Alpha/AlphaCodeEmitter.cpp | 72 | ||||
-rw-r--r-- | lib/Target/Alpha/AlphaJITInfo.cpp | 12 | ||||
-rw-r--r-- | lib/Target/Alpha/AlphaJITInfo.h | 2 | ||||
-rw-r--r-- | lib/Target/Alpha/AlphaTargetMachine.cpp | 15 | ||||
-rw-r--r-- | lib/Target/Alpha/AlphaTargetMachine.h | 6 |
6 files changed, 77 insertions, 32 deletions
diff --git a/lib/Target/Alpha/Alpha.h b/lib/Target/Alpha/Alpha.h index 853109ae34..2815176149 100644 --- a/lib/Target/Alpha/Alpha.h +++ b/lib/Target/Alpha/Alpha.h @@ -32,6 +32,8 @@ namespace llvm { FunctionPass *createAlphaPatternInstructionSelector(TargetMachine &TM); FunctionPass *createAlphaCodeEmitterPass(AlphaTargetMachine &TM, MachineCodeEmitter &MCE); + FunctionPass *createAlphaJITCodeEmitterPass(AlphaTargetMachine &TM, + JITCodeEmitter &JCE); FunctionPass *createAlphaLLRPPass(AlphaTargetMachine &tm); FunctionPass *createAlphaBranchSelectionPass(); diff --git a/lib/Target/Alpha/AlphaCodeEmitter.cpp b/lib/Target/Alpha/AlphaCodeEmitter.cpp index 0d441146b8..ab3682bc9c 100644 --- a/lib/Target/Alpha/AlphaCodeEmitter.cpp +++ b/lib/Target/Alpha/AlphaCodeEmitter.cpp @@ -18,31 +18,50 @@ #include "Alpha.h" #include "llvm/PassManager.h" #include "llvm/CodeGen/MachineCodeEmitter.h" +#include "llvm/CodeGen/JITCodeEmitter.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Function.h" +#include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" using namespace llvm; namespace { - class AlphaCodeEmitter : public MachineFunctionPass { - const AlphaInstrInfo *II; - TargetMachine &TM; - MachineCodeEmitter &MCE; + + class AlphaCodeEmitter { + MachineCodeEmitter &MCE; + public: + AlphaCodeEmitter( MachineCodeEmitter &mce) : MCE(mce) {} + + /// getBinaryCodeForInstr - This function, generated by the + /// CodeEmitterGenerator using TableGen, produces the binary encoding for + /// machine instructions. + + unsigned getBinaryCodeForInstr(const MachineInstr &MI); /// getMachineOpValue - evaluates the MachineOperand of a given MachineInstr - /// - unsigned getMachineOpValue(const MachineInstr &MI, - const MachineOperand &MO); + + unsigned getMachineOpValue(const MachineInstr &MI, const MachineOperand &MO); + }; + + template <class machineCodeEmitter> + class VISIBILITY_HIDDEN Emitter : public MachineFunctionPass, + public AlphaCodeEmitter + { + const AlphaInstrInfo *II; + TargetMachine &TM; + machineCodeEmitter &MCE; public: static char ID; - explicit AlphaCodeEmitter(TargetMachine &tm, MachineCodeEmitter &mce) - : MachineFunctionPass(&ID), II(0), TM(tm), MCE(mce) {} - AlphaCodeEmitter(TargetMachine &tm, MachineCodeEmitter &mce, + explicit Emitter(TargetMachine &tm, machineCodeEmitter &mce) + : MachineFunctionPass(&ID), AlphaCodeEmitter( mce), + II(0), TM(tm), MCE(mce) {} + Emitter(TargetMachine &tm, machineCodeEmitter &mce, const AlphaInstrInfo& ii) - : MachineFunctionPass(&ID), II(&ii), TM(tm), MCE(mce) {} + : MachineFunctionPass(&ID), AlphaCodeEmitter( mce), + II(&ii), TM(tm), MCE(mce) {} bool runOnMachineFunction(MachineFunction &MF); @@ -52,27 +71,29 @@ namespace { void emitInstruction(const MachineInstr &MI); - /// getBinaryCodeForInstr - This function, generated by the - /// CodeEmitterGenerator using TableGen, produces the binary encoding for - /// machine instructions. - /// - unsigned getBinaryCodeForInstr(const MachineInstr &MI); - private: void emitBasicBlock(MachineBasicBlock &MBB); - }; - char AlphaCodeEmitter::ID = 0; + + template <class machineCodeEmitter> + char Emitter<machineCodeEmitter>::ID = 0; } /// createAlphaCodeEmitterPass - Return a pass that emits the collected Alpha code /// to the specified MCE object. -FunctionPass *llvm::createAlphaCodeEmitterPass(AlphaTargetMachine &TM, + +FunctionPass *llvm::createAlphaCodeEmitterPass( AlphaTargetMachine &TM, MachineCodeEmitter &MCE) { - return new AlphaCodeEmitter(TM, MCE); + return new Emitter<MachineCodeEmitter>(TM, MCE); +} + +FunctionPass *llvm::createAlphaJITCodeEmitterPass( AlphaTargetMachine &TM, + JITCodeEmitter &JCE) { + return new Emitter<JITCodeEmitter>(TM, JCE); } -bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) { +template <class machineCodeEmitter> +bool Emitter<machineCodeEmitter>::runOnMachineFunction(MachineFunction &MF) { II = ((AlphaTargetMachine&)MF.getTarget()).getInstrInfo(); do { @@ -84,7 +105,8 @@ bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) { return false; } -void AlphaCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { +template <class machineCodeEmitter> +void Emitter<machineCodeEmitter>::emitBasicBlock(MachineBasicBlock &MBB) { MCE.StartMachineBasicBlock(&MBB); for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I) { @@ -143,7 +165,7 @@ static unsigned getAlphaRegNumber(unsigned Reg) { } unsigned AlphaCodeEmitter::getMachineOpValue(const MachineInstr &MI, - const MachineOperand &MO) { + const MachineOperand &MO) { unsigned rv = 0; // Return value; defaults to 0 for unhandled cases // or things that get fixed up later by the JIT. @@ -215,6 +237,6 @@ unsigned AlphaCodeEmitter::getMachineOpValue(const MachineInstr &MI, return rv; } - #include "AlphaGenCodeEmitter.inc" + diff --git a/lib/Target/Alpha/AlphaJITInfo.cpp b/lib/Target/Alpha/AlphaJITInfo.cpp index 8f36c1ff0c..3fecb19d73 100644 --- a/lib/Target/Alpha/AlphaJITInfo.cpp +++ b/lib/Target/Alpha/AlphaJITInfo.cpp @@ -15,7 +15,7 @@ #include "AlphaJITInfo.h" #include "AlphaRelocations.h" #include "llvm/Function.h" -#include "llvm/CodeGen/MachineCodeEmitter.h" +#include "llvm/CodeGen/JITCodeEmitter.h" #include "llvm/Config/alloca.h" #include "llvm/Support/Debug.h" #include <cstdlib> @@ -192,16 +192,16 @@ extern "C" { } void *AlphaJITInfo::emitFunctionStub(const Function* F, void *Fn, - MachineCodeEmitter &MCE) { + JITCodeEmitter &JCE) { //assert(Fn == AlphaCompilationCallback && "Where are you going?\n"); //Do things in a stupid slow way! - MCE.startGVStub(F, 19*4); - void* Addr = (void*)(intptr_t)MCE.getCurrentPCValue(); + JCE.startGVStub(F, 19*4); + void* Addr = (void*)(intptr_t)JCE.getCurrentPCValue(); for (int x = 0; x < 19; ++ x) - MCE.emitWordLE(0); + JCE.emitWordLE(0); EmitBranchToAt(Addr, Fn); DOUT << "Emitting Stub to " << Fn << " at [" << Addr << "]\n"; - return MCE.finishGVStub(F); + return JCE.finishGVStub(F); } TargetJITInfo::LazyResolverFn diff --git a/lib/Target/Alpha/AlphaJITInfo.h b/lib/Target/Alpha/AlphaJITInfo.h index c9b4a8eaaa..edff990dbc 100644 --- a/lib/Target/Alpha/AlphaJITInfo.h +++ b/lib/Target/Alpha/AlphaJITInfo.h @@ -27,7 +27,7 @@ namespace llvm { { useGOT = true; } virtual void *emitFunctionStub(const Function* F, void *Fn, - MachineCodeEmitter &MCE); + JITCodeEmitter &JCE); virtual LazyResolverFn getLazyResolverFunction(JITCompilerFn); virtual void relocate(void *Function, MachineRelocation *MR, unsigned NumRelocs, unsigned char* GOTBase); diff --git a/lib/Target/Alpha/AlphaTargetMachine.cpp b/lib/Target/Alpha/AlphaTargetMachine.cpp index 802a803670..4c830541f1 100644 --- a/lib/Target/Alpha/AlphaTargetMachine.cpp +++ b/lib/Target/Alpha/AlphaTargetMachine.cpp @@ -103,9 +103,24 @@ bool AlphaTargetMachine::addCodeEmitter(PassManagerBase &PM, PM.add(createAlphaCodePrinterPass(errs(), *this, OptLevel, true)); return false; } +bool AlphaTargetMachine::addCodeEmitter(PassManagerBase &PM, + CodeGenOpt::Level OptLevel, + bool DumpAsm, JITCodeEmitter &JCE) { + PM.add(createAlphaJITCodeEmitterPass(*this, JCE)); + if (DumpAsm) + PM.add(createAlphaCodePrinterPass(errs(), *this, OptLevel, true)); + return false; +} bool AlphaTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, bool DumpAsm, MachineCodeEmitter &MCE) { return addCodeEmitter(PM, OptLevel, DumpAsm, MCE); } +bool AlphaTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM, + CodeGenOpt::Level OptLevel, + bool DumpAsm, + JITCodeEmitter &JCE) { + return addCodeEmitter(PM, OptLevel, DumpAsm, JCE); +} + diff --git a/lib/Target/Alpha/AlphaTargetMachine.h b/lib/Target/Alpha/AlphaTargetMachine.h index 8dd07db062..51224e80de 100644 --- a/lib/Target/Alpha/AlphaTargetMachine.h +++ b/lib/Target/Alpha/AlphaTargetMachine.h @@ -65,10 +65,16 @@ public: bool Verbose, raw_ostream &Out); virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, bool DumpAsm, MachineCodeEmitter &MCE); + virtual bool addCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, + bool DumpAsm, JITCodeEmitter &JCE); virtual bool addSimpleCodeEmitter(PassManagerBase &PM, CodeGenOpt::Level OptLevel, bool DumpAsm, MachineCodeEmitter &MCE); + virtual bool addSimpleCodeEmitter(PassManagerBase &PM, + CodeGenOpt::Level OptLevel, + bool DumpAsm, + JITCodeEmitter &JCE); }; } // end namespace llvm |