forked from OSchip/llvm-project
Add destructor and cleanup code to LocationContext (fixing some leaks). Along the way, have
AnalysisManager periodically cleanup its AnalysisContextManager and LocationContextManager objects, as they don't need to forever retain all the CFGs ever created when analyzing a file. llvm-svn: 84684
This commit is contained in:
parent
a6faf60831
commit
d45ff6cced
|
@ -60,6 +60,9 @@ public:
|
|||
~AnalysisContextManager();
|
||||
|
||||
AnalysisContext *getContext(const Decl *D);
|
||||
|
||||
// Discard all previously created AnalysisContexts.
|
||||
void clear();
|
||||
};
|
||||
|
||||
class LocationContext : public llvm::FoldingSetNode {
|
||||
|
@ -155,12 +158,17 @@ class LocationContextManager {
|
|||
llvm::FoldingSet<LocationContext> Contexts;
|
||||
|
||||
public:
|
||||
~LocationContextManager();
|
||||
|
||||
StackFrameContext *getStackFrame(AnalysisContext *ctx,
|
||||
const LocationContext *parent,
|
||||
const Stmt *s);
|
||||
|
||||
ScopeContext *getScope(AnalysisContext *ctx, const LocationContext *parent,
|
||||
const Stmt *s);
|
||||
|
||||
/// Discard all previously created LocationContext objects.
|
||||
void clear();
|
||||
};
|
||||
|
||||
} // end clang namespace
|
||||
|
|
|
@ -65,6 +65,11 @@ public:
|
|||
AScope(ScopeDecl), DisplayedFunction(!displayProgress),
|
||||
VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
|
||||
EagerlyAssume(eager), TrimGraph(trim) {}
|
||||
|
||||
void ClearContexts() {
|
||||
LocCtxMgr.clear();
|
||||
AnaCtxMgr.clear();
|
||||
}
|
||||
|
||||
StoreManagerCreator getStoreManagerCreator() {
|
||||
return CreateStoreMgr;
|
||||
|
|
|
@ -33,6 +33,12 @@ AnalysisContextManager::~AnalysisContextManager() {
|
|||
delete I->second;
|
||||
}
|
||||
|
||||
void AnalysisContextManager::clear() {
|
||||
for (ContextMap::iterator I = Contexts.begin(), E = Contexts.end(); I!=E; ++I)
|
||||
delete I->second;
|
||||
Contexts.clear();
|
||||
}
|
||||
|
||||
Stmt *AnalysisContext::getBody() {
|
||||
if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
|
||||
return FD->getBody();
|
||||
|
@ -103,6 +109,21 @@ void ScopeContext::Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx,
|
|||
ID.AddPointer(s);
|
||||
}
|
||||
|
||||
LocationContextManager::~LocationContextManager() {
|
||||
clear();
|
||||
}
|
||||
|
||||
void LocationContextManager::clear() {
|
||||
for (llvm::FoldingSet<LocationContext>::iterator I = Contexts.begin(),
|
||||
E = Contexts.end(); I != E; ) {
|
||||
LocationContext *LC = &*I;
|
||||
++I;
|
||||
delete LC;
|
||||
}
|
||||
|
||||
Contexts.clear();
|
||||
}
|
||||
|
||||
StackFrameContext*
|
||||
LocationContextManager::getStackFrame(AnalysisContext *ctx,
|
||||
const LocationContext *parent,
|
||||
|
|
|
@ -273,6 +273,9 @@ void AnalysisConsumer::HandleCode(Decl *D, Stmt* Body, Actions& actions) {
|
|||
!Ctx->getSourceManager().isFromMainFile(D->getLocation()))
|
||||
return;
|
||||
|
||||
// Clear the AnalysisManager of old AnalysisContexts.
|
||||
Mgr->ClearContexts();
|
||||
|
||||
// Dispatch on the actions.
|
||||
for (Actions::iterator I = actions.begin(), E = actions.end(); I != E; ++I)
|
||||
(*I)(*Mgr, D);
|
||||
|
|
Loading…
Reference in New Issue