blob: 7780b025a555166c1227a1ff0ebfd76d74904f25 [file] [log] [blame]
//===- StableBasicBlockNumbering.h - Provide BB identifiers -----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This class provides a *stable* numbering of basic blocks that does not depend
// on their address in memory (which is nondeterministic). When requested, this
// class simply provides a unique ID for each basic block in the function
// specified and the inverse mapping.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_STABLEBASICBLOCKNUMBERING_H
#define LLVM_SUPPORT_STABLEBASICBLOCKNUMBERING_H
#include "llvm/Function.h"
#include <map>
namespace llvm {
class StableBasicBlockNumbering {
// BasicBlockNumbering - Holds a numbering of the basic blocks in the
// function in a stable order that does not depend on their address.
std::map<BasicBlock*, unsigned> BasicBlockNumbering;
// NumberedBasicBlock - Holds the inverse mapping of BasicBlockNumbering.
std::vector<BasicBlock*> NumberedBasicBlock;
public:
StableBasicBlockNumbering(Function *F = 0) {
if (F) compute(*F);
}
/// compute - If we have not computed a numbering for the function yet, do
/// so.
void compute(Function &F) {
if (NumberedBasicBlock.empty()) {
unsigned n = 0;
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I, ++n) {
NumberedBasicBlock.push_back(I);
BasicBlockNumbering[I] = n;
}
}
}
/// getNumber - Return the ID number for the specified BasicBlock.
///
unsigned getNumber(BasicBlock *BB) const {
std::map<BasicBlock*, unsigned>::const_iterator I =
BasicBlockNumbering.find(BB);
assert(I != BasicBlockNumbering.end() &&
"Invalid basic block or numbering not computed!");
return I->second;
}
/// getBlock - Return the BasicBlock corresponding to a particular ID.
///
BasicBlock *getBlock(unsigned N) const {
assert(N < NumberedBasicBlock.size() &&
"Block ID out of range or numbering not computed!");
return NumberedBasicBlock[N];
}
};
}
#endif