AnalysisManager.h revision fda7832b000ff8927386f093b52c067641679469
1fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//== AnalysisManager.cpp - Path sensitive analysis data manager ----*- C++ -*-//
2fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
3fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//                     The LLVM Compiler Infrastructure
4fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
5fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file is distributed under the University of Illinois Open Source
6fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// License. See LICENSE.TXT for details.
7fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
8fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===//
9fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
10fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// This file defines the AnalysisManager class that manages the data and policy
11fda7832b000ff8927386f093b52c067641679469Zhongxing Xu// for path sensitive analysis.
12fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//
13fda7832b000ff8927386f093b52c067641679469Zhongxing Xu//===----------------------------------------------------------------------===//
14fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
15fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#ifndef LLVM_CLANG_ANALYSIS_ANALYSISMANAGER_H
16fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#define LLVM_CLANG_ANALYSIS_ANALYSISMANAGER_H
17fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
18fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include "clang/Analysis/PathSensitive/BugReporter.h"
19fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include "clang/Analysis/PathSensitive/AnalysisContext.h"
20fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#include "clang/Analysis/PathDiagnostic.h"
21fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
22fda7832b000ff8927386f093b52c067641679469Zhongxing Xunamespace clang {
23fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
24fda7832b000ff8927386f093b52c067641679469Zhongxing Xuclass AnalysisManager : public BugReporterData {
25fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  AnalysisContextManager ContextMgr;
26fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  AnalysisContext *CurrentContext;
27fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
28fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ASTContext &Ctx;
29fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  Diagnostic &Diags;
30fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  const LangOptions &LangInfo;
31fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
32fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  llvm::OwningPtr<PathDiagnosticClient> PD;
33fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
34fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  // Configurable components creators.
35fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator CreateStoreMgr;
36fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator CreateConstraintMgr;
37fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
38fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
39fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
40fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool DisplayedFunction;
41fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool VisualizeEGDot;
42fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool VisualizeEGUbi;
43fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool PurgeDead;
44fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool EagerlyAssume;
45fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool TrimGraph;
46fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
47fda7832b000ff8927386f093b52c067641679469Zhongxing Xupublic:
48fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  AnalysisManager(Decl *d, ASTContext &ctx, Diagnostic &diags,
49fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  const LangOptions &lang, PathDiagnosticClient *pd,
50fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  StoreManagerCreator storemgr,
51fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  ConstraintManagerCreator constraintmgr,
52fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  bool displayProgress, bool vizdot, bool vizubi,
53fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  bool purge, bool eager, bool trim)
54fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
55fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd),
56fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
57fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      AScope(ScopeDecl), DisplayedFunction(!displayProgress),
58fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
59fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      EagerlyAssume(eager), TrimGraph(trim) {
60fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
61fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    CurrentContext = ContextMgr.getContext(d);
62fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
63fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
64fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  AnalysisManager(ASTContext &ctx, Diagnostic &diags,
65fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  const LangOptions &lang, PathDiagnosticClient *pd,
66fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  StoreManagerCreator storemgr,
67fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  ConstraintManagerCreator constraintmgr,
68fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  bool displayProgress, bool vizdot, bool vizubi,
69fda7832b000ff8927386f093b52c067641679469Zhongxing Xu                  bool purge, bool eager, bool trim)
70fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
71fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd),
72fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
73fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      AScope(ScopeDecl), DisplayedFunction(!displayProgress),
74fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
75fda7832b000ff8927386f093b52c067641679469Zhongxing Xu      EagerlyAssume(eager), TrimGraph(trim) {
76fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
77fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    CurrentContext = 0;
78fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
79fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
80fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  Decl *getCodeDecl() const {
81fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    assert (AScope == ScopeDecl);
82fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CurrentContext->getDecl();
83fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
84fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
85fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  Stmt *getBody() const {
86fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    assert (AScope == ScopeDecl);
87fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CurrentContext->getBody();
88fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
89fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
90fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  StoreManagerCreator getStoreManagerCreator() {
91fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateStoreMgr;
92fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  };
93fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
94fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  ConstraintManagerCreator getConstraintManagerCreator() {
95fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CreateConstraintMgr;
96fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
97fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
98fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual CFG *getCFG() {
99fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CurrentContext->getCFG();
100fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
101fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
102fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual ParentMap &getParentMap() {
103fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CurrentContext->getParentMap();
104fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
105fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
106fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual LiveVariables *getLiveVariables() {
107fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return CurrentContext->getLiveVariables();
108fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
109fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
110fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual ASTContext &getContext() {
111fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Ctx;
112fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
113fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
114fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual SourceManager &getSourceManager() {
115fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return getContext().getSourceManager();
116fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
117fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
118fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual Diagnostic &getDiagnostic() {
119fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return Diags;
120fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
121fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
122fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  const LangOptions &getLangOptions() const {
123fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return LangInfo;
124fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
125fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
126fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  virtual PathDiagnosticClient *getPathDiagnosticClient() {
127fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return PD.get();
128fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
129fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
130fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualizeGraphviz() const { return VisualizeEGDot; }
131fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
132fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualizeUbigraph() const { return VisualizeEGUbi; }
133fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
134fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldVisualize() const {
135fda7832b000ff8927386f093b52c067641679469Zhongxing Xu    return VisualizeEGDot || VisualizeEGUbi;
136fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  }
137fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
138fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldTrimGraph() const { return TrimGraph; }
139fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
140fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldPurgeDead() const { return PurgeDead; }
141fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
142fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  bool shouldEagerlyAssume() const { return EagerlyAssume; }
143fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
144fda7832b000ff8927386f093b52c067641679469Zhongxing Xu  void DisplayFunction();
145fda7832b000ff8927386f093b52c067641679469Zhongxing Xu};
146fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
147fda7832b000ff8927386f093b52c067641679469Zhongxing Xu}
148fda7832b000ff8927386f093b52c067641679469Zhongxing Xu
149fda7832b000ff8927386f093b52c067641679469Zhongxing Xu#endif
150