[cfe-commits] r92116 - in /cfe/trunk: include/clang/Analysis/PathSensitive/GRCoreEngine.h lib/Analysis/CallInliner.cpp
Ted Kremenek
kremenek at apple.com
Wed Dec 23 18:53:29 PST 2009
Hi Zhongxing,
Alternatively we could store the callsite information in the StackFrameContext. That would obviate the need for a side map, and would make LocationContext's capture the context-sensitivity directly. Keeping that information in the LocationContext is also useful when we start thinking about emitting diagnostics.
Ted
On Dec 23, 2009, at 6:25 PM, Zhongxing Xu wrote:
> Author: zhongxingxu
> Date: Wed Dec 23 20:25:21 2009
> New Revision: 92116
>
> URL: http://llvm.org/viewvc/llvm-project?rev=92116&view=rev
> Log:
> Inter-procedural analysis: now we can return from the callee.
>
> Modified:
> cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
> cfe/trunk/lib/Analysis/CallInliner.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h?rev=92116&r1=92115&r2=92116&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/GRCoreEngine.h Wed Dec 23 20:25:21 2009
> @@ -211,6 +211,8 @@
> /// of this builder.
> CFGBlock* getBlock() const { return &B; }
>
> + unsigned getIndex() const { return Idx; }
> +
> void setAuditor(GRAuditor* A) { Auditor = A; }
>
> const GRState* GetState(ExplodedNode* Pred) const {
> @@ -401,7 +403,7 @@
> };
>
> class GREndPathNodeBuilder {
> - GRCoreEngine& Eng;
> + GRCoreEngine &Eng;
> CFGBlock& B;
> ExplodedNode* Pred;
>
> @@ -414,6 +416,8 @@
>
> ~GREndPathNodeBuilder();
>
> + GRWorkList &getWorkList() { return *Eng.WList; }
> +
> ExplodedNode* getPredecessor() const { return Pred; }
>
> GRBlockCounter getBlockCounter() const {
>
> Modified: cfe/trunk/lib/Analysis/CallInliner.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CallInliner.cpp?rev=92116&r1=92115&r2=92116&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Analysis/CallInliner.cpp (original)
> +++ cfe/trunk/lib/Analysis/CallInliner.cpp Wed Dec 23 20:25:21 2009
> @@ -19,6 +19,11 @@
>
> 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;
> @@ -26,6 +31,7 @@
> }
>
> virtual bool EvalCallExpr(CheckerContext &C, const CallExpr *CE);
> + virtual void EvalEndPath(GREndPathNodeBuilder &B,void *tag,GRExprEngine &Eng);
> };
> }
>
> @@ -77,6 +83,37 @@
>
> Builder.HasGeneratedNode = true;
>
> + // Record the call site position.
> + CallSitePosition[CE] = std::make_pair(Builder.getBlock(), Builder.getIndex());
> return true;
> }
>
> +void CallInliner::EvalEndPath(GREndPathNodeBuilder &B, void *tag,
> + GRExprEngine &Eng) {
> + const GRState *state = B.getState();
> + ExplodedNode *Pred = B.getPredecessor();
> + const StackFrameContext *LocCtx =
> + cast<StackFrameContext>(Pred->getLocationContext());
> +
> + const Stmt *CE = LocCtx->getCallSite();
> +
> + // Check if this is the top level stack frame.
> + if (!LocCtx->getParent())
> + return;
> +
> + PostStmt NodeLoc(CE, LocCtx->getParent());
> +
> + bool isNew;
> + 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.HasGeneratedNode = true;
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list