]> granicus.if.org Git - clang/commitdiff
Added code to generate initial set of summaries for instance methods.
authorTed Kremenek <kremenek@apple.com>
Tue, 6 May 2008 00:30:21 +0000 (00:30 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 6 May 2008 00:30:21 +0000 (00:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50689 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/CFRefCount.cpp

index aa1d122c132b88f48e242da9a47b686360c47f14..b06579703f022586eab59daa5d537b86dcaed8c8 100644 (file)
@@ -38,6 +38,11 @@ static inline Selector GetNullarySelector(const char* name, ASTContext& Ctx) {
   return Ctx.Selectors.getSelector(0, &II);
 }
 
+static inline Selector GetUnarySelector(const char* name, ASTContext& Ctx) {
+  IdentifierInfo* II = &Ctx.Idents.get(name);
+  return Ctx.Selectors.getSelector(1, &II);
+}
+
 //===----------------------------------------------------------------------===//
 // Symbolic Evaluation of Reference Counting Logic
 //===----------------------------------------------------------------------===//
@@ -161,7 +166,7 @@ class RetainSummaryManager {
           FuncSummariesTy;
   
   typedef llvm::DenseMap<Selector, RetainSummary*>
-          ObjCMethodSummariesTy;
+          ObjCMethSummariesTy;
     
   //==-----------------------------------------------------------------==//
   //  Data.
@@ -179,12 +184,12 @@ class RetainSummaryManager {
   // FuncSummaries - A map from FunctionDecls to summaries.
   FuncSummariesTy FuncSummaries; 
   
-  // ObjCInstanceMethodSummaries - A map from selectors (for instance methods)
+  // ObjCInstMethSummaries - A map from selectors (for instance methods)
   //  to summaries.
-  ObjCMethodSummariesTy ObjCInstanceMethodSummaries;
+  ObjCMethSummariesTy ObjCInstMethSummaries;
 
-  // ObjCMethodSummaries - A map from selectors to summaries.
-  ObjCMethodSummariesTy ObjCMethodSummaries;
+  // ObjCMethSummaries - A map from selectors to summaries.
+  ObjCMethSummariesTy ObjCMethSummaries;
 
   // ArgEffectsSet - A FoldingSet of uniqued ArgEffects.
   ArgEffectsSetTy ArgEffectsSet;
@@ -214,16 +219,25 @@ class RetainSummaryManager {
   RetainSummary* getCFSummaryGetRule(FunctionDecl* FD);  
   
   RetainSummary* getPersistentSummary(ArgEffects* AE, RetEffect RE);
+
+  RetainSummary* getPersistentSummary(RetEffect RE) {
+    return getPersistentSummary(getArgEffects(), RE);
+  }
   
   RetainSummary* getInstanceMethodSummary(Selector S);
   
   RetainSummary* getMethodSummary(Selector S);    
   RetainSummary* getInitMethodSummary(Selector S);
 
+  void InitializeInstanceSummaries();
+    
 public:
   
   RetainSummaryManager(ASTContext& ctx, bool gcenabled)
-   : Ctx(ctx), GCEnabled(gcenabled) {}
+   : Ctx(ctx), GCEnabled(gcenabled) {
+    
+     InitializeInstanceSummaries();
+   }
   
   ~RetainSummaryManager();
   
@@ -393,19 +407,19 @@ RetainSummaryManager::getUnarySummary(FunctionDecl* FD, UnaryFuncKind func) {
   switch (func) {
     case cfretain: {
       ScratchArgs.push_back(std::make_pair(0, IncRef));
-      return getPersistentSummary(getArgEffects(), RetEffect::MakeAlias(0));
+      return getPersistentSummary(RetEffect::MakeAlias(0));
     }
       
     case cfrelease: {
       ScratchArgs.push_back(std::make_pair(0, DecRef));
-      return getPersistentSummary(getArgEffects(), RetEffect::MakeNoRet());
+      return getPersistentSummary(RetEffect::MakeNoRet());
     }
       
     case cfmakecollectable: {
       if (GCEnabled)
         ScratchArgs.push_back(std::make_pair(0, DecRef));
       
-      return getPersistentSummary(getArgEffects(), RetEffect::MakeAlias(0));    
+      return getPersistentSummary(RetEffect::MakeAlias(0));    
     }
       
     default:
@@ -449,7 +463,7 @@ RetainSummary* RetainSummaryManager::getCFSummaryCreateRule(FunctionDecl* FD) {
   //  just handle the default case.
 
   assert (ScratchArgs.empty());
-  return getPersistentSummary(getArgEffects(), RetEffect::MakeOwned());
+  return getPersistentSummary(RetEffect::MakeOwned());
 }
 
 RetainSummary* RetainSummaryManager::getCFSummaryGetRule(FunctionDecl* FD) {
@@ -474,7 +488,7 @@ RetainSummary* RetainSummaryManager::getCFSummaryGetRule(FunctionDecl* FD) {
   //  just handle the default case.
   
   assert (ScratchArgs.empty());  
-  return getPersistentSummary(getArgEffects(), RetEffect::MakeNotOwned());
+  return getPersistentSummary(RetEffect::MakeNotOwned());
 }
 
 //===----------------------------------------------------------------------===//
@@ -485,18 +499,18 @@ RetainSummary* RetainSummaryManager::getInitMethodSummary(Selector S) {
   assert(ScratchArgs.empty());
     
   RetainSummary* Summ =
-    getPersistentSummary(getArgEffects(), RetEffect::MakeReceiverAlias());
+    getPersistentSummary(RetEffect::MakeReceiverAlias());
   
-  ObjCMethodSummaries[S] = Summ;
+  ObjCMethSummaries[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);
+  ObjCMethSummariesTy::iterator I = ObjCMethSummaries.find(S);
   
-  if (I != ObjCMethodSummaries.end())
+  if (I != ObjCMethSummaries.end())
     return I->second;
 
   // "initXXX": pass-through for receiver.
@@ -509,12 +523,36 @@ RetainSummary* RetainSummaryManager::getMethodSummary(Selector S) {
   return 0;
 }
 
+void RetainSummaryManager::InitializeInstanceSummaries() {
+  
+  assert (ScratchArgs.empty());
+  
+  RetEffect E = isGCEnabled() ? RetEffect::MakeNoRet() : RetEffect::MakeOwned();  
+  RetainSummary* Summ = getPersistentSummary(E);
+  
+  // Create the "alloc" selector.
+  ObjCInstMethSummaries[ GetNullarySelector("alloc", Ctx) ] = Summ;
+  
+  // Create the "new" selector.
+  ObjCInstMethSummaries[ GetNullarySelector("new", Ctx) ] = Summ;
+  
+  // Create the "allocWithZone:" selector.
+  ObjCInstMethSummaries[ GetUnarySelector("allocWithZone", Ctx) ] = Summ;
+  
+  // Create the "copyWithZone:" selector.
+  ObjCInstMethSummaries[ GetUnarySelector("copyWithZone", Ctx) ] = Summ;
+    
+  // Create the "mutableCopyWithZone:" selector.
+  ObjCInstMethSummaries[ GetUnarySelector("mutableCopyWithZone", Ctx) ] = Summ;
+}
+
+
 RetainSummary* RetainSummaryManager::getInstanceMethodSummary(Selector S) {
     
   // Look up a summary in our cache of Selectors -> Summaries.
-  ObjCMethodSummariesTy::iterator I = ObjCInstanceMethodSummaries.find(S);
+  ObjCMethSummariesTy::iterator I = ObjCInstMethSummaries.find(S);
   
-  if (I != ObjCInstanceMethodSummaries.end())
+  if (I != ObjCInstMethSummaries.end())
     return I->second;
     
   return 0;