[PATCH] D39428: [Analyzer] As suggested, use value storage for BodyFarm
George Karpenkov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 30 11:53:08 PDT 2017
george.karpenkov created this revision.
Herald added subscribers: szepet, kristof.beyls, xazax.hun, javed.absar, aemerson.
I've also removed copy constructor to help clients not to shoot themselves in the foot with `BodyFarm stored = Manager.getBodyFarm()`.
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.
@@ -476,7 +476,7 @@
}
/// Get and lazily create a {@code BodyFarm} instance.
- BodyFarm *getBodyFarm();
+ BodyFarm& getBodyFarm();
/// Discard all previously created AnalysisDeclContexts.
void clear();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D39428.120851.patch
Type: text/x-patch
Size: 3366 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171030/ad4f331f/attachment.bin>
More information about the cfe-commits
mailing list