[cfe-commits] r108668 - in /cfe/trunk: examples/wpa/clang-wpa.cpp include/clang/Analysis/AnalysisContext.h include/clang/Analysis/ProgramPoint.h include/clang/Checker/PathSensitive/AnalysisManager.h include/clang/Checker/PathSensitive/GRCoreEngin

Daniel Dunbar daniel at zuster.org
Mon Jul 19 00:31:59 PDT 2010


FYI:
--
/Users/ddunbar/llvm/tools/clang/lib/Sema/AnalysisBasedWarnings.cpp:390:25:
warning: initialization of pointer of type 'idx::TranslationUnit const
*' from literal 'false' [-Wbool-conversions]
  AnalysisContext AC(D, false);
                        ^
--

 - Daniel

On Sun, Jul 18, 2010 at 6:31 PM, Zhongxing Xu <xuzhongxing at gmail.com> wrote:
> Author: zhongxingxu
> Date: Sun Jul 18 20:31:21 2010
> New Revision: 108668
>
> URL: http://llvm.org/viewvc/llvm-project?rev=108668&view=rev
> Log:
> Reapply r108617.
>
> Added:
>    cfe/trunk/lib/Checker/AnalysisManager.cpp
> Modified:
>    cfe/trunk/examples/wpa/clang-wpa.cpp
>    cfe/trunk/include/clang/Analysis/AnalysisContext.h
>    cfe/trunk/include/clang/Analysis/ProgramPoint.h
>    cfe/trunk/include/clang/Checker/PathSensitive/AnalysisManager.h
>    cfe/trunk/include/clang/Checker/PathSensitive/GRCoreEngine.h
>    cfe/trunk/lib/Analysis/AnalysisContext.cpp
>    cfe/trunk/lib/Checker/AnalysisConsumer.cpp
>    cfe/trunk/lib/Checker/CMakeLists.txt
>    cfe/trunk/lib/Checker/CallInliner.cpp
>    cfe/trunk/lib/Checker/GRCXXExprEngine.cpp
>    cfe/trunk/lib/Checker/GRCoreEngine.cpp
>    cfe/trunk/lib/Checker/GRExprEngine.cpp
>    cfe/trunk/tools/driver/Makefile
>
> Modified: cfe/trunk/examples/wpa/clang-wpa.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/wpa/clang-wpa.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/examples/wpa/clang-wpa.cpp (original)
> +++ cfe/trunk/examples/wpa/clang-wpa.cpp Sun Jul 18 20:31:21 2010
> @@ -129,7 +129,7 @@
>   AnalysisManager AMgr(TU->getASTContext(), PP.getDiagnostics(),
>                        PP.getLangOptions(), /* PathDiagnostic */ 0,
>                        CreateRegionStoreManager,
> -                       CreateRangeConstraintManager,
> +                       CreateRangeConstraintManager, &Idxer,
>                        /* MaxNodes */ 300000, /* MaxLoop */ 3,
>                        /* VisualizeEG */ false, /* VisualizeEGUbi */ false,
>                        /* PurgeDead */ true, /* EagerlyAssume */ false,
> @@ -139,7 +139,7 @@
>                                          AMgr.getLangOptions());
>   GRExprEngine Eng(AMgr, TF);
>
> -  Eng.ExecuteWorkList(AMgr.getStackFrame(FD), AMgr.getMaxNodes());
> +  Eng.ExecuteWorkList(AMgr.getStackFrame(FD, TU), AMgr.getMaxNodes());
>
>   return 0;
>  }
>
> Modified: cfe/trunk/include/clang/Analysis/AnalysisContext.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/AnalysisContext.h?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/AnalysisContext.h (original)
> +++ cfe/trunk/include/clang/Analysis/AnalysisContext.h Sun Jul 18 20:31:21 2010
> @@ -34,11 +34,16 @@
>  class LocationContextManager;
>  class StackFrameContext;
>
> +namespace idx { class TranslationUnit; }
> +
>  /// AnalysisContext contains the context data for the function or method under
>  /// analysis.
>  class AnalysisContext {
>   const Decl *D;
>
> +  // TranslationUnit is NULL if we don't have multiple translation units.
> +  const idx::TranslationUnit *TU;
> +
>   // AnalysisContext owns the following data.
>   CFG *cfg;
>   bool builtCFG;
> @@ -48,14 +53,18 @@
>   llvm::BumpPtrAllocator A;
>   bool AddEHEdges;
>  public:
> -  AnalysisContext(const Decl *d, bool addehedges = false)
> -    : D(d), cfg(0), builtCFG(false), liveness(0), PM(0),
> +  AnalysisContext(const Decl *d, const idx::TranslationUnit *tu,
> +                  bool addehedges = false)
> +    : D(d), TU(tu), cfg(0), builtCFG(false), liveness(0), PM(0),
>       ReferencedBlockVars(0), AddEHEdges(addehedges) {}
>
>   ~AnalysisContext();
>
>   ASTContext &getASTContext() { return D->getASTContext(); }
> -  const Decl *getDecl() { return D; }
> +  const Decl *getDecl() const { return D; }
> +
> +  const idx::TranslationUnit *getTranslationUnit() const { return TU; }
> +
>   /// getAddEHEdges - Return true iff we are adding exceptional edges from
>   /// callExprs.  If this is false, then try/catch statements and blocks
>   /// reachable from them can appear to be dead in the CFG, analysis passes must
> @@ -82,7 +91,7 @@
>  public:
>   ~AnalysisContextManager();
>
> -  AnalysisContext *getContext(const Decl *D);
> +  AnalysisContext *getContext(const Decl *D,const idx::TranslationUnit *TU = 0);
>
>   // Discard all previously created AnalysisContexts.
>   void clear();
> @@ -109,6 +118,10 @@
>
>   AnalysisContext *getAnalysisContext() const { return Ctx; }
>
> +  const idx::TranslationUnit *getTranslationUnit() const {
> +    return Ctx->getTranslationUnit();
> +  }
> +
>   const LocationContext *getParent() const { return Parent; }
>
>   bool isParentOf(const LocationContext *LC) const;
>
> Modified: cfe/trunk/include/clang/Analysis/ProgramPoint.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/ProgramPoint.h?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/ProgramPoint.h (original)
> +++ cfe/trunk/include/clang/Analysis/ProgramPoint.h Sun Jul 18 20:31:21 2010
> @@ -15,6 +15,7 @@
>  #ifndef LLVM_CLANG_ANALYSIS_PROGRAM_POINT
>  #define LLVM_CLANG_ANALYSIS_PROGRAM_POINT
>
> +#include "clang/Analysis/AnalysisContext.h"
>  #include "clang/Analysis/CFG.h"
>  #include "llvm/System/DataTypes.h"
>  #include "llvm/ADT/DenseMap.h"
> @@ -26,6 +27,7 @@
>  namespace clang {
>
>  class LocationContext;
> +class AnalysisContext;
>  class FunctionDecl;
>
>  class ProgramPoint {
> @@ -313,16 +315,16 @@
>
>  class CallEnter : public StmtPoint {
>  public:
> -  // CallEnter uses the caller's location context.
> -  CallEnter(const Stmt *S, const FunctionDecl *fd, const LocationContext *L)
> -    : StmtPoint(S, fd, CallEnterKind, L, 0) {}
> +  // L is caller's location context. AC is callee's AnalysisContext.
> +  CallEnter(const Stmt *S, const AnalysisContext *AC, const LocationContext *L)
> +    : StmtPoint(S, AC, CallEnterKind, L, 0) {}
>
>   const Stmt *getCallExpr() const {
>     return static_cast<const Stmt *>(getData1());
>   }
>
> -  const FunctionDecl *getCallee() const {
> -    return static_cast<const FunctionDecl *>(getData2());
> +  const AnalysisContext *getCalleeContext() const {
> +    return static_cast<const AnalysisContext *>(getData2());
>   }
>
>   static bool classof(const ProgramPoint *Location) {
>
> Modified: cfe/trunk/include/clang/Checker/PathSensitive/AnalysisManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Checker/PathSensitive/AnalysisManager.h?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Checker/PathSensitive/AnalysisManager.h (original)
> +++ cfe/trunk/include/clang/Checker/PathSensitive/AnalysisManager.h Sun Jul 18 20:31:21 2010
> @@ -21,6 +21,11 @@
>
>  namespace clang {
>
> +namespace idx {
> +  class Indexer;
> +  class TranslationUnit;
> +}
> +
>  class AnalysisManager : public BugReporterData {
>   AnalysisContextManager AnaCtxMgr;
>   LocationContextManager LocCtxMgr;
> @@ -35,6 +40,11 @@
>   StoreManagerCreator CreateStoreMgr;
>   ConstraintManagerCreator CreateConstraintMgr;
>
> +  /// \brief Provide function definitions in other translation units. This is
> +  /// NULL if we don't have multiple translation units. AnalysisManager does
> +  /// not own the Indexer.
> +  idx::Indexer *Idxer;
> +
>   enum AnalysisScope { ScopeTU, ScopeDecl } AScope;
>
>   // The maximum number of exploded nodes the analyzer will generate.
> @@ -62,13 +72,14 @@
>   AnalysisManager(ASTContext &ctx, Diagnostic &diags,
>                   const LangOptions &lang, PathDiagnosticClient *pd,
>                   StoreManagerCreator storemgr,
> -                  ConstraintManagerCreator constraintmgr, unsigned maxnodes,
> -                  unsigned maxloop,
> +                  ConstraintManagerCreator constraintmgr,
> +                  idx::Indexer *idxer,
> +                  unsigned maxnodes, unsigned maxloop,
>                   bool vizdot, bool vizubi, bool purge, bool eager, bool trim,
>                   bool inlinecall)
>
>     : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd),
> -      CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
> +      CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),Idxer(idxer),
>       AScope(ScopeDecl), MaxNodes(maxnodes), MaxLoop(maxloop),
>       VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
>       EagerlyAssume(eager), TrimGraph(trim), InlineCall(inlinecall) {}
> @@ -133,6 +144,10 @@
>
>   bool shouldInlineCall() const { return InlineCall; }
>
> +  bool hasIndexer() const { return Idxer != 0; }
> +
> +  const AnalysisContext *getAnalysisContextInAnotherTU(const Decl *D);
> +
>   CFG *getCFG(Decl const *D) {
>     return AnaCtxMgr.getContext(D)->getCFG();
>   }
> @@ -145,9 +160,21 @@
>     return AnaCtxMgr.getContext(D)->getParentMap();
>   }
>
> +  const AnalysisContext *getAnalysisContext(const Decl *D) {
> +    return AnaCtxMgr.getContext(D);
> +  }
> +
> +  const StackFrameContext *getStackFrame(AnalysisContext *Ctx,
> +                                         LocationContext const *Parent,
> +                                         Stmt const *S, const CFGBlock *Blk,
> +                                         unsigned Idx) {
> +    return LocCtxMgr.getStackFrame(Ctx, Parent, S, Blk, Idx);
> +  }
> +
>   // Get the top level stack frame.
> -  const StackFrameContext *getStackFrame(Decl const *D) {
> -    return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D), 0, 0, 0, 0);
> +  const StackFrameContext *getStackFrame(Decl const *D,
> +                                         const idx::TranslationUnit *TU) {
> +    return LocCtxMgr.getStackFrame(AnaCtxMgr.getContext(D, TU), 0, 0, 0, 0);
>   }
>
>   // Get a stack frame with parent.
>
> Modified: cfe/trunk/include/clang/Checker/PathSensitive/GRCoreEngine.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Checker/PathSensitive/GRCoreEngine.h?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Checker/PathSensitive/GRCoreEngine.h (original)
> +++ cfe/trunk/include/clang/Checker/PathSensitive/GRCoreEngine.h Sun Jul 18 20:31:21 2010
> @@ -442,8 +442,8 @@
>   // The call site.
>   const Stmt *CE;
>
> -  // The definition of callee.
> -  const FunctionDecl *FD;
> +  // The AnalysisContext of the callee.
> +  const AnalysisContext *CalleeCtx;
>
>   // The parent block of the CallExpr.
>   const CFGBlock *Block;
> @@ -453,9 +453,9 @@
>
>  public:
>   GRCallEnterNodeBuilder(GRCoreEngine &eng, const ExplodedNode *pred,
> -                         const Stmt *s, const FunctionDecl *fd,
> +                         const Stmt *s, const AnalysisContext *callee,
>                          const CFGBlock *blk, unsigned idx)
> -    : Eng(eng), Pred(pred), CE(s), FD(fd), Block(blk), Index(idx) {}
> +    : Eng(eng), Pred(pred), CE(s), CalleeCtx(callee), Block(blk), Index(idx) {}
>
>   const GRState *getState() const { return Pred->getState(); }
>
> @@ -465,7 +465,7 @@
>
>   const Stmt *getCallExpr() const { return CE; }
>
> -  const FunctionDecl *getCallee() const { return FD; }
> +  const AnalysisContext *getCalleeContext() const { return CalleeCtx; }
>
>   const CFGBlock *getBlock() const { return Block; }
>
>
> Modified: cfe/trunk/lib/Analysis/AnalysisContext.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/AnalysisContext.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Analysis/AnalysisContext.cpp (original)
> +++ cfe/trunk/lib/Analysis/AnalysisContext.cpp Sun Jul 18 20:31:21 2010
> @@ -83,10 +83,11 @@
>   return liveness;
>  }
>
> -AnalysisContext *AnalysisContextManager::getContext(const Decl *D) {
> +AnalysisContext *AnalysisContextManager::getContext(const Decl *D,
> +                                               const idx::TranslationUnit *TU) {
>   AnalysisContext *&AC = Contexts[D];
>   if (!AC)
> -    AC = new AnalysisContext(D);
> +    AC = new AnalysisContext(D, TU);
>
>   return AC;
>  }
>
> Modified: cfe/trunk/lib/Checker/AnalysisConsumer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/AnalysisConsumer.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Checker/AnalysisConsumer.cpp (original)
> +++ cfe/trunk/lib/Checker/AnalysisConsumer.cpp Sun Jul 18 20:31:21 2010
> @@ -173,6 +173,7 @@
>     Mgr.reset(new AnalysisManager(*Ctx, PP.getDiagnostics(),
>                                   PP.getLangOptions(), PD,
>                                   CreateStoreMgr, CreateConstraintMgr,
> +                                  /* Indexer */ 0,
>                                   Opts.MaxNodes, Opts.MaxLoop,
>                                   Opts.VisualizeEGDot, Opts.VisualizeEGUbi,
>                                   Opts.PurgeDead, Opts.EagerlyAssume,
> @@ -349,7 +350,7 @@
>   }
>
>   // Execute the worklist algorithm.
> -  Eng.ExecuteWorkList(mgr.getStackFrame(D), mgr.getMaxNodes());
> +  Eng.ExecuteWorkList(mgr.getStackFrame(D, 0), mgr.getMaxNodes());
>
>   // Release the auditor (if any) so that it doesn't monitor the graph
>   // created BugReporter.
>
> Added: cfe/trunk/lib/Checker/AnalysisManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/AnalysisManager.cpp?rev=108668&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Checker/AnalysisManager.cpp (added)
> +++ cfe/trunk/lib/Checker/AnalysisManager.cpp Sun Jul 18 20:31:21 2010
> @@ -0,0 +1,31 @@
> +//===-- AnalysisManager.cpp -------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Checker/PathSensitive/AnalysisManager.h"
> +#include "clang/Index/Entity.h"
> +#include "clang/Index/Indexer.h"
> +
> +using namespace clang;
> +
> +const AnalysisContext *
> +AnalysisManager::getAnalysisContextInAnotherTU(const Decl *D) {
> +  idx::Entity Ent = idx::Entity::get(const_cast<Decl *>(D),
> +                                     Idxer->getProgram());
> +  FunctionDecl *FuncDef;
> +  idx::TranslationUnit *TU;
> +  llvm::tie(FuncDef, TU) = Idxer->getDefinitionFor(Ent);
> +
> +  if (FuncDef == 0)
> +    return 0;
> +
> +  // This AnalysisContext wraps function definition in another translation unit.
> +  // But it is still owned by the AnalysisManager associated with the current
> +  // translation unit.
> +  return AnaCtxMgr.getContext(FuncDef, TU);
> +}
>
> Modified: cfe/trunk/lib/Checker/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/CMakeLists.txt?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Checker/CMakeLists.txt (original)
> +++ cfe/trunk/lib/Checker/CMakeLists.txt Sun Jul 18 20:31:21 2010
> @@ -4,6 +4,7 @@
>   AdjustedReturnValueChecker.cpp
>   AggExprVisitor.cpp
>   AnalysisConsumer.cpp
> +  AnalysisManager.cpp
>   ArrayBoundChecker.cpp
>   AttrNonNullChecker.cpp
>   BasicConstraintManager.cpp
> @@ -15,7 +16,6 @@
>   BuiltinFunctionChecker.cpp
>   CFRefCount.cpp
>   CallAndMessageChecker.cpp
> -  CallInliner.cpp
>   CastSizeChecker.cpp
>   CastToStructChecker.cpp
>   CheckDeadStores.cpp
>
> Modified: cfe/trunk/lib/Checker/CallInliner.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/CallInliner.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Checker/CallInliner.cpp (original)
> +++ cfe/trunk/lib/Checker/CallInliner.cpp Sun Jul 18 20:31:21 2010
> @@ -1,54 +0,0 @@
> -//===--- CallInliner.cpp - Transfer function that inlines callee ----------===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -//
> -//  This file implements the callee inlining transfer function.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "clang/Checker/PathSensitive/CheckerVisitor.h"
> -#include "clang/Checker/PathSensitive/GRState.h"
> -#include "clang/Checker/Checkers/LocalCheckers.h"
> -
> -using namespace clang;
> -
> -namespace {
> -class CallInliner : public Checker {
> -public:
> -  static void *getTag() {
> -    static int x;
> -    return &x;
> -  }
> -
> -  virtual bool EvalCallExpr(CheckerContext &C, const CallExpr *CE);
> -};
> -}
> -
> -void clang::RegisterCallInliner(GRExprEngine &Eng) {
> -  Eng.registerCheck(new CallInliner());
> -}
> -
> -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;
> -
> -  if (!FD->hasBody(FD))
> -    return false;
> -
> -  // Now we have the definition of the callee, create a CallEnter node.
> -  CallEnter Loc(CE, FD, C.getPredecessor()->getLocationContext());
> -  C.addTransition(state, Loc);
> -
> -  return true;
> -}
> -
>
> Modified: cfe/trunk/lib/Checker/GRCXXExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/GRCXXExprEngine.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Checker/GRCXXExprEngine.cpp (original)
> +++ cfe/trunk/lib/Checker/GRCXXExprEngine.cpp Sun Jul 18 20:31:21 2010
> @@ -104,7 +104,7 @@
>
>   const CXXThisRegion *ThisR = getCXXThisRegion(E->getConstructor(), SFC);
>
> -  CallEnter Loc(E, CD, Pred->getLocationContext());
> +  CallEnter Loc(E, SFC->getAnalysisContext(), Pred->getLocationContext());
>   for (ExplodedNodeSet::iterator NI = ArgsEvaluated.begin(),
>                                  NE = ArgsEvaluated.end(); NI != NE; ++NI) {
>     const GRState *state = GetState(*NI);
> @@ -157,7 +157,7 @@
>                                                     Builder->getBlock(),
>                                                     Builder->getIndex());
>   const CXXThisRegion *ThisR = getCXXThisRegion(MD, SFC);
> -  CallEnter Loc(MCE, MD, Pred->getLocationContext());
> +  CallEnter Loc(MCE, SFC->getAnalysisContext(), Pred->getLocationContext());
>   for (ExplodedNodeSet::iterator I = AllArgsEvaluated.begin(),
>          E = AllArgsEvaluated.end(); I != E; ++I) {
>     // Set up 'this' region.
>
> Modified: cfe/trunk/lib/Checker/GRCoreEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/GRCoreEngine.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Checker/GRCoreEngine.cpp (original)
> +++ cfe/trunk/lib/Checker/GRCoreEngine.cpp Sun Jul 18 20:31:21 2010
> @@ -227,8 +227,8 @@
>
>  void GRCoreEngine::HandleCallEnter(const CallEnter &L, const CFGBlock *Block,
>                                    unsigned Index, ExplodedNode *Pred) {
> -  GRCallEnterNodeBuilder Builder(*this, Pred, L.getCallExpr(), L.getCallee(),
> -                                 Block, Index);
> +  GRCallEnterNodeBuilder Builder(*this, Pred, L.getCallExpr(),
> +                                 L.getCalleeContext(), Block, Index);
>   ProcessCallEnter(Builder);
>  }
>
> @@ -692,6 +692,12 @@
>
>  void GRCallEnterNodeBuilder::GenerateNode(const GRState *state,
>                                           const LocationContext *LocCtx) {
> +  // Check if the callee is in the same translation unit.
> +  if (CalleeCtx->getTranslationUnit() !=
> +      Pred->getLocationContext()->getTranslationUnit()) {
> +    assert(0 && "to be implemented");
> +  }
> +
>   // Get the callee entry block.
>   const CFGBlock *Entry = &(LocCtx->getCFG()->getEntry());
>   assert(Entry->empty());
>
> Modified: cfe/trunk/lib/Checker/GRExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Checker/GRExprEngine.cpp?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Checker/GRExprEngine.cpp (original)
> +++ cfe/trunk/lib/Checker/GRExprEngine.cpp Sun Jul 18 20:31:21 2010
> @@ -1441,12 +1441,12 @@
>  }
>
>  void GRExprEngine::ProcessCallEnter(GRCallEnterNodeBuilder &B) {
> -  const FunctionDecl *FD = B.getCallee();
> -  const StackFrameContext *LocCtx = AMgr.getStackFrame(FD,
> -                                                       B.getLocationContext(),
> -                                                       B.getCallExpr(),
> -                                                       B.getBlock(),
> -                                                       B.getIndex());
> +  const StackFrameContext *LocCtx
> +    = AMgr.getStackFrame(const_cast<AnalysisContext *>(B.getCalleeContext()),
> +                         B.getLocationContext(),
> +                         B.getCallExpr(),
> +                         B.getBlock(),
> +                         B.getIndex());
>
>   const GRState *state = B.getState();
>   state = getStoreManager().EnterStackFrame(state, LocCtx);
> @@ -1886,16 +1886,29 @@
>   if (!FD)
>     return false;
>
> -  if (!FD->hasBody(FD))
> -    return false;
> +  // Check if the function definition is in the same translation unit.
> +  if (FD->hasBody(FD)) {
> +    // Now we have the definition of the callee, create a CallEnter node.
> +    CallEnter Loc(CE, AMgr.getAnalysisContext(FD), Pred->getLocationContext());
> +
> +    ExplodedNode *N = Builder->generateNode(Loc, state, Pred);
> +    Dst.Add(N);
> +    return true;
> +  }
>
> -  // Now we have the definition of the callee, create a CallEnter node.
> -  CallEnter Loc(CE, FD, Pred->getLocationContext());
> +  // Check if we can find the function definition in other translation units.
> +  if (AMgr.hasIndexer()) {
> +    const AnalysisContext *C = AMgr.getAnalysisContextInAnotherTU(FD);
> +    if (C == 0)
> +      return false;
>
> -  ExplodedNode *N = Builder->generateNode(Loc, state, Pred);
> -  if (N)
> +    CallEnter Loc(CE, C, Pred->getLocationContext());
> +    ExplodedNode *N = Builder->generateNode(Loc, state, Pred);
>     Dst.Add(N);
> -  return true;
> +    return true;
> +  }
> +
> +  return false;
>  }
>
>  void GRExprEngine::VisitCall(CallExpr* CE, ExplodedNode* Pred,
>
> Modified: cfe/trunk/tools/driver/Makefile
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/Makefile?rev=108668&r1=108667&r2=108668&view=diff
> ==============================================================================
> --- cfe/trunk/tools/driver/Makefile (original)
> +++ cfe/trunk/tools/driver/Makefile Sun Jul 18 20:31:21 2010
> @@ -28,8 +28,8 @@
>  LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader bitwriter codegen \
>                    ipo selectiondag
>  USEDLIBS = clangFrontend.a clangDriver.a clangCodeGen.a clangSema.a \
> -           clangChecker.a clangAnalysis.a clangRewrite.a  clangAST.a \
> -           clangParse.a clangLex.a clangBasic.a
> +           clangChecker.a clangAnalysis.a clangIndex.a clangRewrite.a  \
> +          clangAST.a clangParse.a clangLex.a clangBasic.a
>
>  include $(CLANG_LEVEL)/Makefile
>
>
>
> _______________________________________________
> 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