1e5dd7070Spatrick //===- PostOrderCFGView.cpp - Post order view of CFG blocks ---------------===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick // 9e5dd7070Spatrick // This file implements post order view of the blocks in a CFG. 10e5dd7070Spatrick // 11e5dd7070Spatrick //===----------------------------------------------------------------------===// 12e5dd7070Spatrick 13e5dd7070Spatrick #include "clang/Analysis/Analyses/PostOrderCFGView.h" 14e5dd7070Spatrick #include "clang/Analysis/AnalysisDeclContext.h" 15e5dd7070Spatrick #include "clang/Analysis/CFG.h" 16e5dd7070Spatrick 17e5dd7070Spatrick using namespace clang; 18e5dd7070Spatrick anchor()19e5dd7070Spatrickvoid PostOrderCFGView::anchor() {} 20e5dd7070Spatrick PostOrderCFGView(const CFG * cfg)21e5dd7070SpatrickPostOrderCFGView::PostOrderCFGView(const CFG *cfg) { 22e5dd7070Spatrick Blocks.reserve(cfg->getNumBlockIDs()); 23e5dd7070Spatrick CFGBlockSet BSet(cfg); 24e5dd7070Spatrick 25e5dd7070Spatrick for (po_iterator I = po_iterator::begin(cfg, BSet), 26e5dd7070Spatrick E = po_iterator::end(cfg, BSet); I != E; ++I) { 27e5dd7070Spatrick BlockOrder[*I] = Blocks.size() + 1; 28e5dd7070Spatrick Blocks.push_back(*I); 29e5dd7070Spatrick } 30e5dd7070Spatrick } 31e5dd7070Spatrick 32*ec727ea7Spatrick std::unique_ptr<PostOrderCFGView> create(AnalysisDeclContext & ctx)33*ec727ea7SpatrickPostOrderCFGView::create(AnalysisDeclContext &ctx) { 34e5dd7070Spatrick const CFG *cfg = ctx.getCFG(); 35e5dd7070Spatrick if (!cfg) 36e5dd7070Spatrick return nullptr; 37*ec727ea7Spatrick return std::make_unique<PostOrderCFGView>(cfg); 38e5dd7070Spatrick } 39e5dd7070Spatrick getTag()40e5dd7070Spatrickconst void *PostOrderCFGView::getTag() { static int x; return &x; } 41e5dd7070Spatrick operator ()(const CFGBlock * b1,const CFGBlock * b2) const42e5dd7070Spatrickbool PostOrderCFGView::BlockOrderCompare::operator()(const CFGBlock *b1, 43e5dd7070Spatrick const CFGBlock *b2) const { 44e5dd7070Spatrick PostOrderCFGView::BlockOrderTy::const_iterator b1It = POV.BlockOrder.find(b1); 45e5dd7070Spatrick PostOrderCFGView::BlockOrderTy::const_iterator b2It = POV.BlockOrder.find(b2); 46e5dd7070Spatrick 47e5dd7070Spatrick unsigned b1V = (b1It == POV.BlockOrder.end()) ? 0 : b1It->second; 48e5dd7070Spatrick unsigned b2V = (b2It == POV.BlockOrder.end()) ? 0 : b2It->second; 49e5dd7070Spatrick return b1V > b2V; 50e5dd7070Spatrick } 51