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