diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-05-03 17:10:41 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-05-03 17:10:41 +0000 |
| commit | 1d8ee1fc8008dfba549b1a9ac4794dc71e92b6b4 (patch) | |
| tree | aed67700c8f992e1a21313cc5416d6857ed99635 /llvm/lib/Target | |
| parent | 9954bc9c19250ad49a9b056d7c0b8eb7466354ae (diff) | |
| download | bcm5719-llvm-1d8ee1fc8008dfba549b1a9ac4794dc71e92b6b4.tar.gz bcm5719-llvm-1d8ee1fc8008dfba549b1a9ac4794dc71e92b6b4.zip | |
Suck block address tracking out of targets into the JIT Emitter. This
simplifies the MachineCodeEmitter interface just a little bit and makes
BasicBlocks work like constant pools and jump tables.
llvm-svn: 28082
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp | 15 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86CodeEmitter.cpp | 33 |
3 files changed, 19 insertions, 47 deletions
diff --git a/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp b/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp index 8cadbd05622..cd033204e32 100644 --- a/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp +++ b/llvm/lib/Target/Alpha/AlphaCodeEmitter.cpp @@ -35,8 +35,7 @@ namespace { class AlphaCodeEmitter : public MachineFunctionPass { const AlphaInstrInfo *II; MachineCodeEmitter &MCE; - std::vector<unsigned*> BasicBlockAddrs; - std::vector<std::pair<const MachineBasicBlock *, unsigned*> > BBRefs; + std::vector<std::pair<MachineBasicBlock *, unsigned*> > BBRefs; /// getMachineOpValue - evaluates the MachineOperand of a given MachineInstr /// @@ -78,7 +77,6 @@ bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) { do { BBRefs.clear(); - BasicBlockAddrs.clear(); MCE.startFunction(MF); for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) @@ -87,7 +85,8 @@ bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) { // Resolve all forward branches now... for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { - unsigned* Location = BasicBlockAddrs[BBRefs[i].first->getNumber()]; + 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; @@ -97,17 +96,11 @@ bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) { *Ref |= (BranchTargetDisp & ((1 << 21)-1)); } BBRefs.clear(); - BasicBlockAddrs.clear(); - return false; } void AlphaCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { - if (BasicBlockAddrs.size() <= (unsigned)MBB.getNumber()) - BasicBlockAddrs.resize((MBB.getNumber()+1)*2); - - BasicBlockAddrs[MBB.getNumber()] = (unsigned*)MCE.getCurrentPCValue(); - + MCE.StartMachineBasicBlock(&MBB); for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I) { MachineInstr &MI = *I; diff --git a/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp b/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp index 69bd8307852..9be0f1041c0 100644 --- a/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp +++ b/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp @@ -33,9 +33,7 @@ namespace { // Tracks which instruction references which BasicBlock std::vector<std::pair<MachineBasicBlock*, unsigned*> > BBRefs; - // Tracks where each BasicBlock starts, indexes by BB number. - std::vector<uint64_t> BasicBlockAddrs; - + /// getMachineOpValue - evaluates the MachineOperand of a given MachineInstr /// int getMachineOpValue(MachineInstr &MI, MachineOperand &MO); @@ -87,17 +85,15 @@ bool PPCCodeEmitter::runOnMachineFunction(MachineFunction &MF) { "JIT relocation model must be set to static or default!"); do { BBRefs.clear(); - BasicBlockAddrs.clear(); MCE.startFunction(MF); for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); BB != E; ++BB) emitBasicBlock(*BB); - MCE.emitJumpTableInfo(MF.getJumpTableInfo(), BasicBlockAddrs); } while (MCE.finishFunction(MF)); // Resolve branches to BasicBlocks for the entire function for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { - intptr_t Location = BasicBlockAddrs[BBRefs[i].first->getNumber()]; + intptr_t Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first); unsigned *Ref = BBRefs[i].second; DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location << "\n"); @@ -115,15 +111,13 @@ bool PPCCodeEmitter::runOnMachineFunction(MachineFunction &MF) { } } BBRefs.clear(); - BasicBlockAddrs.clear(); return false; } void PPCCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { - if (BasicBlockAddrs.size() <= (unsigned)MBB.getNumber()) - BasicBlockAddrs.resize((MBB.getNumber()+1)*2); - BasicBlockAddrs[MBB.getNumber()] = MCE.getCurrentPCValue(); + MCE.StartMachineBasicBlock(&MBB); + for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I){ MachineInstr &MI = *I; unsigned Opcode = MI.getOpcode(); @@ -145,8 +139,8 @@ void PPCCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) { int PPCCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) { - int rv = 0; // Return value; defaults to 0 for unhandled cases - // or things that get fixed up later by the JIT. + intptr_t rv = 0; // Return value; defaults to 0 for unhandled cases + // or things that get fixed up later by the JIT. if (MO.isRegister()) { rv = PPCRegisterInfo::getRegisterNumbering(MO.getReg()); diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp index 9e2c998e3f1..4dd95598a6f 100644 --- a/llvm/lib/Target/X86/X86CodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp @@ -35,7 +35,6 @@ namespace { class Emitter : public MachineFunctionPass { const X86InstrInfo *II; MachineCodeEmitter &MCE; - std::vector<uint64_t> BasicBlockAddrs; std::vector<std::pair<MachineBasicBlock *, unsigned> > BBRefs; public: explicit Emitter(MachineCodeEmitter &mce) : II(0), MCE(mce) {} @@ -83,30 +82,24 @@ bool Emitter::runOnMachineFunction(MachineFunction &MF) { do { BBRefs.clear(); - BasicBlockAddrs.clear(); MCE.startFunction(MF); for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) emitBasicBlock(*I); - MCE.emitJumpTableInfo(MF.getJumpTableInfo(), BasicBlockAddrs); } while (MCE.finishFunction(MF)); // Resolve all forward branches now. for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) { - unsigned Location = BasicBlockAddrs[BBRefs[i].first->getNumber()]; + unsigned Location = MCE.getMachineBasicBlockAddress(BBRefs[i].first); unsigned Ref = BBRefs[i].second; *((unsigned*)(intptr_t)Ref) = Location-Ref-4; } BBRefs.clear(); - BasicBlockAddrs.clear(); return false; } void Emitter::emitBasicBlock(MachineBasicBlock &MBB) { - if (BasicBlockAddrs.size() <= (unsigned)MBB.getNumber()) - BasicBlockAddrs.resize((MBB.getNumber()+1)*2); - BasicBlockAddrs[MBB.getNumber()] = MCE.getCurrentPCValue(); - + MCE.StartMachineBasicBlock(&MBB); for (MachineBasicBlock::const_iterator I = MBB.begin(), E = MBB.end(); I != E; ++I) emitInstruction(*I); @@ -118,23 +111,15 @@ void Emitter::emitPCRelativeValue(unsigned Address) { MCE.emitWordLE(Address-MCE.getCurrentPCValue()-4); } -/// emitPCRelativeBlockAddress - This method emits the PC relative address of -/// the specified basic block, or if the basic block hasn't been emitted yet -/// (because this is a forward branch), it keeps track of the information -/// necessary to resolve this address later (and emits a dummy value). +/// emitPCRelativeBlockAddress - This method keeps track of the information +/// necessary to resolve the address of this block later and emits a dummy +/// value. /// void Emitter::emitPCRelativeBlockAddress(MachineBasicBlock *MBB) { - // If this is a backwards branch, we already know the address of the target, - // so just emit the value. - unsigned MBBNo = MBB->getNumber(); - if (MBBNo < BasicBlockAddrs.size() && BasicBlockAddrs[MBBNo]) { - emitPCRelativeValue(BasicBlockAddrs[MBBNo]); - } else { - // Otherwise, remember where this reference was and where it is to so we can - // deal with it later. - BBRefs.push_back(std::make_pair(MBB, MCE.getCurrentPCValue())); - MCE.emitWordLE(0); - } + // Remember where this reference was and where it is to so we can + // deal with it later. + BBRefs.push_back(std::make_pair(MBB, MCE.getCurrentPCValue())); + MCE.emitWordLE(0); } /// emitGlobalAddressForCall - Emit the specified address to the code stream |

