george.karpenkov updated this revision to Diff 120861. https://reviews.llvm.org/D39428
Files: include/clang/Analysis/AnalysisDeclContext.h include/clang/Analysis/BodyFarm.h lib/Analysis/AnalysisDeclContext.cpp Index: lib/Analysis/AnalysisDeclContext.cpp =================================================================== --- lib/Analysis/AnalysisDeclContext.cpp +++ lib/Analysis/AnalysisDeclContext.cpp @@ -68,7 +68,8 @@ bool addInitializers, bool addTemporaryDtors, bool addLifetime, bool addLoopExit, bool synthesizeBodies, bool addStaticInitBranch, bool addCXXNewAllocator, CodeInjector *injector) - : ASTCtx(ASTCtx), Injector(injector), SynthesizeBodies(synthesizeBodies) { + : ASTCtx(ASTCtx), Injector(injector), FunctionBodyFarm(ASTCtx, injector), + SynthesizeBodies(synthesizeBodies) { cfgBuildOptions.PruneTriviallyFalseEdges = !useUnoptimizedCFG; cfgBuildOptions.AddImplicitDtors = addImplicitDtors; cfgBuildOptions.AddInitializers = addInitializers; @@ -88,7 +89,7 @@ if (auto *CoroBody = dyn_cast_or_null<CoroutineBodyStmt>(Body)) Body = CoroBody->getBody(); if (Manager && Manager->synthesizeBodies()) { - Stmt *SynthesizedBody = Manager->getBodyFarm()->getBody(FD); + Stmt *SynthesizedBody = Manager->getBodyFarm().getBody(FD); if (SynthesizedBody) { Body = SynthesizedBody; IsAutosynthesized = true; @@ -99,7 +100,7 @@ else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) { Stmt *Body = MD->getBody(); if (Manager && Manager->synthesizeBodies()) { - Stmt *SynthesizedBody = Manager->getBodyFarm()->getBody(MD); + Stmt *SynthesizedBody = Manager->getBodyFarm().getBody(MD); if (SynthesizedBody) { Body = SynthesizedBody; IsAutosynthesized = true; @@ -304,10 +305,8 @@ return AC.get(); } -BodyFarm *AnalysisDeclContextManager::getBodyFarm() { - if (!FunctionBodyFarm) - FunctionBodyFarm = llvm::make_unique<BodyFarm>(ASTCtx, Injector.get()); - return FunctionBodyFarm.get(); +BodyFarm& AnalysisDeclContextManager::getBodyFarm() { + return FunctionBodyFarm; } const StackFrameContext * Index: include/clang/Analysis/BodyFarm.h =================================================================== --- include/clang/Analysis/BodyFarm.h +++ include/clang/Analysis/BodyFarm.h @@ -39,6 +39,9 @@ /// Factory method for creating bodies for Objective-C properties. Stmt *getBody(const ObjCMethodDecl *D); + /// Remove copy constructor to avoid accidental copying. + BodyFarm(const BodyFarm& other) = delete; + private: typedef llvm::DenseMap<const Decl *, Optional<Stmt *>> BodyMap; Index: include/clang/Analysis/AnalysisDeclContext.h =================================================================== --- include/clang/Analysis/AnalysisDeclContext.h +++ include/clang/Analysis/AnalysisDeclContext.h @@ -419,9 +419,9 @@ /// declarations from external source. std::unique_ptr<CodeInjector> Injector; - /// Pointer to a factory for creating and caching implementations for common + /// A factory for creating and caching implementations for common /// methods during the analysis. - std::unique_ptr<BodyFarm> FunctionBodyFarm; + BodyFarm FunctionBodyFarm; /// Flag to indicate whether or not bodies should be synthesized /// for well-known functions. @@ -475,8 +475,8 @@ return LocContexts.getStackFrame(getContext(D), Parent, S, Blk, Idx); } - /// Get and lazily create a {@code BodyFarm} instance. - BodyFarm *getBodyFarm(); + /// Get a reference to {@code BodyFarm} instance. + BodyFarm& getBodyFarm(); /// Discard all previously created AnalysisDeclContexts. void clear();
Index: lib/Analysis/AnalysisDeclContext.cpp =================================================================== --- lib/Analysis/AnalysisDeclContext.cpp +++ lib/Analysis/AnalysisDeclContext.cpp @@ -68,7 +68,8 @@ bool addInitializers, bool addTemporaryDtors, bool addLifetime, bool addLoopExit, bool synthesizeBodies, bool addStaticInitBranch, bool addCXXNewAllocator, CodeInjector *injector) - : ASTCtx(ASTCtx), Injector(injector), SynthesizeBodies(synthesizeBodies) { + : ASTCtx(ASTCtx), Injector(injector), FunctionBodyFarm(ASTCtx, injector), + SynthesizeBodies(synthesizeBodies) { cfgBuildOptions.PruneTriviallyFalseEdges = !useUnoptimizedCFG; cfgBuildOptions.AddImplicitDtors = addImplicitDtors; cfgBuildOptions.AddInitializers = addInitializers; @@ -88,7 +89,7 @@ if (auto *CoroBody = dyn_cast_or_null<CoroutineBodyStmt>(Body)) Body = CoroBody->getBody(); if (Manager && Manager->synthesizeBodies()) { - Stmt *SynthesizedBody = Manager->getBodyFarm()->getBody(FD); + Stmt *SynthesizedBody = Manager->getBodyFarm().getBody(FD); if (SynthesizedBody) { Body = SynthesizedBody; IsAutosynthesized = true; @@ -99,7 +100,7 @@ else if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(D)) { Stmt *Body = MD->getBody(); if (Manager && Manager->synthesizeBodies()) { - Stmt *SynthesizedBody = Manager->getBodyFarm()->getBody(MD); + Stmt *SynthesizedBody = Manager->getBodyFarm().getBody(MD); if (SynthesizedBody) { Body = SynthesizedBody; IsAutosynthesized = true; @@ -304,10 +305,8 @@ return AC.get(); } -BodyFarm *AnalysisDeclContextManager::getBodyFarm() { - if (!FunctionBodyFarm) - FunctionBodyFarm = llvm::make_unique<BodyFarm>(ASTCtx, Injector.get()); - return FunctionBodyFarm.get(); +BodyFarm& AnalysisDeclContextManager::getBodyFarm() { + return FunctionBodyFarm; } const StackFrameContext * Index: include/clang/Analysis/BodyFarm.h =================================================================== --- include/clang/Analysis/BodyFarm.h +++ include/clang/Analysis/BodyFarm.h @@ -39,6 +39,9 @@ /// Factory method for creating bodies for Objective-C properties. Stmt *getBody(const ObjCMethodDecl *D); + /// Remove copy constructor to avoid accidental copying. + BodyFarm(const BodyFarm& other) = delete; + private: typedef llvm::DenseMap<const Decl *, Optional<Stmt *>> BodyMap; Index: include/clang/Analysis/AnalysisDeclContext.h =================================================================== --- include/clang/Analysis/AnalysisDeclContext.h +++ include/clang/Analysis/AnalysisDeclContext.h @@ -419,9 +419,9 @@ /// declarations from external source. std::unique_ptr<CodeInjector> Injector; - /// Pointer to a factory for creating and caching implementations for common + /// A factory for creating and caching implementations for common /// methods during the analysis. - std::unique_ptr<BodyFarm> FunctionBodyFarm; + BodyFarm FunctionBodyFarm; /// Flag to indicate whether or not bodies should be synthesized /// for well-known functions. @@ -475,8 +475,8 @@ return LocContexts.getStackFrame(getContext(D), Parent, S, Blk, Idx); } - /// Get and lazily create a {@code BodyFarm} instance. - BodyFarm *getBodyFarm(); + /// Get a reference to {@code BodyFarm} instance. + BodyFarm& getBodyFarm(); /// Discard all previously created AnalysisDeclContexts. void clear();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits