1234287Sdim//===- PostOrderCFGView.cpp - Post order view of CFG blocks -------*- C++ --*-// 2234287Sdim// 3234287Sdim// The LLVM Compiler Infrastructure 4234287Sdim// 5234287Sdim// This file is distributed under the University of Illinois Open Source 6234287Sdim// License. See LICENSE.TXT for details. 7234287Sdim// 8234287Sdim//===----------------------------------------------------------------------===// 9234287Sdim// 10234287Sdim// This file implements post order view of the blocks in a CFG. 11234287Sdim// 12234287Sdim//===----------------------------------------------------------------------===// 13234287Sdim 14234287Sdim#include "clang/Analysis/Analyses/PostOrderCFGView.h" 15234287Sdim 16234287Sdimusing namespace clang; 17234287Sdim 18234287Sdimvoid PostOrderCFGView::anchor() { } 19234287Sdim 20234287SdimPostOrderCFGView::PostOrderCFGView(const CFG *cfg) { 21234287Sdim Blocks.reserve(cfg->getNumBlockIDs()); 22234287Sdim CFGBlockSet BSet(cfg); 23234287Sdim 24234287Sdim for (po_iterator I = po_iterator::begin(cfg, BSet), 25234287Sdim E = po_iterator::end(cfg, BSet); I != E; ++I) { 26234287Sdim BlockOrder[*I] = Blocks.size() + 1; 27234287Sdim Blocks.push_back(*I); 28234287Sdim } 29234287Sdim} 30234287Sdim 31234287SdimPostOrderCFGView *PostOrderCFGView::create(AnalysisDeclContext &ctx) { 32234287Sdim const CFG *cfg = ctx.getCFG(); 33234287Sdim if (!cfg) 34234287Sdim return 0; 35234287Sdim return new PostOrderCFGView(cfg); 36234287Sdim} 37234287Sdim 38234287Sdimconst void *PostOrderCFGView::getTag() { static int x; return &x; } 39234287Sdim 40234287Sdimbool PostOrderCFGView::BlockOrderCompare::operator()(const CFGBlock *b1, 41234287Sdim const CFGBlock *b2) const { 42234287Sdim PostOrderCFGView::BlockOrderTy::const_iterator b1It = POV.BlockOrder.find(b1); 43234287Sdim PostOrderCFGView::BlockOrderTy::const_iterator b2It = POV.BlockOrder.find(b2); 44234287Sdim 45234287Sdim unsigned b1V = (b1It == POV.BlockOrder.end()) ? 0 : b1It->second; 46234287Sdim unsigned b2V = (b2It == POV.BlockOrder.end()) ? 0 : b2It->second; 47234287Sdim return b1V > b2V; 48234287Sdim} 49234287Sdim 50