diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-05-05 23:55:01 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-05-05 23:55:01 +0000 |
commit | 3d1e97227539a4fa973b5668d3702e63fe64c4de (patch) | |
tree | 6fba7fb9a90b38de6715c982aa2e4717dcbf292f /clang/lib/Analysis/CFRefCount.cpp | |
parent | 7db342b0a89080743f6a7bbcc8d302b89911733d (diff) | |
download | bcm5719-llvm-3d1e97227539a4fa973b5668d3702e63fe64c4de.tar.gz bcm5719-llvm-3d1e97227539a4fa973b5668d3702e63fe64c4de.zip |
Add summary generation for "initXXX" methods.
llvm-svn: 50684
Diffstat (limited to 'clang/lib/Analysis/CFRefCount.cpp')
-rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index 83e79637144..aa1d122c132 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -214,7 +214,12 @@ class RetainSummaryManager { RetainSummary* getCFSummaryGetRule(FunctionDecl* FD); RetainSummary* getPersistentSummary(ArgEffects* AE, RetEffect RE); - + + RetainSummary* getInstanceMethodSummary(Selector S); + + RetainSummary* getMethodSummary(Selector S); + RetainSummary* getInitMethodSummary(Selector S); + public: RetainSummaryManager(ASTContext& ctx, bool gcenabled) @@ -239,7 +244,8 @@ RetainSummaryManager::~RetainSummaryManager() { // mitigating the need to do explicit cleanup of the // Argument-Effect summaries. - for (ArgEffectsSetTy::iterator I = ArgEffectsSet.begin(), E = ArgEffectsSet.end(); I!=E; ++I) + for (ArgEffectsSetTy::iterator I = ArgEffectsSet.begin(), + E = ArgEffectsSet.end(); I!=E; ++I) I->getValue().~ArgEffects(); } @@ -302,7 +308,7 @@ RetainSummary* RetainSummaryManager::getPersistentSummary(ArgEffects* AE, //===----------------------------------------------------------------------===// RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD, - ASTContext& Ctx) { + ASTContext& Ctx) { SourceLocation Loc = FD->getLocation(); @@ -330,7 +336,7 @@ RetainSummary* RetainSummaryManager::getSummary(FunctionDecl* FD, } RetainSummary* RetainSummaryManager::getNSSummary(FunctionDecl* FD, - const char* FName) { + const char* FName) { FName += 2; if (strcmp(FName, "MakeCollectable") == 0) @@ -340,7 +346,7 @@ RetainSummary* RetainSummaryManager::getNSSummary(FunctionDecl* FD, } RetainSummary* RetainSummaryManager::getCFSummary(FunctionDecl* FD, - const char* FName) { + const char* FName) { FName += 2; @@ -475,8 +481,44 @@ RetainSummary* RetainSummaryManager::getCFSummaryGetRule(FunctionDecl* FD) { // Summary creation for Selectors. //===----------------------------------------------------------------------===// +RetainSummary* RetainSummaryManager::getInitMethodSummary(Selector S) { + assert(ScratchArgs.empty()); + + RetainSummary* Summ = + getPersistentSummary(getArgEffects(), RetEffect::MakeReceiverAlias()); + + ObjCMethodSummaries[S] = Summ; + return Summ; +} + +RetainSummary* RetainSummaryManager::getMethodSummary(Selector S) { + + // Look up a summary in our cache of Selectors -> Summaries. + ObjCMethodSummariesTy::iterator I = ObjCMethodSummaries.find(S); + + if (I != ObjCMethodSummaries.end()) + return I->second; + // "initXXX": pass-through for receiver. + const char* s = S.getIdentifierInfoForSlot(0)->getName(); + + if (s[0] == 'i' && s[10] == 'n' && s[2] == 'i' && s[3] == 't') + return getInitMethodSummary(S); + + return 0; +} + +RetainSummary* RetainSummaryManager::getInstanceMethodSummary(Selector S) { + + // Look up a summary in our cache of Selectors -> Summaries. + ObjCMethodSummariesTy::iterator I = ObjCInstanceMethodSummaries.find(S); + + if (I != ObjCInstanceMethodSummaries.end()) + return I->second; + + return 0; +} //===----------------------------------------------------------------------===// // Reference-counting logic (typestate + counts). |