AnalysisManager.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //===-- AnalysisManager.cpp -------------------------------------*- 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. #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
  10. using namespace clang;
  11. using namespace ento;
  12. void AnalysisManager::anchor() { }
  13. AnalysisManager::AnalysisManager(ASTContext &ASTCtx, DiagnosticsEngine &diags,
  14. const PathDiagnosticConsumers &PDC,
  15. StoreManagerCreator storemgr,
  16. ConstraintManagerCreator constraintmgr,
  17. CheckerManager *checkerMgr,
  18. AnalyzerOptions &Options,
  19. CodeInjector *injector)
  20. : AnaCtxMgr(
  21. ASTCtx, Options.UnoptimizedCFG,
  22. Options.ShouldIncludeImplicitDtorsInCFG,
  23. /*AddInitializers=*/true,
  24. Options.ShouldIncludeTemporaryDtorsInCFG,
  25. Options.ShouldIncludeLifetimeInCFG,
  26. // Adding LoopExit elements to the CFG is a requirement for loop
  27. // unrolling.
  28. Options.ShouldIncludeLoopExitInCFG ||
  29. Options.ShouldUnrollLoops,
  30. Options.ShouldIncludeScopesInCFG,
  31. Options.ShouldSynthesizeBodies,
  32. Options.ShouldConditionalizeStaticInitializers,
  33. /*addCXXNewAllocator=*/true,
  34. Options.ShouldIncludeRichConstructorsInCFG,
  35. Options.ShouldElideConstructors, injector),
  36. Ctx(ASTCtx), Diags(diags), LangOpts(ASTCtx.getLangOpts()),
  37. PathConsumers(PDC), CreateStoreMgr(storemgr),
  38. CreateConstraintMgr(constraintmgr), CheckerMgr(checkerMgr),
  39. options(Options) {
  40. AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd();
  41. }
  42. AnalysisManager::~AnalysisManager() {
  43. FlushDiagnostics();
  44. for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
  45. E = PathConsumers.end(); I != E; ++I) {
  46. delete *I;
  47. }
  48. }
  49. void AnalysisManager::FlushDiagnostics() {
  50. PathDiagnosticConsumer::FilesMade filesMade;
  51. for (PathDiagnosticConsumers::iterator I = PathConsumers.begin(),
  52. E = PathConsumers.end();
  53. I != E; ++I) {
  54. (*I)->FlushDiagnostics(&filesMade);
  55. }
  56. }