Author: george.karpenkov Date: Mon Oct 23 16:59:52 2017 New Revision: 316400
URL: http://llvm.org/viewvc/llvm-project?rev=316400&view=rev Log: [Analyzer] Do not use static storage to for implementations created in BodyFarm.cpp Differential Revision: https://reviews.llvm.org/D39208 Added: cfe/trunk/include/clang/Analysis/BodyFarm.h - copied, changed from r316249, cfe/trunk/lib/Analysis/BodyFarm.h Removed: cfe/trunk/lib/Analysis/BodyFarm.h Modified: cfe/trunk/include/clang/Analysis/AnalysisDeclContext.h cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp cfe/trunk/lib/Analysis/BodyFarm.cpp cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp Modified: cfe/trunk/include/clang/Analysis/AnalysisDeclContext.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/AnalysisDeclContext.h?rev=316400&r1=316399&r2=316400&view=diff ============================================================================== --- cfe/trunk/include/clang/Analysis/AnalysisDeclContext.h (original) +++ cfe/trunk/include/clang/Analysis/AnalysisDeclContext.h Mon Oct 23 16:59:52 2017 @@ -16,6 +16,7 @@ #define LLVM_CLANG_ANALYSIS_ANALYSISDECLCONTEXT_H #include "clang/AST/Decl.h" +#include "clang/Analysis/BodyFarm.h" #include "clang/Analysis/CFG.h" #include "clang/Analysis/CodeInjector.h" #include "llvm/ADT/DenseMap.h" @@ -409,6 +410,7 @@ class AnalysisDeclContextManager { typedef llvm::DenseMap<const Decl *, std::unique_ptr<AnalysisDeclContext>> ContextMap; + ASTContext &ASTCtx; ContextMap Contexts; LocationContextManager LocContexts; CFG::BuildOptions cfgBuildOptions; @@ -416,22 +418,25 @@ class AnalysisDeclContextManager { /// Pointer to an interface that can provide function bodies for /// declarations from external source. std::unique_ptr<CodeInjector> Injector; - + + /// Pointer to a factory for creating and caching implementations for common + /// methods during the analysis. + BodyFarm *BdyFrm = nullptr; + /// Flag to indicate whether or not bodies should be synthesized /// for well-known functions. bool SynthesizeBodies; public: - AnalysisDeclContextManager(bool useUnoptimizedCFG = false, + AnalysisDeclContextManager(ASTContext &ASTCtx, bool useUnoptimizedCFG = false, bool addImplicitDtors = false, bool addInitializers = false, bool addTemporaryDtors = false, - bool addLifetime = false, - bool addLoopExit = false, + bool addLifetime = false, bool addLoopExit = false, bool synthesizeBodies = false, bool addStaticInitBranches = false, bool addCXXNewAllocator = true, - CodeInjector* injector = nullptr); + CodeInjector *injector = nullptr); ~AnalysisDeclContextManager(); @@ -472,6 +477,9 @@ public: return LocContexts.getStackFrame(getContext(D), Parent, S, Blk, Idx); } + /// Get and lazily create a {@code BodyFarm} instance. + BodyFarm *getBodyFarm(); + /// Discard all previously created AnalysisDeclContexts. void clear(); Copied: cfe/trunk/include/clang/Analysis/BodyFarm.h (from r316249, cfe/trunk/lib/Analysis/BodyFarm.h) URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/BodyFarm.h?p2=cfe/trunk/include/clang/Analysis/BodyFarm.h&p1=cfe/trunk/lib/Analysis/BodyFarm.h&r1=316249&r2=316400&rev=316400&view=diff ============================================================================== --- cfe/trunk/lib/Analysis/BodyFarm.h (original) +++ cfe/trunk/include/clang/Analysis/BodyFarm.h Mon Oct 23 16:59:52 2017 @@ -28,11 +28,11 @@ class ObjCMethodDecl; class ObjCPropertyDecl; class Stmt; class CodeInjector; - + class BodyFarm { public: BodyFarm(ASTContext &C, CodeInjector *injector) : C(C), Injector(injector) {} - + /// Factory method for creating bodies for ordinary functions. Stmt *getBody(const FunctionDecl *D); @@ -40,12 +40,12 @@ public: Stmt *getBody(const ObjCMethodDecl *D); private: - typedef llvm::DenseMap<const Decl *, Optional<Stmt *> > BodyMap; + typedef llvm::DenseMap<const Decl *, Optional<Stmt *>> BodyMap; ASTContext &C; BodyMap Bodies; CodeInjector *Injector; }; -} +} // namespace clang #endif Modified: cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp?rev=316400&r1=316399&r2=316400&view=diff ============================================================================== --- cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp (original) +++ cfe/trunk/lib/Analysis/AnalysisDeclContext.cpp Mon Oct 23 16:59:52 2017 @@ -13,7 +13,6 @@ //===----------------------------------------------------------------------===// #include "clang/Analysis/AnalysisDeclContext.h" -#include "BodyFarm.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclObjC.h" @@ -23,6 +22,7 @@ #include "clang/Analysis/Analyses/CFGReachabilityAnalysis.h" #include "clang/Analysis/Analyses/LiveVariables.h" #include "clang/Analysis/Analyses/PseudoConstantAnalysis.h" +#include "clang/Analysis/BodyFarm.h" #include "clang/Analysis/CFG.h" #include "clang/Analysis/CFGStmtMap.h" #include "clang/Analysis/Support/BumpVector.h" @@ -63,18 +63,12 @@ AnalysisDeclContext::AnalysisDeclContext cfgBuildOptions.forcedBlkExprs = &forcedBlkExprs; } -AnalysisDeclContextManager::AnalysisDeclContextManager(bool useUnoptimizedCFG, - bool addImplicitDtors, - bool addInitializers, - bool addTemporaryDtors, - bool addLifetime, - bool addLoopExit, - bool synthesizeBodies, - bool addStaticInitBranch, - bool addCXXNewAllocator, - CodeInjector *injector) - : Injector(injector), SynthesizeBodies(synthesizeBodies) -{ +AnalysisDeclContextManager::AnalysisDeclContextManager( + ASTContext &ASTCtx, bool useUnoptimizedCFG, bool addImplicitDtors, + bool addInitializers, bool addTemporaryDtors, bool addLifetime, + bool addLoopExit, bool synthesizeBodies, bool addStaticInitBranch, + bool addCXXNewAllocator, CodeInjector *injector) + : ASTCtx(ASTCtx), Injector(injector), SynthesizeBodies(synthesizeBodies) { cfgBuildOptions.PruneTriviallyFalseEdges = !useUnoptimizedCFG; cfgBuildOptions.AddImplicitDtors = addImplicitDtors; cfgBuildOptions.AddInitializers = addInitializers; @@ -87,11 +81,6 @@ AnalysisDeclContextManager::AnalysisDecl void AnalysisDeclContextManager::clear() { Contexts.clear(); } -static BodyFarm &getBodyFarm(ASTContext &C, CodeInjector *injector = nullptr) { - static BodyFarm *BF = new BodyFarm(C, injector); - return *BF; -} - Stmt *AnalysisDeclContext::getBody(bool &IsAutosynthesized) const { IsAutosynthesized = false; if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { @@ -99,8 +88,7 @@ Stmt *AnalysisDeclContext::getBody(bool if (auto *CoroBody = dyn_cast_or_null<CoroutineBodyStmt>(Body)) Body = CoroBody->getBody(); if (Manager && Manager->synthesizeBodies()) { - Stmt *SynthesizedBody = - getBodyFarm(getASTContext(), Manager->Injector.get()).getBody(FD); + Stmt *SynthesizedBody = Manager->getBodyFarm()->getBody(FD); if (SynthesizedBody) { Body = SynthesizedBody; IsAutosynthesized = true; @@ -111,8 +99,7 @@ Stmt *AnalysisDeclContext::getBody(bool else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) { Stmt *Body = MD->getBody(); if (Manager && Manager->synthesizeBodies()) { - Stmt *SynthesizedBody = - getBodyFarm(getASTContext(), Manager->Injector.get()).getBody(MD); + Stmt *SynthesizedBody = Manager->getBodyFarm()->getBody(MD); if (SynthesizedBody) { Body = SynthesizedBody; IsAutosynthesized = true; @@ -317,6 +304,12 @@ AnalysisDeclContext *AnalysisDeclContext return AC.get(); } +BodyFarm *AnalysisDeclContextManager::getBodyFarm() { + if (!BdyFrm) + BdyFrm = new BodyFarm(ASTCtx, Injector.get()); + return BdyFrm; +} + const StackFrameContext * AnalysisDeclContext::getStackFrame(LocationContext const *Parent, const Stmt *S, const CFGBlock *Blk, unsigned Idx) { @@ -610,7 +603,10 @@ AnalysisDeclContext::~AnalysisDeclContex } } -AnalysisDeclContextManager::~AnalysisDeclContextManager() {} +AnalysisDeclContextManager::~AnalysisDeclContextManager() { + if (!BdyFrm) + delete BdyFrm; +} LocationContext::~LocationContext() {} Modified: cfe/trunk/lib/Analysis/BodyFarm.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BodyFarm.cpp?rev=316400&r1=316399&r2=316400&view=diff ============================================================================== --- cfe/trunk/lib/Analysis/BodyFarm.cpp (original) +++ cfe/trunk/lib/Analysis/BodyFarm.cpp Mon Oct 23 16:59:52 2017 @@ -12,7 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "BodyFarm.h" +#include "clang/Analysis/BodyFarm.h" #include "clang/AST/ASTContext.h" #include "clang/AST/CXXInheritance.h" #include "clang/AST/Decl.h" Removed: cfe/trunk/lib/Analysis/BodyFarm.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BodyFarm.h?rev=316399&view=auto ============================================================================== --- cfe/trunk/lib/Analysis/BodyFarm.h (original) +++ cfe/trunk/lib/Analysis/BodyFarm.h (removed) @@ -1,51 +0,0 @@ -//== BodyFarm.h - Factory for conjuring up fake bodies -------------*- C++ -*-// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// BodyFarm is a factory for creating faux implementations for functions/methods -// for analysis purposes. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_LIB_ANALYSIS_BODYFARM_H -#define LLVM_CLANG_LIB_ANALYSIS_BODYFARM_H - -#include "clang/AST/DeclBase.h" -#include "clang/Basic/LLVM.h" -#include "llvm/ADT/DenseMap.h" -#include "llvm/ADT/Optional.h" - -namespace clang { - -class ASTContext; -class FunctionDecl; -class ObjCMethodDecl; -class ObjCPropertyDecl; -class Stmt; -class CodeInjector; - -class BodyFarm { -public: - BodyFarm(ASTContext &C, CodeInjector *injector) : C(C), Injector(injector) {} - - /// Factory method for creating bodies for ordinary functions. - Stmt *getBody(const FunctionDecl *D); - - /// Factory method for creating bodies for Objective-C properties. - Stmt *getBody(const ObjCMethodDecl *D); - -private: - typedef llvm::DenseMap<const Decl *, Optional<Stmt *> > BodyMap; - - ASTContext &C; - BodyMap Bodies; - CodeInjector *Injector; -}; -} - -#endif Modified: cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp?rev=316400&r1=316399&r2=316400&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Core/AnalysisManager.cpp Mon Oct 23 16:59:52 2017 @@ -14,33 +14,25 @@ using namespace ento; void AnalysisManager::anchor() { } -AnalysisManager::AnalysisManager(ASTContext &ctx, DiagnosticsEngine &diags, - const LangOptions &lang, - const PathDiagnosticConsumers &PDC, - StoreManagerCreator storemgr, - ConstraintManagerCreator constraintmgr, - CheckerManager *checkerMgr, - AnalyzerOptions &Options, - CodeInjector *injector) - : AnaCtxMgr(Options.UnoptimizedCFG, - Options.includeImplicitDtorsInCFG(), - /*AddInitializers=*/true, - Options.includeTemporaryDtorsInCFG(), - Options.includeLifetimeInCFG(), - // Adding LoopExit elements to the CFG is a requirement for loop - // unrolling. - Options.includeLoopExitInCFG() || Options.shouldUnrollLoops(), - Options.shouldSynthesizeBodies(), - Options.shouldConditionalizeStaticInitializers(), - /*addCXXNewAllocator=*/true, - injector), - Ctx(ctx), - Diags(diags), - LangOpts(lang), - PathConsumers(PDC), - CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), - CheckerMgr(checkerMgr), - options(Options) { +AnalysisManager::AnalysisManager( + ASTContext &ASTCtx, DiagnosticsEngine &diags, const LangOptions &lang, + const PathDiagnosticConsumers &PDC, StoreManagerCreator storemgr, + ConstraintManagerCreator constraintmgr, CheckerManager *checkerMgr, + AnalyzerOptions &Options, CodeInjector *injector) + : AnaCtxMgr(ASTCtx, Options.UnoptimizedCFG, + Options.includeImplicitDtorsInCFG(), + /*AddInitializers=*/true, Options.includeTemporaryDtorsInCFG(), + Options.includeLifetimeInCFG(), + // Adding LoopExit elements to the CFG is a requirement for loop + // unrolling. + Options.includeLoopExitInCFG() || Options.shouldUnrollLoops(), + Options.shouldSynthesizeBodies(), + Options.shouldConditionalizeStaticInitializers(), + /*addCXXNewAllocator=*/true, + injector), + Ctx(ASTCtx), Diags(diags), LangOpts(lang), PathConsumers(PDC), + CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr), + CheckerMgr(checkerMgr), options(Options) { AnaCtxMgr.getCFGBuildOptions().setAllAlwaysAdd(); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits