diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-12-24 03:34:38 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-12-24 03:34:38 +0000 |
commit | 62d399e1880aacd9dc494fce374245b0da915ada (patch) | |
tree | d3da99ba10847b99b889bcc7da412dd2ac2e8db2 /lib/Analysis | |
parent | dd8b44101281c894026c7070da6e826c542ea87b (diff) |
As Ted suggested, record the callsite information with the StackFrameContext.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@92121 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/AnalysisContext.cpp | 16 | ||||
-rw-r--r-- | lib/Analysis/CallInliner.cpp | 22 |
2 files changed, 21 insertions, 17 deletions
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp index 05e5196c5b..97e6d914d4 100644 --- a/lib/Analysis/AnalysisContext.cpp +++ b/lib/Analysis/AnalysisContext.cpp @@ -105,7 +105,7 @@ void LocationContext::ProfileCommon(llvm::FoldingSetNodeID &ID, } 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 @@ LocationContextManager::getLocationContext(AnalysisContext *ctx, 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 * diff --git a/lib/Analysis/CallInliner.cpp b/lib/Analysis/CallInliner.cpp index 618d82354e..d18bbcc017 100644 --- a/lib/Analysis/CallInliner.cpp +++ b/lib/Analysis/CallInliner.cpp @@ -19,11 +19,6 @@ using namespace clang; 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 @@ bool CallInliner::EvalCallExpr(CheckerContext &C, const CallExpr *CE) { 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 @@ bool CallInliner::EvalCallExpr(CheckerContext &C, const CallExpr *CE) { 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 CallInliner::EvalCallExpr(CheckerContext &C, const CallExpr *CE) { 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 @@ bool CallInliner::EvalCallExpr(CheckerContext &C, const CallExpr *CE) { Builder.HasGeneratedNode = true; - // Record the call site position. - CallSitePosition[CE] = std::make_pair(Builder.getBlock(), Builder.getIndex()); return true; } @@ -107,13 +102,12 @@ void CallInliner::EvalEndPath(GREndPathNodeBuilder &B, void *tag, 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; } |