//===- StableBasicBlockNumbering.h - Provide BB identifiers -----*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file 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 "llvm/ADT/UniqueVector.h" namespace llvm { class StableBasicBlockNumbering { // BBNumbering - Holds the numbering. UniqueVector BBNumbering; 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 (BBNumbering.empty()) { for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) BBNumbering.insert(I); } } /// getNumber - Return the ID number for the specified BasicBlock. /// unsigned getNumber(BasicBlock *BB) const { unsigned Idx = BBNumbering.idFor(BB); assert(Idx && "Invalid basic block or numbering not computed!"); return Idx-1; } /// getBlock - Return the BasicBlock corresponding to a particular ID. /// BasicBlock *getBlock(unsigned N) const { assert(N < BBNumbering.size() && "Block ID out of range or numbering not computed!"); return BBNumbering[N+1]; } }; } #endif