//===- 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 "llvm/ADT/UniqueVector.h"

namespace llvm {
  class StableBasicBlockNumbering {
    // BBNumbering - Holds the numbering.
    UniqueVector<BasicBlock*> 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
