aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorZhongxing Xu <xuzhongxing@gmail.com>2009-12-24 03:34:38 +0000
committerZhongxing Xu <xuzhongxing@gmail.com>2009-12-24 03:34:38 +0000
commit62d399e1880aacd9dc494fce374245b0da915ada (patch)
treed3da99ba10847b99b889bcc7da412dd2ac2e8db2 /lib
parentdd8b44101281c894026c7070da6e826c542ea87b (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')
-rw-r--r--lib/Analysis/AnalysisContext.cpp16
-rw-r--r--lib/Analysis/CallInliner.cpp22
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;
}