diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-07-30 01:17:21 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-07-30 01:17:21 +0000 |
commit | 97ab3941effe1f508c7113d9aa0c2887774f6fa8 (patch) | |
tree | ec1800bdf281acc3761de17d7f16a2361a9f43f9 /lib/Analysis/AnalysisContext.cpp | |
parent | d254a25bc1793a2387e37b96568285883fb12eff (diff) |
This patch collects all analysis context data into a new class
AnalysisContext.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77563 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/AnalysisContext.cpp')
-rw-r--r-- | lib/Analysis/AnalysisContext.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp new file mode 100644 index 0000000000..ba1b5ae23f --- /dev/null +++ b/lib/Analysis/AnalysisContext.cpp @@ -0,0 +1,73 @@ +//== AnalysisContext.cpp - Analysis context for Path Sens analysis -*- C++ -*-// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines AnalysisContext, a class that manages the analysis context +// data for path sensitive analysis. +// +//===----------------------------------------------------------------------===// + +#include "clang/Analysis/PathSensitive/AnalysisContext.h" +#include "clang/Analysis/Analyses/LiveVariables.h" +#include "clang/Analysis/CFG.h" +#include "clang/AST/Decl.h" +#include "clang/AST/DeclObjC.h" +#include "clang/AST/ParentMap.h" + +using namespace clang; + +AnalysisContext::~AnalysisContext() { + delete cfg; + delete liveness; + delete PM; +} + +Stmt *AnalysisContext::getBody() { + if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) + return FD->getBody(); + else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) + return MD->getBody(); + + assert(0 && "unknown code decl"); +} + +CFG *AnalysisContext::getCFG() { + if (!cfg) + cfg = CFG::buildCFG(getBody(), &D->getASTContext()); + return cfg; +} + +ParentMap &AnalysisContext::getParentMap() { + if (!PM) + PM = new ParentMap(getBody()); + return *PM; +} + +LiveVariables *AnalysisContext::getLiveVariables() { + if (!liveness) { + CFG *c = getCFG(); + if (!c) + return 0; + + liveness = new LiveVariables(D->getASTContext(), *c); + liveness->runOnCFG(*c); + liveness->runOnAllBlocks(*c, 0, true); + } + + return liveness; +} + +AnalysisContext *AnalysisContextManager::getContext(Decl *D) { + iterator I = Contexts.find(D); + if (I != Contexts.end()) + return &(I->second); + + AnalysisContext &Ctx = Contexts[D]; + Ctx.setDecl(D); + return &Ctx; +} |