AnalysisManager.cpp revision d6471f7c1921c7802804ce3ff6fe9768310f72b9
1ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis//===-- AnalysisManager.cpp -------------------------------------*- C++ -*-===//
2ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis//
3ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
4ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis//
5ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
6ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
7ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis//
8ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
9ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis
10ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
11ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis#include "clang/Index/Entity.h"
12ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis#include "clang/Index/Indexer.h"
13ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis
14ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidisusing namespace clang;
15ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidisusing namespace ento;
16ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis
174ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios KyrtzidisAnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags,
18b1ba0efc3d1dc1daa5d82c40bc504e1f368c4fa0Chandler Carruth                                 const LangOptions &lang, PathDiagnosticClient *pd,
19ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 StoreManagerCreator storemgr,
20ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 ConstraintManagerCreator constraintmgr,
21ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 CheckerManager *checkerMgr,
22ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 idx::Indexer *idxer,
23ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 unsigned maxnodes, unsigned maxvisit,
24ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 bool vizdot, bool vizubi, bool purge,
25ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis                                 bool eager, bool trim,
264ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis                                 bool inlinecall, bool useUnoptimizedCFG,
274ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis                                 bool addImplicitDtors, bool addInitializers,
284ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis                                 bool eagerlyTrimEGraph)
294ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis  : AnaCtxMgr(useUnoptimizedCFG, addImplicitDtors, addInitializers),
304ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd),
314ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
324ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    CheckerMgr(checkerMgr), Idxer(idxer),
334ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    AScope(ScopeDecl), MaxNodes(maxnodes), MaxVisit(maxvisit),
344ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
354ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    EagerlyAssume(eager), TrimGraph(trim), InlineCall(inlinecall),
364ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis    EagerlyTrimEGraph(eagerlyTrimEGraph)
374ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis{
384ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis  AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd();
394ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis}
404ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis
41ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios KyrtzidisAnalysisContext *
42ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios KyrtzidisAnalysisManager::getAnalysisContextInAnotherTU(const Decl *D) {
43ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis  idx::Entity Ent = idx::Entity::get(const_cast<Decl *>(D),
444ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis                                     Idxer->getProgram());
454ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis  FunctionDecl *FuncDef;
464ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis  idx::TranslationUnit *TU;
474ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis  llvm::tie(FuncDef, TU) = Idxer->getDefinitionFor(Ent);
484ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis
49ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis  if (FuncDef == 0)
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return 0;
51ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis
524ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis  // This AnalysisContext wraps function definition in another translation unit.
53ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis  // But it is still owned by the AnalysisManager associated with the current
54ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis  // translation unit.
55ea2224d7078c4d31ad32adbaba4bdc2d85a3d609Argyrios Kyrtzidis  return AnaCtxMgr.getContext(FuncDef, TU);
564ce831cba3ae3030674fd9d90f8a69f7b3938d63Argyrios Kyrtzidis}
57cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko