[cfe-commits] r65425 - /cfe/trunk/lib/Analysis/CFRefCount.cpp
Ted Kremenek
kremenek at apple.com
Tue Feb 24 18:54:57 PST 2009
Author: kremenek
Date: Tue Feb 24 20:54:57 2009
New Revision: 65425
URL: http://llvm.org/viewvc/llvm-project?rev=65425&view=rev
Log:
retain/release checker: Implement basic tracking of autorelease stack. Next thing is to wire up pools with their contents.
Modified:
cfe/trunk/lib/Analysis/CFRefCount.cpp
Modified: cfe/trunk/lib/Analysis/CFRefCount.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFRefCount.cpp?rev=65425&r1=65424&r2=65425&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CFRefCount.cpp (original)
+++ cfe/trunk/lib/Analysis/CFRefCount.cpp Tue Feb 24 20:54:57 2009
@@ -646,6 +646,13 @@
ObjCMethodSummaries[S] = Summ;
}
+ void addInstMethSummary(const char* Cls, const char* nullaryName,
+ RetainSummary *Summ) {
+ IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
+ Selector S = GetNullarySelector(nullaryName, Ctx);
+ ObjCMethodSummaries[ObjCSummaryKey(ClsII, S)] = Summ;
+ }
+
void addInstMethSummary(const char* Cls, RetainSummary* Summ, va_list argp) {
IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
@@ -1134,10 +1141,9 @@
addNSObjectMethSummary(GetNullarySelector("autorelease", Ctx), Summ);
// Specially handle NSAutoreleasePool.
- addInstMethSummary("NSAutoreleasePool",
+ addInstMethSummary("NSAutoreleasePool", "init",
getPersistentSummary(RetEffect::MakeReceiverAlias(),
- NewAutoreleasePool),
- "init", NULL);
+ NewAutoreleasePool));
// For NSWindow, allocated objects are (initially) self-owned.
// FIXME: For now we opt for false negatives with NSWindow, as these objects
@@ -1369,10 +1375,10 @@
static int AutoRBIndex = 0;
namespace { class VISIBILITY_HIDDEN AutoreleasePoolContents {}; }
-namespace { class VISIBILITY_HIDDEN AutoreleaseBindings {}; }
+namespace { class VISIBILITY_HIDDEN AutoreleaseStack {}; }
namespace clang {
-template<> struct GRStateTrait<AutoreleaseBindings>
+template<> struct GRStateTrait<AutoreleaseStack>
: public GRStatePartialTrait<ARStack> {
static inline void* GDMIndex() { return &AutoRBIndex; }
};
@@ -1522,6 +1528,17 @@
(*I).second.print(Out);
Out << nl;
}
+
+ // Print the autorelease stack.
+ ARStack stack = state->get<AutoreleaseStack>();
+ if (!stack.isEmpty()) {
+ Out << sep << nl << "AR pool stack:";
+
+ for (ARStack::iterator I=stack.begin(), E=stack.end(); I!=E; ++I)
+ Out << ' ' << (*I);
+
+ Out << nl;
+ }
}
static inline ArgEffect GetArgE(RetainSummary* Summ, unsigned idx) {
@@ -2067,7 +2084,10 @@
}
// Fall-through.
- case NewAutoreleasePool: // FIXME: Implement pushing the pool to the stack.
+ case NewAutoreleasePool:
+ assert(!isGCEnabled());
+ return state.add<AutoreleaseStack>(sym);
+
case DoNothingByRef:
case DoNothing:
if (!isGCEnabled() && V.getKind() == RefVal::Released) {
More information about the cfe-commits
mailing list