summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-05-03 00:32:55 +0000
committerChris Lattner <sabre@nondot.org>2006-05-03 00:32:55 +0000
commitd8b192ba3ba41d719f2d4272322dd14e3b820c5b (patch)
treeab2d4c616d2142f8d0291d8334f21d238ab43717 /llvm/lib/Target
parent0267807ddc619e08c220d7d041c34fb585f0696f (diff)
downloadbcm5719-llvm-d8b192ba3ba41d719f2d4272322dd14e3b820c5b.tar.gz
bcm5719-llvm-d8b192ba3ba41d719f2d4272322dd14e3b820c5b.zip
Change the BasicBlockAddrs map to be a vector, indexed by MBB number.
llvm-svn: 28069
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp16
-rw-r--r--llvm/lib/Target/X86/X86CodeEmitter.cpp15
2 files changed, 17 insertions, 14 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp b/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp
index a01ae99df18..69bd8307852 100644
--- a/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp
+++ b/llvm/lib/Target/PowerPC/PPCCodeEmitter.cpp
@@ -33,8 +33,8 @@ namespace {
// Tracks which instruction references which BasicBlock
std::vector<std::pair<MachineBasicBlock*, unsigned*> > BBRefs;
- // Tracks where each BasicBlock starts
- std::map<MachineBasicBlock*, uint64_t> BBLocations;
+ // Tracks where each BasicBlock starts, indexes by BB number.
+ std::vector<uint64_t> BasicBlockAddrs;
/// getMachineOpValue - evaluates the MachineOperand of a given MachineInstr
///
@@ -87,17 +87,17 @@ bool PPCCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
"JIT relocation model must be set to static or default!");
do {
BBRefs.clear();
- BBLocations.clear();
+ BasicBlockAddrs.clear();
MCE.startFunction(MF);
for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); BB != E; ++BB)
emitBasicBlock(*BB);
- MCE.emitJumpTableInfo(MF.getJumpTableInfo(), BBLocations);
+ 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 = BBLocations[BBRefs[i].first];
+ intptr_t Location = BasicBlockAddrs[BBRefs[i].first->getNumber()];
unsigned *Ref = BBRefs[i].second;
DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location
<< "\n");
@@ -115,13 +115,15 @@ bool PPCCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
}
}
BBRefs.clear();
- BBLocations.clear();
+ BasicBlockAddrs.clear();
return false;
}
void PPCCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
- BBLocations[&MBB] = MCE.getCurrentPCValue();
+ if (BasicBlockAddrs.size() <= (unsigned)MBB.getNumber())
+ BasicBlockAddrs.resize((MBB.getNumber()+1)*2);
+ BasicBlockAddrs[MBB.getNumber()] = MCE.getCurrentPCValue();
for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E; ++I){
MachineInstr &MI = *I;
unsigned Opcode = MI.getOpcode();
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp
index 20e17d0dbf5..ca6c78df5ec 100644
--- a/llvm/lib/Target/X86/X86CodeEmitter.cpp
+++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp
@@ -35,7 +35,7 @@ namespace {
class Emitter : public MachineFunctionPass {
const X86InstrInfo *II;
MachineCodeEmitter &MCE;
- std::map<MachineBasicBlock*, uint64_t> BasicBlockAddrs;
+ std::vector<uint64_t> BasicBlockAddrs;
std::vector<std::pair<MachineBasicBlock *, unsigned> > BBRefs;
public:
explicit Emitter(MachineCodeEmitter &mce) : II(0), MCE(mce) {}
@@ -93,7 +93,7 @@ bool Emitter::runOnMachineFunction(MachineFunction &MF) {
// Resolve all forward branches now.
for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
- unsigned Location = BasicBlockAddrs[BBRefs[i].first];
+ unsigned Location = BasicBlockAddrs[BBRefs[i].first->getNumber()];
unsigned Ref = BBRefs[i].second;
*((unsigned*)(intptr_t)Ref) = Location-Ref-4;
}
@@ -103,8 +103,9 @@ bool Emitter::runOnMachineFunction(MachineFunction &MF) {
}
void Emitter::emitBasicBlock(MachineBasicBlock &MBB) {
- if (uint64_t Addr = MCE.getCurrentPCValue())
- BasicBlockAddrs[&MBB] = Addr;
+ if (BasicBlockAddrs.size() <= (unsigned)MBB.getNumber())
+ BasicBlockAddrs.resize((MBB.getNumber()+1)*2);
+ BasicBlockAddrs[MBB.getNumber()] = MCE.getCurrentPCValue();
for (MachineBasicBlock::const_iterator I = MBB.begin(), E = MBB.end();
I != E; ++I)
@@ -125,9 +126,9 @@ void Emitter::emitPCRelativeValue(unsigned Address) {
void Emitter::emitPCRelativeBlockAddress(MachineBasicBlock *MBB) {
// If this is a backwards branch, we already know the address of the target,
// so just emit the value.
- std::map<MachineBasicBlock*,uint64_t>::iterator I = BasicBlockAddrs.find(MBB);
- if (I != BasicBlockAddrs.end()) {
- emitPCRelativeValue(I->second);
+ 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.
OpenPOWER on IntegriCloud