xref: /llvm-project/clang/lib/Analysis/PostOrderCFGView.cpp (revision e265f92b6e5e56b21fefdb83aec90f6e39c94857)
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 Blaikie void PostOrderCFGView::anchor() {}
2068e081d6SDavid Blaikie 
PostOrderCFGView(const CFG * cfg)2127720765SArtyom Skrobov PostOrderCFGView::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 Blaikie PostOrderCFGView::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 Kremenek const void *PostOrderCFGView::getTag() { static int x; return &x; }
415abde7cdSTed Kremenek 
operator ()(const CFGBlock * b1,const CFGBlock * b2) const425abde7cdSTed Kremenek bool 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