Changes in directory llvm/lib/Target/Alpha:
Alpha.h updated: 1.5 -> 1.6 AlphaCodeEmitter.cpp updated: 1.15 -> 1.16 AlphaJITInfo.cpp updated: 1.9 -> 1.10 AlphaJITInfo.h updated: 1.1 -> 1.2 AlphaTargetMachine.cpp updated: 1.26 -> 1.27 --- Log message: - Refactor the code that resolve basic block references to a TargetJITInfo method. - Added synchronizeICache() to TargetJITInfo. It is called after each block of code is emitted to flush the icache. This ensures correct execution on targets that have separate dcache and icache. - Added PPC / Mac OS X specific code to do icache flushing. --- Diffs of the changes: (+32 -25) Alpha.h | 4 +++- AlphaCodeEmitter.cpp | 34 +++++++++++----------------------- AlphaJITInfo.cpp | 16 ++++++++++++++++ AlphaJITInfo.h | 1 + AlphaTargetMachine.cpp | 2 +- 5 files changed, 32 insertions(+), 25 deletions(-) Index: llvm/lib/Target/Alpha/Alpha.h diff -u llvm/lib/Target/Alpha/Alpha.h:1.5 llvm/lib/Target/Alpha/Alpha.h:1.6 --- llvm/lib/Target/Alpha/Alpha.h:1.5 Wed Oct 19 19:28:31 2005 +++ llvm/lib/Target/Alpha/Alpha.h Tue Jul 25 15:40:54 2006 @@ -19,6 +19,7 @@ namespace llvm { + class AlphaTargetMachine; class FunctionPass; class TargetMachine; class MachineCodeEmitter; @@ -28,7 +29,8 @@ FunctionPass *createAlphaCodePrinterPass(std::ostream &OS, TargetMachine &TM); FunctionPass *createAlphaPatternInstructionSelector(TargetMachine &TM); - FunctionPass *createAlphaCodeEmitterPass(MachineCodeEmitter &MCE); + FunctionPass *createAlphaCodeEmitterPass(AlphaTargetMachine &TM, + MachineCodeEmitter &MCE); } // end namespace llvm; // Defines symbolic names for Alpha registers. This defines a mapping from Index: llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp diff -u llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp:1.15 llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp:1.16 --- llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp:1.15 Wed May 3 15:30:20 2006 +++ llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp Tue Jul 25 15:40:54 2006 @@ -34,17 +34,19 @@ namespace { class AlphaCodeEmitter : public MachineFunctionPass { const AlphaInstrInfo *II; + TargetMachine &TM; MachineCodeEmitter &MCE; - std::vector<std::pair<MachineBasicBlock *, unsigned*> > BBRefs; /// getMachineOpValue - evaluates the MachineOperand of a given MachineInstr /// int getMachineOpValue(MachineInstr &MI, MachineOperand &MO); public: - explicit AlphaCodeEmitter(MachineCodeEmitter &mce) : II(0), MCE(mce) {} - AlphaCodeEmitter(MachineCodeEmitter &mce, const AlphaInstrInfo& ii) - : II(&ii), MCE(mce) {} + explicit AlphaCodeEmitter(TargetMachine &tm, MachineCodeEmitter &mce) + : II(0), TM(tm), MCE(mce) {} + AlphaCodeEmitter(TargetMachine &tm, MachineCodeEmitter &mce, + const AlphaInstrInfo& ii) + : II(&ii), TM(tm), MCE(mce) {} bool runOnMachineFunction(MachineFunction &MF); @@ -68,34 +70,20 @@ /// createAlphaCodeEmitterPass - Return a pass that emits the collected Alpha code /// to the specified MCE object. -FunctionPass *llvm::createAlphaCodeEmitterPass(MachineCodeEmitter &MCE) { - return new AlphaCodeEmitter(MCE); +FunctionPass *llvm::createAlphaCodeEmitterPass(AlphaTargetMachine &TM, + MachineCodeEmitter &MCE) { + return new AlphaCodeEmitter(TM, MCE); } bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) { II = ((AlphaTargetMachine&)MF.getTarget()).getInstrInfo(); do { - BBRefs.clear(); - MCE.startFunction(MF); for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) emitBasicBlock(*I); } while (MCE.finishFunction(MF)); - // Resolve all forward branches now... - for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { - unsigned* Location = - (unsigned*)MCE.getMachineBasicBlockAddress(BBRefs[i].first); - unsigned* Ref = (unsigned*)BBRefs[i].second; - intptr_t BranchTargetDisp = - (((unsigned char*)Location - (unsigned char*)Ref) >> 2) - 1; - DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location - << " Disp " << BranchTargetDisp - << " using " << (BranchTargetDisp & ((1 << 22)-1)) << "\n"); - *Ref |= (BranchTargetDisp & ((1 << 21)-1)); - } - BBRefs.clear(); return false; } @@ -227,8 +215,8 @@ Reloc, MO.getConstantPoolIndex(), Offset)); } else if (MO.isMachineBasicBlock()) { - unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue(); - BBRefs.push_back(std::make_pair(MO.getMachineBasicBlock(), CurrPC)); + TM.getJITInfo()->addBBRef(MO.getMachineBasicBlock(), + MCE.getCurrentPCValue()); }else { std::cerr << "ERROR: Unknown type of MachineOperand: " << MO << "\n"; abort(); Index: llvm/lib/Target/Alpha/AlphaJITInfo.cpp diff -u llvm/lib/Target/Alpha/AlphaJITInfo.cpp:1.9 llvm/lib/Target/Alpha/AlphaJITInfo.cpp:1.10 --- llvm/lib/Target/Alpha/AlphaJITInfo.cpp:1.9 Tue May 2 14:14:47 2006 +++ llvm/lib/Target/Alpha/AlphaJITInfo.cpp Tue Jul 25 15:40:54 2006 @@ -304,3 +304,19 @@ } } } + +void AlphaJITInfo::resolveBBRefs(MachineCodeEmitter &MCE) { + // Resolve all forward branches now... + for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { + unsigned* Location = + (unsigned*)MCE.getMachineBasicBlockAddress(BBRefs[i].first); + unsigned* Ref = (unsigned*)BBRefs[i].second; + intptr_t BranchTargetDisp = + (((unsigned char*)Location - (unsigned char*)Ref) >> 2) - 1; + DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location + << " Disp " << BranchTargetDisp + << " using " << (BranchTargetDisp & ((1 << 22)-1)) << "\n"); + *Ref |= (BranchTargetDisp & ((1 << 21)-1)); + } + BBRefs.clear(); +} Index: llvm/lib/Target/Alpha/AlphaJITInfo.h diff -u llvm/lib/Target/Alpha/AlphaJITInfo.h:1.1 llvm/lib/Target/Alpha/AlphaJITInfo.h:1.2 --- llvm/lib/Target/Alpha/AlphaJITInfo.h:1.1 Fri Jul 22 15:52:16 2005 +++ llvm/lib/Target/Alpha/AlphaJITInfo.h Tue Jul 25 15:40:54 2006 @@ -47,6 +47,7 @@ /// virtual void replaceMachineCodeForFunction(void *Old, void *New); + virtual void resolveBBRefs(MachineCodeEmitter &MCE); private: static const unsigned GOToffset = 4096; Index: llvm/lib/Target/Alpha/AlphaTargetMachine.cpp diff -u llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.26 llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.27 --- llvm/lib/Target/Alpha/AlphaTargetMachine.cpp:1.26 Fri Jun 16 13:22:52 2006 +++ llvm/lib/Target/Alpha/AlphaTargetMachine.cpp Tue Jul 25 15:40:54 2006 @@ -138,7 +138,7 @@ bool AlphaTargetMachine::addPassesToEmitMachineCode(FunctionPassManager &PM, MachineCodeEmitter &MCE) { - PM.add(createAlphaCodeEmitterPass(MCE)); + PM.add(createAlphaCodeEmitterPass(*this, MCE)); // Delete machine code for this function PM.add(createMachineCodeDeleter()); return false; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits