diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-07-25 20:40:54 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-07-25 20:40:54 +0000 |
commit | f6acb34d239ed2828fce6bc2c1a69d92354df73a (patch) | |
tree | f7fbac3669a48447ce3ea63724624d22e155411d /llvm/lib/Target/Alpha | |
parent | 66ed41cac17713d7fd90445412d207ab0673f712 (diff) | |
download | bcm5719-llvm-f6acb34d239ed2828fce6bc2c1a69d92354df73a.tar.gz bcm5719-llvm-f6acb34d239ed2828fce6bc2c1a69d92354df73a.zip |
- 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.
llvm-svn: 29276
Diffstat (limited to 'llvm/lib/Target/Alpha')
-rw-r--r-- | llvm/lib/Target/Alpha/Alpha.h | 4 | ||||
-rw-r--r-- | llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp | 34 | ||||
-rw-r--r-- | llvm/lib/Target/Alpha/AlphaJITInfo.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/Target/Alpha/AlphaJITInfo.h | 1 | ||||
-rw-r--r-- | llvm/lib/Target/Alpha/AlphaTargetMachine.cpp | 2 |
5 files changed, 32 insertions, 25 deletions
diff --git a/llvm/lib/Target/Alpha/Alpha.h b/llvm/lib/Target/Alpha/Alpha.h index 8884af224d4..6dc412b815e 100644 --- a/llvm/lib/Target/Alpha/Alpha.h +++ b/llvm/lib/Target/Alpha/Alpha.h @@ -19,6 +19,7 @@ namespace llvm { + class AlphaTargetMachine; class FunctionPass; class TargetMachine; class MachineCodeEmitter; @@ -28,7 +29,8 @@ namespace llvm { 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 diff --git a/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp b/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp index d8cf7df45f3..7a3c550d83d 100644 --- a/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp +++ b/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp @@ -34,17 +34,19 @@ namespace { 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 @@ namespace { /// 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 @@ int AlphaCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) { 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(); diff --git a/llvm/lib/Target/Alpha/AlphaJITInfo.cpp b/llvm/lib/Target/Alpha/AlphaJITInfo.cpp index 81f5e743aa2..8dc5a479603 100644 --- a/llvm/lib/Target/Alpha/AlphaJITInfo.cpp +++ b/llvm/lib/Target/Alpha/AlphaJITInfo.cpp @@ -304,3 +304,19 @@ void AlphaJITInfo::relocate(void *Function, MachineRelocation *MR, } } } + +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(); +} diff --git a/llvm/lib/Target/Alpha/AlphaJITInfo.h b/llvm/lib/Target/Alpha/AlphaJITInfo.h index 252b05c7786..68663f2cd1d 100644 --- a/llvm/lib/Target/Alpha/AlphaJITInfo.h +++ b/llvm/lib/Target/Alpha/AlphaJITInfo.h @@ -47,6 +47,7 @@ namespace llvm { /// virtual void replaceMachineCodeForFunction(void *Old, void *New); + virtual void resolveBBRefs(MachineCodeEmitter &MCE); private: static const unsigned GOToffset = 4096; diff --git a/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp b/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp index df94d6fa348..427094c9553 100644 --- a/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp +++ b/llvm/lib/Target/Alpha/AlphaTargetMachine.cpp @@ -138,7 +138,7 @@ void AlphaJITInfo::addPassesToJITCompile(FunctionPassManager &PM) { 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; |