[cfe-commits] r92121 - in /cfe/trunk: include/clang/Analysis/PathSensitive/AnalysisContext.h include/clang/Analysis/PathSensitive/AnalysisManager.h lib/Analysis/AnalysisContext.cpp lib/Analysis/CallInliner.cpp
Zhongxing Xu
xuzhongxing at gmail.com
Wed Dec 23 19:34:39 PST 2009
Author: zhongxingxu
Date: Wed Dec 23 21:34:38 2009
New Revision: 92121
URL: http://llvm.org/viewvc/llvm-project?rev=92121&view=rev
Log:
As Ted suggested, record the callsite information with the StackFrameContext.
Modified:
cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisContext.h
cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h
cfe/trunk/lib/Analysis/AnalysisContext.cpp
cfe/trunk/lib/Analysis/CallInliner.cpp
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisContext.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisContext.h?rev=92121&r1=92120&r2=92121&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisContext.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisContext.h Wed Dec 23 21:34:38 2009
@@ -27,6 +27,7 @@
class Decl;
class Stmt;
class CFG;
+class CFGBlock;
class LiveVariables;
class ParentMap;
class ImplicitParamDecl;
@@ -136,23 +137,38 @@
};
class StackFrameContext : public LocationContext {
+ // The callsite where this stack frame is established.
const Stmt *CallSite;
+ // The parent block of the callsite.
+ const CFGBlock *Block;
+
+ // The index of the callsite in the CFGBlock.
+ unsigned Index;
+
friend class LocationContextManager;
StackFrameContext(AnalysisContext *ctx, const LocationContext *parent,
- const Stmt *s)
- : LocationContext(StackFrame, ctx, parent), CallSite(s) {}
+ const Stmt *s, const CFGBlock *blk, unsigned idx)
+ : LocationContext(StackFrame, ctx, parent), CallSite(s), Block(blk),
+ Index(idx) {}
public:
~StackFrameContext() {}
const Stmt *getCallSite() const { return CallSite; }
+ const CFGBlock *getCallSiteBlock() const { return Block; }
+
+ unsigned getIndex() const { return Index; }
+
void Profile(llvm::FoldingSetNodeID &ID);
static void Profile(llvm::FoldingSetNodeID &ID, AnalysisContext *ctx,
- const LocationContext *parent, const Stmt *s) {
+ const LocationContext *parent, const Stmt *s,
+ const CFGBlock *blk, unsigned idx) {
ProfileCommon(ID, StackFrame, ctx, parent, s);
+ ID.AddPointer(blk);
+ ID.AddInteger(idx);
}
static bool classof(const LocationContext* Ctx) {
@@ -230,7 +246,8 @@
const StackFrameContext *getStackFrame(AnalysisContext *ctx,
const LocationContext *parent,
- const Stmt *s);
+ const Stmt *s, const CFGBlock *blk,
+ unsigned idx);
const ScopeContext *getScope(AnalysisContext *ctx,
const LocationContext *parent,
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h?rev=92121&r1=92120&r2=92121&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/AnalysisManager.h Wed Dec 23 21:34:38 2009
@@ -132,14 +132,15 @@
// Get the top level stack frame.
const StackFrameContext *getStackFrame(Decl const *D) {
- return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), 0, 0);
+ return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), 0, 0, 0, 0);
}
// Get a stack frame with parent.
StackFrameContext const *getStackFrame(Decl const *D,
LocationContext const *Parent,
- Stmt const *S) {
- return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), Parent, S);
+ Stmt const *S, const CFGBlock *Blk,
+ unsigned Idx) {
+ return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), Parent, S, Blk,Idx);
}
};
Modified: cfe/trunk/lib/Analysis/AnalysisContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/AnalysisContext.cpp?rev=92121&r1=92120&r2=92121&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/AnalysisContext.cpp (original)
+++ cfe/trunk/lib/Analysis/AnalysisContext.cpp Wed Dec 23 21:34:38 2009
@@ -105,7 +105,7 @@
}
void StackFrameContext::Profile(llvm::FoldingSetNodeID &ID) {
- Profile(ID, getAnalysisContext(), getParent(), CallSite);
+ Profile(ID, getAnalysisContext(), getParent(), CallSite, Block, Index);
}
void ScopeContext::Profile(llvm::FoldingSetNodeID &ID) {
@@ -145,8 +145,18 @@
const StackFrameContext*
LocationContextManager::getStackFrame(AnalysisContext *ctx,
const LocationContext *parent,
- const Stmt *s) {
- return getLocationContext<StackFrameContext, Stmt>(ctx, parent, s);
+ const Stmt *s, const CFGBlock *blk,
+ unsigned idx) {
+ llvm::FoldingSetNodeID ID;
+ StackFrameContext::Profile(ID, ctx, parent, s, blk, idx);
+ void *InsertPos;
+ StackFrameContext *L =
+ cast_or_null<StackFrameContext>(Contexts.FindNodeOrInsertPos(ID, InsertPos));
+ if (!L) {
+ L = new StackFrameContext(ctx, parent, s, blk, idx);
+ Contexts.InsertNode(L, InsertPos);
+ }
+ return L;
}
const ScopeContext *
Modified: cfe/trunk/lib/Analysis/CallInliner.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CallInliner.cpp?rev=92121&r1=92120&r2=92121&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/CallInliner.cpp (original)
+++ cfe/trunk/lib/Analysis/CallInliner.cpp Wed Dec 23 21:34:38 2009
@@ -19,11 +19,6 @@
namespace {
class CallInliner : public Checker {
-
- /// CallSitePosition - Map the call site to its CFG block and stmt index. This
- /// is used when exiting from a callee.
- llvm::DenseMap<const Stmt *, std::pair<CFGBlock*,unsigned> > CallSitePosition;
-
public:
static void *getTag() {
static int x;
@@ -43,7 +38,7 @@
const GRState *state = C.getState();
const Expr *Callee = CE->getCallee();
SVal L = state->getSVal(Callee);
-
+
const FunctionDecl *FD = L.getAsFunctionDecl();
if (!FD)
return false;
@@ -51,9 +46,11 @@
if (!FD->isThisDeclarationADefinition())
return false;
+ GRStmtNodeBuilder &Builder = C.getNodeBuilder();
// Make a new LocationContext.
const StackFrameContext *LocCtx = C.getAnalysisManager().getStackFrame(FD,
- C.getPredecessor()->getLocationContext(), CE);
+ C.getPredecessor()->getLocationContext(), CE,
+ Builder.getBlock(), Builder.getIndex());
CFGBlock const *Entry = &(LocCtx->getCFG()->getEntry());
@@ -72,7 +69,7 @@
bool isNew;
GRExprEngine &Eng = C.getEngine();
ExplodedNode *Pred = C.getPredecessor();
- GRStmtNodeBuilder &Builder = C.getNodeBuilder();
+
ExplodedNode *SuccN = Eng.getGraph().getNode(Loc, state, &isNew);
SuccN->addPredecessor(Pred, Eng.getGraph());
@@ -83,8 +80,6 @@
Builder.HasGeneratedNode = true;
- // Record the call site position.
- CallSitePosition[CE] = std::make_pair(Builder.getBlock(), Builder.getIndex());
return true;
}
@@ -107,13 +102,12 @@
ExplodedNode *Succ = Eng.getGraph().getNode(NodeLoc, state, &isNew);
Succ->addPredecessor(Pred, Eng.getGraph());
- assert(CallSitePosition.find(CE) != CallSitePosition.end());
-
// When creating the new work list unit, increment the statement index to
// point to the statement after the CallExpr.
if (isNew)
- B.getWorkList().Enqueue(Succ, *CallSitePosition[CE].first,
- CallSitePosition[CE].second + 1);
+ B.getWorkList().Enqueue(Succ,
+ *const_cast<CFGBlock*>(LocCtx->getCallSiteBlock()),
+ LocCtx->getIndex() + 1);
B.HasGeneratedNode = true;
}
More information about the cfe-commits
mailing list