AnalysisDeclContext.cpp revision 97ab3941effe1f508c7113d9aa0c2887774f6fa8
1//== AnalysisContext.cpp - Analysis context for Path Sens analysis -*- C++ -*-//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines AnalysisContext, a class that manages the analysis context
11// data for path sensitive analysis.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Analysis/PathSensitive/AnalysisContext.h"
16#include "clang/Analysis/Analyses/LiveVariables.h"
17#include "clang/Analysis/CFG.h"
18#include "clang/AST/Decl.h"
19#include "clang/AST/DeclObjC.h"
20#include "clang/AST/ParentMap.h"
21
22using namespace clang;
23
24AnalysisContext::~AnalysisContext() {
25  delete cfg;
26  delete liveness;
27  delete PM;
28}
29
30Stmt *AnalysisContext::getBody() {
31  if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
32    return FD->getBody();
33  else if (ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D))
34    return MD->getBody();
35
36  assert(0 && "unknown code decl");
37}
38
39CFG *AnalysisContext::getCFG() {
40  if (!cfg)
41    cfg = CFG::buildCFG(getBody(), &D->getASTContext());
42  return cfg;
43}
44
45ParentMap &AnalysisContext::getParentMap() {
46  if (!PM)
47    PM = new ParentMap(getBody());
48  return *PM;
49}
50
51LiveVariables *AnalysisContext::getLiveVariables() {
52  if (!liveness) {
53    CFG *c = getCFG();
54    if (!c)
55      return 0;
56
57    liveness = new LiveVariables(D->getASTContext(), *c);
58    liveness->runOnCFG(*c);
59    liveness->runOnAllBlocks(*c, 0, true);
60  }
61
62  return liveness;
63}
64
65AnalysisContext *AnalysisContextManager::getContext(Decl *D) {
66  iterator I = Contexts.find(D);
67  if (I != Contexts.end())
68    return &(I->second);
69
70  AnalysisContext &Ctx = Contexts[D];
71  Ctx.setDecl(D);
72  return &Ctx;
73}
74