11d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek//== AnalysisDeclContext.cpp - Analysis context for Path Sens analysis -*- C++ -*-// 297ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// 397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// The LLVM Compiler Infrastructure 497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// 597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// This file is distributed under the University of Illinois Open Source 697ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// License. See LICENSE.TXT for details. 797ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// 897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//===----------------------------------------------------------------------===// 997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// 101d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek// This file defines AnalysisDeclContext, a class that manages the analysis context 1197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// data for path sensitive analysis. 1297ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu// 1397ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu//===----------------------------------------------------------------------===// 1497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/AnalysisContext.h" 1655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "BodyFarm.h" 17471c8b49982d1132f30b0b0da27fef94fd6e4f67Benjamin Kramer#include "clang/AST/ASTContext.h" 1897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/AST/Decl.h" 1997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/AST/DeclObjC.h" 20fa6ef180c0d3609124217387618fbb51bbdd2e48Mike Stump#include "clang/AST/DeclTemplate.h" 2197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu#include "clang/AST/ParentMap.h" 22b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek#include "clang/AST/StmtVisitor.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h" 242cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek#include "clang/Analysis/Analyses/LiveVariables.h" 25db34ab70961ca4b24b600eb47053d7af304659f5Tom Care#include "clang/Analysis/Analyses/PseudoConstantAnalysis.h" 262cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek#include "clang/Analysis/CFG.h" 27283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek#include "clang/Analysis/CFGStmtMap.h" 28b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek#include "clang/Analysis/Support/BumpVector.h" 299b20a90dff2ed605153c68a5c58b6aadcdb0952bBenjamin Kramer#include "llvm/ADT/SmallPtrSet.h" 3087a05f1fe8ae14044f182b015b279e0a6f4cbdd1Mike Stump#include "llvm/Support/ErrorHandling.h" 3155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/SaveAndRestore.h" 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/raw_ostream.h" 33a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 3497ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xuusing namespace clang; 3597ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu 36a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenektypedef llvm::DenseMap<const void *, ManagedAnalysis *> ManagedAnalysisMap; 37a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 381d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 39a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek const Decl *d, 40a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek const CFG::BuildOptions &buildOptions) 41b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek : Manager(Mgr), 42b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek D(d), 43bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek cfgBuildOptions(buildOptions), 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines forcedBlkExprs(nullptr), 45bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek builtCFG(false), 46bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek builtCompleteCFG(false), 476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReferencedBlockVars(nullptr), 486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ManagedAnalyses(nullptr) 49bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek{ 50b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek cfgBuildOptions.forcedBlkExprs = &forcedBlkExprs; 51bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek} 52bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek 531d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContext::AnalysisDeclContext(AnalysisDeclContextManager *Mgr, 54a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek const Decl *d) 55b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek: Manager(Mgr), 56b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek D(d), 576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines forcedBlkExprs(nullptr), 58bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek builtCFG(false), 59bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek builtCompleteCFG(false), 606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ReferencedBlockVars(nullptr), 616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ManagedAnalyses(nullptr) 62bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek{ 63bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek cfgBuildOptions.forcedBlkExprs = &forcedBlkExprs; 64bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek} 65bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek 661d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContextManager::AnalysisDeclContextManager(bool useUnoptimizedCFG, 675a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose bool addImplicitDtors, 685a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose bool addInitializers, 69a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek bool addTemporaryDtors, 7002a88c3edf1aeb9580e0b6e444b30c52846a673cTed Kremenek bool synthesizeBodies, 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool addStaticInitBranch, 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool addCXXNewAllocator) 73a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek : SynthesizeBodies(synthesizeBodies) 74a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek{ 75bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek cfgBuildOptions.PruneTriviallyFalseEdges = !useUnoptimizedCFG; 76b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek cfgBuildOptions.AddImplicitDtors = addImplicitDtors; 77b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek cfgBuildOptions.AddInitializers = addInitializers; 785a1ffe98b04120846a15f7105905b5f363b08635Jordan Rose cfgBuildOptions.AddTemporaryDtors = addTemporaryDtors; 7902a88c3edf1aeb9580e0b6e444b30c52846a673cTed Kremenek cfgBuildOptions.AddStaticInitBranches = addStaticInitBranch; 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cfgBuildOptions.AddCXXNewAllocator = addCXXNewAllocator; 81b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek} 82b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek 831d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekvoid AnalysisDeclContextManager::clear() { 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DeleteContainerSeconds(Contexts); 8558f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek} 8658f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek 87a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenekstatic BodyFarm &getBodyFarm(ASTContext &C) { 88a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek static BodyFarm *BF = new BodyFarm(C); 89a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek return *BF; 90a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek} 91a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 92453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna ZaksStmt *AnalysisDeclContext::getBody(bool &IsAutosynthesized) const { 9322c0cbee5bb2150841e0046354fd37ba22de747aNAKAMURA Takumi IsAutosynthesized = false; 94a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 95a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek Stmt *Body = FD->getBody(); 96453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks if (!Body && Manager && Manager->synthesizeBodies()) { 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Body = getBodyFarm(getASTContext()).getBody(FD); 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Body) 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IsAutosynthesized = true; 100453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks } 101a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek return Body; 102a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek } 103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) { 104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Stmt *Body = MD->getBody(); 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Body && Manager && Manager->synthesizeBodies()) { 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Body = getBodyFarm(getASTContext()).getBody(MD); 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Body) 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines IsAutosynthesized = true; 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Body; 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) 11230a45344c827a8346f6ecfda56b7811d1e031767Ted Kremenek return BD->getBody(); 113fa6ef180c0d3609124217387618fbb51bbdd2e48Mike Stump else if (const FunctionTemplateDecl *FunTmpl 114fa6ef180c0d3609124217387618fbb51bbdd2e48Mike Stump = dyn_cast_or_null<FunctionTemplateDecl>(D)) 115fa6ef180c0d3609124217387618fbb51bbdd2e48Mike Stump return FunTmpl->getTemplatedDecl()->getBody(); 11697ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu 1179f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("unknown code decl"); 11897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu} 11997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu 120453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna ZaksStmt *AnalysisDeclContext::getBody() const { 121453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks bool Tmp; 122453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks return getBody(Tmp); 123453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks} 124453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 125453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaksbool AnalysisDeclContext::isBodyAutosynthesized() const { 126453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks bool Tmp; 127453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks getBody(Tmp); 128453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks return Tmp; 129453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks} 130453cb859a3c8dcafe79ae840dfc35ff8eae1b4b3Anna Zaks 1311d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekconst ImplicitParamDecl *AnalysisDeclContext::getSelfDecl() const { 13282cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) 13382cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek return MD->getSelfDecl(); 134ccf1bfde160c03c677ba530c9dcb77365a9c2d7bTed Kremenek if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { 135ccf1bfde160c03c677ba530c9dcb77365a9c2d7bTed Kremenek // See if 'self' was captured by the block. 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &I : BD->captures()) { 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const VarDecl *VD = I.getVariable(); 138ccf1bfde160c03c677ba530c9dcb77365a9c2d7bTed Kremenek if (VD->getName() == "self") 139ccf1bfde160c03c677ba530c9dcb77365a9c2d7bTed Kremenek return dyn_cast<ImplicitParamDecl>(VD); 140ccf1bfde160c03c677ba530c9dcb77365a9c2d7bTed Kremenek } 141ccf1bfde160c03c677ba530c9dcb77365a9c2d7bTed Kremenek } 1421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 14482cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek} 14582cd37cf1cccde162d1f13eda6cdfe1398216f36Ted Kremenek 1461d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekvoid AnalysisDeclContext::registerForcedBlockExpression(const Stmt *stmt) { 1470d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek if (!forcedBlkExprs) 1480d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek forcedBlkExprs = new CFG::BuildOptions::ForcedBlkExprs(); 1490d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek // Default construct an entry for 'stmt'. 150ac73ea8c12772fd0dcec71b83c193a2837de7f8bJordy Rose if (const Expr *e = dyn_cast<Expr>(stmt)) 151ac73ea8c12772fd0dcec71b83c193a2837de7f8bJordy Rose stmt = e->IgnoreParens(); 1520d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek (void) (*forcedBlkExprs)[stmt]; 1530d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek} 1540d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek 1550d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenekconst CFGBlock * 1561d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContext::getBlockForRegisteredExpression(const Stmt *stmt) { 1570d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek assert(forcedBlkExprs); 158ac73ea8c12772fd0dcec71b83c193a2837de7f8bJordy Rose if (const Expr *e = dyn_cast<Expr>(stmt)) 159ac73ea8c12772fd0dcec71b83c193a2837de7f8bJordy Rose stmt = e->IgnoreParens(); 1600d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek CFG::BuildOptions::ForcedBlkExprs::const_iterator itr = 1610d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek forcedBlkExprs->find(stmt); 1620d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek assert(itr != forcedBlkExprs->end()); 1630d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek return itr->second; 1640d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek} 1650d28d360b5559abda755e50b855ba5e59727d9cdTed Kremenek 16649a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose/// Add each synthetic statement in the CFG to the parent map, using the 16749a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose/// source statement's parent. 16849a246f4fad959888bb0164c624c3c2b03078e91Jordan Rosestatic void addParentsForSyntheticStmts(const CFG *TheCFG, ParentMap &PM) { 16949a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose if (!TheCFG) 17049a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose return; 17149a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose 17249a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose for (CFG::synthetic_stmt_iterator I = TheCFG->synthetic_stmt_begin(), 17349a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose E = TheCFG->synthetic_stmt_end(); 17449a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose I != E; ++I) { 17549a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose PM.setParent(I->first, PM.getParent(I->second)); 17649a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose } 17749a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose} 17849a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose 1791d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekCFG *AnalysisDeclContext::getCFG() { 180bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek if (!cfgBuildOptions.PruneTriviallyFalseEdges) 1819b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek return getUnoptimizedCFG(); 1829b823e8e1ccb8a2cb49923bad22a80ca96f41f92Ted Kremenek 183d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek if (!builtCFG) { 184b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek cfg.reset(CFG::buildCFG(D, getBody(), 185b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek &D->getASTContext(), cfgBuildOptions)); 186d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek // Even when the cfg is not successfully built, we don't 187d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek // want to try building it again. 188d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek builtCFG = true; 18949a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose 19049a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose if (PM) 19149a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose addParentsForSyntheticStmts(cfg.get(), *PM); 1926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // The Observer should only observe one build of the CFG. 1946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getCFGBuildOptions().Observer = nullptr; 195d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek } 196b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return cfg.get(); 19797ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu} 19897ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu 1991d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekCFG *AnalysisDeclContext::getUnoptimizedCFG() { 200ad5a894df1841698c824381b414630799adc26caTed Kremenek if (!builtCompleteCFG) { 201bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek SaveAndRestore<bool> NotPrune(cfgBuildOptions.PruneTriviallyFalseEdges, 202bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek false); 203bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek completeCFG.reset(CFG::buildCFG(D, getBody(), &D->getASTContext(), 204bc5cb8a5fe2b88f917d47ceb58b53696a121e57eTed Kremenek cfgBuildOptions)); 205ad5a894df1841698c824381b414630799adc26caTed Kremenek // Even when the cfg is not successfully built, we don't 206ad5a894df1841698c824381b414630799adc26caTed Kremenek // want to try building it again. 207ad5a894df1841698c824381b414630799adc26caTed Kremenek builtCompleteCFG = true; 20849a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose 20949a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose if (PM) 21049a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose addParentsForSyntheticStmts(completeCFG.get(), *PM); 2116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // The Observer should only observe one build of the CFG. 2136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines getCFGBuildOptions().Observer = nullptr; 214ad5a894df1841698c824381b414630799adc26caTed Kremenek } 215b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return completeCFG.get(); 216ad5a894df1841698c824381b414630799adc26caTed Kremenek} 217ad5a894df1841698c824381b414630799adc26caTed Kremenek 2181d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekCFGStmtMap *AnalysisDeclContext::getCFGStmtMap() { 219283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek if (cfgStmtMap) 220b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return cfgStmtMap.get(); 221283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek 222283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek if (CFG *c = getCFG()) { 223b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek cfgStmtMap.reset(CFGStmtMap::Build(c, &getParentMap())); 224b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return cfgStmtMap.get(); 225283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek } 2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 228283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek} 22942461eecee98fff3671b3c14ce10f1a9e18cc95cTed Kremenek 2301d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekCFGReverseBlockReachabilityAnalysis *AnalysisDeclContext::getCFGReachablityAnalysis() { 23142461eecee98fff3671b3c14ce10f1a9e18cc95cTed Kremenek if (CFA) 232b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return CFA.get(); 23342461eecee98fff3671b3c14ce10f1a9e18cc95cTed Kremenek 23442461eecee98fff3671b3c14ce10f1a9e18cc95cTed Kremenek if (CFG *c = getCFG()) { 235af13d5b25b360e698cc1cf1055ad7d14e008e505Ted Kremenek CFA.reset(new CFGReverseBlockReachabilityAnalysis(*c)); 236b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return CFA.get(); 23742461eecee98fff3671b3c14ce10f1a9e18cc95cTed Kremenek } 2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 24042461eecee98fff3671b3c14ce10f1a9e18cc95cTed Kremenek} 241283a358aecb75e30fcd486f2206f6c03c5e7f11dTed Kremenek 242682060c5d95f6e4f79536013781ab0870cdd3850Ted Kremenekvoid AnalysisDeclContext::dumpCFG(bool ShowColors) { 2434e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie getCFG()->dump(getASTContext().getLangOpts(), ShowColors); 24404eeba43040969c05cfcb563195ef5b199297b62Anders Carlsson} 24504eeba43040969c05cfcb563195ef5b199297b62Anders Carlsson 2461d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekParentMap &AnalysisDeclContext::getParentMap() { 2471d3ca251f9891623fac0dbe70eece42564e274edJordan Rose if (!PM) { 248bb518991ce4298d8662235fc8cb13813f011c18dJordan Rose PM.reset(new ParentMap(getBody())); 249bb518991ce4298d8662235fc8cb13813f011c18dJordan Rose if (const CXXConstructorDecl *C = dyn_cast<CXXConstructorDecl>(getDecl())) { 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : C->inits()) { 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines PM->addStmt(I->getInit()); 252bb518991ce4298d8662235fc8cb13813f011c18dJordan Rose } 253bb518991ce4298d8662235fc8cb13813f011c18dJordan Rose } 25449a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose if (builtCFG) 25549a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose addParentsForSyntheticStmts(getCFG(), *PM); 25649a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose if (builtCompleteCFG) 25749a246f4fad959888bb0164c624c3c2b03078e91Jordan Rose addParentsForSyntheticStmts(getUnoptimizedCFG(), *PM); 2581d3ca251f9891623fac0dbe70eece42564e274edJordan Rose } 25997ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu return *PM; 26097ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu} 26197ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu 2621d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekPseudoConstantAnalysis *AnalysisDeclContext::getPseudoConstantAnalysis() { 263245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care if (!PCA) 264b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek PCA.reset(new PseudoConstantAnalysis(getBody())); 265b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek return PCA.get(); 266245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care} 267245adabd97c8c770c13935a9075f2243cc6f1d57Tom Care 268d200187bd27f9ad68699693a6e57f9ee3ff260faJordy RoseAnalysisDeclContext *AnalysisDeclContextManager::getContext(const Decl *D) { 269a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { 27081d18bf944bd885c48b693c2c8c651607001ad9dTed Kremenek // Calling 'hasBody' replaces 'FD' in place with the FunctionDecl 27181d18bf944bd885c48b693c2c8c651607001ad9dTed Kremenek // that has the body. 272a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek FD->hasBody(FD); 273a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek D = FD; 274a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek } 275a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek 2761d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *&AC = Contexts[D]; 2772376002038c8b904acd20be754aedd1a7471be71Ted Kremenek if (!AC) 278d200187bd27f9ad68699693a6e57f9ee3ff260faJordy Rose AC = new AnalysisDeclContext(this, D, cfgBuildOptions); 2792376002038c8b904acd20be754aedd1a7471be71Ted Kremenek return AC; 28097ab3941effe1f508c7113d9aa0c2887774f6fa8Zhongxing Xu} 28118c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 282b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenekconst StackFrameContext * 2831d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContext::getStackFrame(LocationContext const *Parent, const Stmt *S, 284b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek const CFGBlock *Blk, unsigned Idx) { 285b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return getLocationContextManager().getStackFrame(this, Parent, S, Blk, Idx); 286b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} 287b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 2887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekconst BlockInvocationContext * 2897fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekAnalysisDeclContext::getBlockInvocationContext(const LocationContext *parent, 2907fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const clang::BlockDecl *BD, 2917fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *ContextData) { 2927fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return getLocationContextManager().getBlockInvocationContext(this, parent, 2937fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek BD, ContextData); 2947fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek} 2957fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 2961d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekLocationContextManager & AnalysisDeclContext::getLocationContextManager() { 297b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek assert(Manager && 2981d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek "Cannot create LocationContexts without an AnalysisDeclContextManager!"); 299b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek return Manager->getLocationContextManager(); 300b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek} 301b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek 302dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek//===----------------------------------------------------------------------===// 303dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek// FoldingSet profiling. 304dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek//===----------------------------------------------------------------------===// 305dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek 306dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenekvoid LocationContext::ProfileCommon(llvm::FoldingSetNodeID &ID, 307dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek ContextKind ck, 3081d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext *ctx, 309dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek const LocationContext *parent, 3109c378f705405d37f49795d5e915989de774fe11fTed Kremenek const void *data) { 3110ee4124012950d7bb853438629b8e7652febf183Ted Kremenek ID.AddInteger(ck); 3120ee4124012950d7bb853438629b8e7652febf183Ted Kremenek ID.AddPointer(ctx); 3130ee4124012950d7bb853438629b8e7652febf183Ted Kremenek ID.AddPointer(parent); 314dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek ID.AddPointer(data); 315dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek} 316dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek 317dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenekvoid StackFrameContext::Profile(llvm::FoldingSetNodeID &ID) { 3181d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek Profile(ID, getAnalysisDeclContext(), getParent(), CallSite, Block, Index); 31918c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu} 32018c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 321dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenekvoid ScopeContext::Profile(llvm::FoldingSetNodeID &ID) { 3221d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek Profile(ID, getAnalysisDeclContext(), getParent(), Enter); 32318c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu} 32418c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 325dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenekvoid BlockInvocationContext::Profile(llvm::FoldingSetNodeID &ID) { 3267fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek Profile(ID, getAnalysisDeclContext(), getParent(), BD, ContextData); 327dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek} 328dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek 329dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek//===----------------------------------------------------------------------===// 3300ee4124012950d7bb853438629b8e7652febf183Ted Kremenek// LocationContext creation. 331dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek//===----------------------------------------------------------------------===// 332dc0d909f0f6684159c8475db1a15967e5613cb27Ted Kremenek 3330ee4124012950d7bb853438629b8e7652febf183Ted Kremenektemplate <typename LOC, typename DATA> 3340ee4124012950d7bb853438629b8e7652febf183Ted Kremenekconst LOC* 3351d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekLocationContextManager::getLocationContext(AnalysisDeclContext *ctx, 3360ee4124012950d7bb853438629b8e7652febf183Ted Kremenek const LocationContext *parent, 3370ee4124012950d7bb853438629b8e7652febf183Ted Kremenek const DATA *d) { 3380ee4124012950d7bb853438629b8e7652febf183Ted Kremenek llvm::FoldingSetNodeID ID; 3390ee4124012950d7bb853438629b8e7652febf183Ted Kremenek LOC::Profile(ID, ctx, parent, d); 3400ee4124012950d7bb853438629b8e7652febf183Ted Kremenek void *InsertPos; 341d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 3420ee4124012950d7bb853438629b8e7652febf183Ted Kremenek LOC *L = cast_or_null<LOC>(Contexts.FindNodeOrInsertPos(ID, InsertPos)); 343d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 3440ee4124012950d7bb853438629b8e7652febf183Ted Kremenek if (!L) { 3450ee4124012950d7bb853438629b8e7652febf183Ted Kremenek L = new LOC(ctx, parent, d); 3460ee4124012950d7bb853438629b8e7652febf183Ted Kremenek Contexts.InsertNode(L, InsertPos); 3470ee4124012950d7bb853438629b8e7652febf183Ted Kremenek } 3480ee4124012950d7bb853438629b8e7652febf183Ted Kremenek return L; 34958f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek} 35058f5ec7d56b1ebf5f90ee11226ebe7663f2821eaTed Kremenek 3510ee4124012950d7bb853438629b8e7652febf183Ted Kremenekconst StackFrameContext* 3521d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekLocationContextManager::getStackFrame(AnalysisDeclContext *ctx, 35354c809b19444a01444f36e93d1d28c9a5668484cTed Kremenek const LocationContext *parent, 354892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek const Stmt *s, 355d706434b0231c76fd9acf30060646a7aa8f69aefZhongxing Xu const CFGBlock *blk, unsigned idx) { 35662d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu llvm::FoldingSetNodeID ID; 357892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek StackFrameContext::Profile(ID, ctx, parent, s, blk, idx); 35862d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu void *InsertPos; 359d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek StackFrameContext *L = 36062d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu cast_or_null<StackFrameContext>(Contexts.FindNodeOrInsertPos(ID, InsertPos)); 36162d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu if (!L) { 362892697dd2287caf7c29aaaa82909b0e90b8b63feTed Kremenek L = new StackFrameContext(ctx, parent, s, blk, idx); 36362d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu Contexts.InsertNode(L, InsertPos); 36462d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu } 36562d399e1880aacd9dc494fce374245b0da915adaZhongxing Xu return L; 36618c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu} 36718c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 3680ee4124012950d7bb853438629b8e7652febf183Ted Kremenekconst ScopeContext * 3691d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekLocationContextManager::getScope(AnalysisDeclContext *ctx, 3700ee4124012950d7bb853438629b8e7652febf183Ted Kremenek const LocationContext *parent, 3710ee4124012950d7bb853438629b8e7652febf183Ted Kremenek const Stmt *s) { 3720ee4124012950d7bb853438629b8e7652febf183Ted Kremenek return getLocationContext<ScopeContext, Stmt>(ctx, parent, s); 3730ee4124012950d7bb853438629b8e7652febf183Ted Kremenek} 37418c7c06033cafe8c0cdcbe5759c802728688b49fZhongxing Xu 3757fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenekconst BlockInvocationContext * 3767fa9b4f258636d89342eda28f21a986c8ac353b1Ted KremenekLocationContextManager::getBlockInvocationContext(AnalysisDeclContext *ctx, 3777fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const LocationContext *parent, 3787fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const BlockDecl *BD, 3797fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek const void *ContextData) { 3807fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek llvm::FoldingSetNodeID ID; 3817fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek BlockInvocationContext::Profile(ID, ctx, parent, BD, ContextData); 3827fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek void *InsertPos; 3837fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek BlockInvocationContext *L = 3847fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek cast_or_null<BlockInvocationContext>(Contexts.FindNodeOrInsertPos(ID, 3857fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek InsertPos)); 3867fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek if (!L) { 3877fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek L = new BlockInvocationContext(ctx, parent, BD, ContextData); 3887fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek Contexts.InsertNode(L, InsertPos); 3897fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek } 3907fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek return L; 3917fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek} 3927fa9b4f258636d89342eda28f21a986c8ac353b1Ted Kremenek 393b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek//===----------------------------------------------------------------------===// 39467d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek// LocationContext methods. 39567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek//===----------------------------------------------------------------------===// 39667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 39767d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenekconst StackFrameContext *LocationContext::getCurrentStackFrame() const { 39867d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek const LocationContext *LC = this; 39967d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek while (LC) { 40067d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek if (const StackFrameContext *SFC = dyn_cast<StackFrameContext>(LC)) 40167d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek return SFC; 40267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek LC = LC->getParent(); 40367d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek } 4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 40567d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek} 40667d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek 407fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaksbool LocationContext::inTopFrame() const { 408fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks return getCurrentStackFrame()->inTopFrame(); 409fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks} 410fadcd5d5bbe1bfc1c6b8d819cc2242f780a49fecAnna Zaks 4118ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xubool LocationContext::isParentOf(const LocationContext *LC) const { 4128ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu do { 4138ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu const LocationContext *Parent = LC->getParent(); 4148ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu if (Parent == this) 4158ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu return true; 4168ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu else 4178ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu LC = Parent; 4188ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu } while (LC); 4198ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu 4208ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu return false; 4218ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu} 4228ddf7cead8a67342a4584a203e0bf736b7efedbeZhongxing Xu 423ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rosevoid LocationContext::dumpStack(raw_ostream &OS, StringRef Indent) const { 42475f8bd01319000b3e1438847505302670514759dJordan Rose ASTContext &Ctx = getAnalysisDeclContext()->getASTContext(); 42575f8bd01319000b3e1438847505302670514759dJordan Rose PrintingPolicy PP(Ctx.getLangOpts()); 42675f8bd01319000b3e1438847505302670514759dJordan Rose PP.TerseOutput = 1; 42775f8bd01319000b3e1438847505302670514759dJordan Rose 42875f8bd01319000b3e1438847505302670514759dJordan Rose unsigned Frame = 0; 42975f8bd01319000b3e1438847505302670514759dJordan Rose for (const LocationContext *LCtx = this; LCtx; LCtx = LCtx->getParent()) { 43075f8bd01319000b3e1438847505302670514759dJordan Rose switch (LCtx->getKind()) { 43175f8bd01319000b3e1438847505302670514759dJordan Rose case StackFrame: 432ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose OS << Indent << '#' << Frame++ << ' '; 433ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose cast<StackFrameContext>(LCtx)->getDecl()->print(OS, PP); 434ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose OS << '\n'; 43575f8bd01319000b3e1438847505302670514759dJordan Rose break; 43675f8bd01319000b3e1438847505302670514759dJordan Rose case Scope: 437ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose OS << Indent << " (scope)\n"; 43875f8bd01319000b3e1438847505302670514759dJordan Rose break; 43975f8bd01319000b3e1438847505302670514759dJordan Rose case Block: 440ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose OS << Indent << " (block context: " 44175f8bd01319000b3e1438847505302670514759dJordan Rose << cast<BlockInvocationContext>(LCtx)->getContextData() 44275f8bd01319000b3e1438847505302670514759dJordan Rose << ")\n"; 44375f8bd01319000b3e1438847505302670514759dJordan Rose break; 44475f8bd01319000b3e1438847505302670514759dJordan Rose } 44575f8bd01319000b3e1438847505302670514759dJordan Rose } 44675f8bd01319000b3e1438847505302670514759dJordan Rose} 44775f8bd01319000b3e1438847505302670514759dJordan Rose 448651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesLLVM_DUMP_METHOD void LocationContext::dumpStack() const { 449ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose dumpStack(llvm::errs()); 450ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose} 451ac7cc2d37e82181e73fcc265c1d0a619d18b7605Jordan Rose 45267d1287035767f4f6c8ca0c2bb755990012a44caTed Kremenek//===----------------------------------------------------------------------===// 453b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek// Lazily generated map to query the external variables referenced by a Block. 454b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek//===----------------------------------------------------------------------===// 455b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 456b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremeneknamespace { 457b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenekclass FindBlockDeclRefExprsVals : public StmtVisitor<FindBlockDeclRefExprsVals>{ 458b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek BumpVector<const VarDecl*> &BEVals; 459b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek BumpVectorContext &BC; 4609b20a90dff2ed605153c68a5c58b6aadcdb0952bBenjamin Kramer llvm::SmallPtrSet<const VarDecl*, 4> Visited; 4619b20a90dff2ed605153c68a5c58b6aadcdb0952bBenjamin Kramer llvm::SmallPtrSet<const DeclContext*, 4> IgnoredContexts; 462b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenekpublic: 463b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek FindBlockDeclRefExprsVals(BumpVector<const VarDecl*> &bevals, 464b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek BumpVectorContext &bc) 465b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek : BEVals(bevals), BC(bc) {} 4662cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek 467b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek void VisitStmt(Stmt *S) { 4687502c1d3ce8bb97bcc4f7bebef507040bd93b26fJohn McCall for (Stmt::child_range I = S->children(); I; ++I) 469b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek if (Stmt *child = *I) 470b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek Visit(child); 471b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek } 47285248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek 47315ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek void VisitDeclRefExpr(DeclRefExpr *DR) { 47485248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek // Non-local variables are also directly modified. 4759b20a90dff2ed605153c68a5c58b6aadcdb0952bBenjamin Kramer if (const VarDecl *VD = dyn_cast<VarDecl>(DR->getDecl())) { 47685248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek if (!VD->hasLocalStorage()) { 4779b20a90dff2ed605153c68a5c58b6aadcdb0952bBenjamin Kramer if (Visited.insert(VD)) 47885248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek BEVals.push_back(VD, BC); 47985248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek } 4809b20a90dff2ed605153c68a5c58b6aadcdb0952bBenjamin Kramer } 48185248734f404fbb9b2f88ecd5296761a8578def6Ted Kremenek } 4822cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek 4832cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek void VisitBlockExpr(BlockExpr *BR) { 4842cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek // Blocks containing blocks can transitively capture more variables. 4852cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek IgnoredContexts.insert(BR->getBlockDecl()); 4862cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek Visit(BR->getBlockDecl()->getBody()); 4872cfe28b6a061e72c6c8726d7ecb879093a1ab7a3Ted Kremenek } 48815ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek 48915ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek void VisitPseudoObjectExpr(PseudoObjectExpr *PE) { 49015ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek for (PseudoObjectExpr::semantics_iterator it = PE->semantics_begin(), 49115ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek et = PE->semantics_end(); it != et; ++it) { 49215ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek Expr *Semantic = *it; 49315ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(Semantic)) 49415ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek Semantic = OVE->getSourceExpr(); 49515ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek Visit(Semantic); 49615ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek } 49715ce164836472bfba88b30e53aa3f6ac0fb8a95dTed Kremenek } 498d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek}; 499b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek} // end anonymous namespace 500b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 501b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenektypedef BumpVector<const VarDecl*> DeclVec; 502b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 503b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenekstatic DeclVec* LazyInitializeReferencedDecls(const BlockDecl *BD, 504b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek void *&Vec, 505b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek llvm::BumpPtrAllocator &A) { 506b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek if (Vec) 507b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek return (DeclVec*) Vec; 508d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 509b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek BumpVectorContext BC(A); 510b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek DeclVec *BV = (DeclVec*) A.Allocate<DeclVec>(); 511b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek new (BV) DeclVec(BC, 10); 512d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 513b929f6636c79565e9a34c0656a962f9b198c5e80Ted Kremenek // Go through the capture list. 514651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &CI : BD->captures()) { 515651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines BV->push_back(CI.getVariable(), BC); 516b929f6636c79565e9a34c0656a962f9b198c5e80Ted Kremenek } 517b929f6636c79565e9a34c0656a962f9b198c5e80Ted Kremenek 518b929f6636c79565e9a34c0656a962f9b198c5e80Ted Kremenek // Find the referenced global/static variables. 519b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek FindBlockDeclRefExprsVals F(*BV, BC); 520b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek F.Visit(BD->getBody()); 521d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 522d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek Vec = BV; 523b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek return BV; 524b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek} 525b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 5261d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenekstd::pair<AnalysisDeclContext::referenced_decls_iterator, 5271d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek AnalysisDeclContext::referenced_decls_iterator> 5281d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContext::getReferencedBlockVars(const BlockDecl *BD) { 529b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek if (!ReferencedBlockVars) 530b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek ReferencedBlockVars = new llvm::DenseMap<const BlockDecl*,void*>(); 531d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 532b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek DeclVec *V = LazyInitializeReferencedDecls(BD, (*ReferencedBlockVars)[BD], A); 533b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek return std::make_pair(V->begin(), V->end()); 534b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek} 535b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 5361d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekManagedAnalysis *&AnalysisDeclContext::getAnalysisImpl(const void *tag) { 537a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek if (!ManagedAnalyses) 538a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek ManagedAnalyses = new ManagedAnalysisMap(); 539a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek ManagedAnalysisMap *M = (ManagedAnalysisMap*) ManagedAnalyses; 540a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek return (*M)[tag]; 541a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek} 542a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 543b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek//===----------------------------------------------------------------------===// 544b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek// Cleanup. 545b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek//===----------------------------------------------------------------------===// 546b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 547a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted KremenekManagedAnalysis::~ManagedAnalysis() {} 548a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek 5491d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContext::~AnalysisDeclContext() { 550b8ad5ee345fa1fdd1fa9253f2d01f69becc88a04Ted Kremenek delete forcedBlkExprs; 551b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek delete ReferencedBlockVars; 552a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek // Release the managed analyses. 553a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek if (ManagedAnalyses) { 554a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek ManagedAnalysisMap *M = (ManagedAnalysisMap*) ManagedAnalyses; 555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DeleteContainerSeconds(*M); 556a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek delete M; 557a5937bbfd19e61d651a58b0f0ffeef68457902a5Ted Kremenek } 558b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek} 559b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek 5601d26f48dc2eea1c07431ca1519d7034a21b9bcffTed KremenekAnalysisDeclContextManager::~AnalysisDeclContextManager() { 561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::DeleteContainerSeconds(Contexts); 562b1a7b65231e86f7da6aacbf00bcdc16c56350e65Ted Kremenek} 5630ee4124012950d7bb853438629b8e7652febf183Ted Kremenek 5640ee4124012950d7bb853438629b8e7652febf183Ted KremenekLocationContext::~LocationContext() {} 5650ee4124012950d7bb853438629b8e7652febf183Ted Kremenek 5660ee4124012950d7bb853438629b8e7652febf183Ted KremenekLocationContextManager::~LocationContextManager() { 5670ee4124012950d7bb853438629b8e7652febf183Ted Kremenek clear(); 5680ee4124012950d7bb853438629b8e7652febf183Ted Kremenek} 5690ee4124012950d7bb853438629b8e7652febf183Ted Kremenek 5700ee4124012950d7bb853438629b8e7652febf183Ted Kremenekvoid LocationContextManager::clear() { 5710ee4124012950d7bb853438629b8e7652febf183Ted Kremenek for (llvm::FoldingSet<LocationContext>::iterator I = Contexts.begin(), 572d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek E = Contexts.end(); I != E; ) { 5730ee4124012950d7bb853438629b8e7652febf183Ted Kremenek LocationContext *LC = &*I; 5740ee4124012950d7bb853438629b8e7652febf183Ted Kremenek ++I; 5750ee4124012950d7bb853438629b8e7652febf183Ted Kremenek delete LC; 5760ee4124012950d7bb853438629b8e7652febf183Ted Kremenek } 577d064fdc4b7b64ca55b40b70490c79d6f569df78eTed Kremenek 5780ee4124012950d7bb853438629b8e7652febf183Ted Kremenek Contexts.clear(); 5790ee4124012950d7bb853438629b8e7652febf183Ted Kremenek} 5800ee4124012950d7bb853438629b8e7652febf183Ted Kremenek 581