[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
Zhongxing Xu
xuzhongxing at gmail.com
Mon Jul 19 06:18:12 PDT 2010
Fixed. Thanks!
On Mon, Jul 19, 2010 at 3:31 PM, Daniel Dunbar <daniel at zuster.org> wrote:
> 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