1bc324330SEugene Zelenko //===- PostOrderCFGView.cpp - Post order view of CFG blocks ---------------===// 25abde7cdSTed Kremenek // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65abde7cdSTed Kremenek // 75abde7cdSTed Kremenek //===----------------------------------------------------------------------===// 85abde7cdSTed Kremenek // 927720765SArtyom Skrobov // This file implements post order view of the blocks in a CFG. 105abde7cdSTed Kremenek // 115abde7cdSTed Kremenek //===----------------------------------------------------------------------===// 125abde7cdSTed Kremenek 135abde7cdSTed Kremenek #include "clang/Analysis/Analyses/PostOrderCFGView.h" 14bc324330SEugene Zelenko #include "clang/Analysis/AnalysisDeclContext.h" 15bc324330SEugene Zelenko #include "clang/Analysis/CFG.h" 165abde7cdSTed Kremenek 175abde7cdSTed Kremenek using namespace clang; 185abde7cdSTed Kremenek anchor()1968e081d6SDavid Blaikievoid PostOrderCFGView::anchor() {} 2068e081d6SDavid Blaikie PostOrderCFGView(const CFG * cfg)2127720765SArtyom SkrobovPostOrderCFGView::PostOrderCFGView(const CFG *cfg) { 225abde7cdSTed Kremenek Blocks.reserve(cfg->getNumBlockIDs()); 235abde7cdSTed Kremenek CFGBlockSet BSet(cfg); 245abde7cdSTed Kremenek 255abde7cdSTed Kremenek for (po_iterator I = po_iterator::begin(cfg, BSet), 265abde7cdSTed Kremenek E = po_iterator::end(cfg, BSet); I != E; ++I) { 2727720765SArtyom Skrobov BlockOrder[*I] = Blocks.size() + 1; 285abde7cdSTed Kremenek Blocks.push_back(*I); 295abde7cdSTed Kremenek } 305abde7cdSTed Kremenek } 315abde7cdSTed Kremenek 32*e265f92bSDavid Blaikie std::unique_ptr<PostOrderCFGView> create(AnalysisDeclContext & ctx)33*e265f92bSDavid BlaikiePostOrderCFGView::create(AnalysisDeclContext &ctx) { 345abde7cdSTed Kremenek const CFG *cfg = ctx.getCFG(); 355abde7cdSTed Kremenek if (!cfg) 3625542943SCraig Topper return nullptr; 37*e265f92bSDavid Blaikie return std::make_unique<PostOrderCFGView>(cfg); 385abde7cdSTed Kremenek } 395abde7cdSTed Kremenek getTag()405abde7cdSTed Kremenekconst void *PostOrderCFGView::getTag() { static int x; return &x; } 415abde7cdSTed Kremenek operator ()(const CFGBlock * b1,const CFGBlock * b2) const425abde7cdSTed Kremenekbool PostOrderCFGView::BlockOrderCompare::operator()(const CFGBlock *b1, 435abde7cdSTed Kremenek const CFGBlock *b2) const { 445abde7cdSTed Kremenek PostOrderCFGView::BlockOrderTy::const_iterator b1It = POV.BlockOrder.find(b1); 455abde7cdSTed Kremenek PostOrderCFGView::BlockOrderTy::const_iterator b2It = POV.BlockOrder.find(b2); 465abde7cdSTed Kremenek 475abde7cdSTed Kremenek unsigned b1V = (b1It == POV.BlockOrder.end()) ? 0 : b1It->second; 485abde7cdSTed Kremenek unsigned b2V = (b2It == POV.BlockOrder.end()) ? 0 : b2It->second; 495abde7cdSTed Kremenek return b1V > b2V; 505abde7cdSTed Kremenek } 51