retain/release checker: Implement basic tracking of autorelease stack. Next thing is to wire up pools with their contents.
llvm-svn: 65425
This commit is contained in:
parent
47bd78ef73
commit
dce7846c24
|
|
@ -646,6 +646,13 @@ private:
|
||||||
ObjCMethodSummaries[S] = Summ;
|
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) {
|
void addInstMethSummary(const char* Cls, RetainSummary* Summ, va_list argp) {
|
||||||
|
|
||||||
IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
|
IdentifierInfo* ClsII = &Ctx.Idents.get(Cls);
|
||||||
|
|
@ -1134,10 +1141,9 @@ void RetainSummaryManager::InitializeMethodSummaries() {
|
||||||
addNSObjectMethSummary(GetNullarySelector("autorelease", Ctx), Summ);
|
addNSObjectMethSummary(GetNullarySelector("autorelease", Ctx), Summ);
|
||||||
|
|
||||||
// Specially handle NSAutoreleasePool.
|
// Specially handle NSAutoreleasePool.
|
||||||
addInstMethSummary("NSAutoreleasePool",
|
addInstMethSummary("NSAutoreleasePool", "init",
|
||||||
getPersistentSummary(RetEffect::MakeReceiverAlias(),
|
getPersistentSummary(RetEffect::MakeReceiverAlias(),
|
||||||
NewAutoreleasePool),
|
NewAutoreleasePool));
|
||||||
"init", NULL);
|
|
||||||
|
|
||||||
// For NSWindow, allocated objects are (initially) self-owned.
|
// For NSWindow, allocated objects are (initially) self-owned.
|
||||||
// FIXME: For now we opt for false negatives with NSWindow, as these objects
|
// FIXME: For now we opt for false negatives with NSWindow, as these objects
|
||||||
|
|
@ -1369,10 +1375,10 @@ static int AutoRCIndex = 0;
|
||||||
static int AutoRBIndex = 0;
|
static int AutoRBIndex = 0;
|
||||||
|
|
||||||
namespace { class VISIBILITY_HIDDEN AutoreleasePoolContents {}; }
|
namespace { class VISIBILITY_HIDDEN AutoreleasePoolContents {}; }
|
||||||
namespace { class VISIBILITY_HIDDEN AutoreleaseBindings {}; }
|
namespace { class VISIBILITY_HIDDEN AutoreleaseStack {}; }
|
||||||
|
|
||||||
namespace clang {
|
namespace clang {
|
||||||
template<> struct GRStateTrait<AutoreleaseBindings>
|
template<> struct GRStateTrait<AutoreleaseStack>
|
||||||
: public GRStatePartialTrait<ARStack> {
|
: public GRStatePartialTrait<ARStack> {
|
||||||
static inline void* GDMIndex() { return &AutoRBIndex; }
|
static inline void* GDMIndex() { return &AutoRBIndex; }
|
||||||
};
|
};
|
||||||
|
|
@ -1522,6 +1528,17 @@ void CFRefCount::BindingsPrinter::Print(std::ostream& Out, const GRState* state,
|
||||||
(*I).second.print(Out);
|
(*I).second.print(Out);
|
||||||
Out << nl;
|
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) {
|
static inline ArgEffect GetArgE(RetainSummary* Summ, unsigned idx) {
|
||||||
|
|
@ -2067,7 +2084,10 @@ GRStateRef CFRefCount::Update(GRStateRef state, SymbolRef sym,
|
||||||
}
|
}
|
||||||
// Fall-through.
|
// Fall-through.
|
||||||
|
|
||||||
case NewAutoreleasePool: // FIXME: Implement pushing the pool to the stack.
|
case NewAutoreleasePool:
|
||||||
|
assert(!isGCEnabled());
|
||||||
|
return state.add<AutoreleaseStack>(sym);
|
||||||
|
|
||||||
case DoNothingByRef:
|
case DoNothingByRef:
|
||||||
case DoNothing:
|
case DoNothing:
|
||||||
if (!isGCEnabled() && V.getKind() == RefVal::Released) {
|
if (!isGCEnabled() && V.getKind() == RefVal::Released) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue