diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-01-16 18:18:48 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-01-16 18:18:48 +0000 |
| commit | 2e12c2e79023e87aa93768e7cc10c6701697d5aa (patch) | |
| tree | 66582010ef2bf3530b4f4ecfbbbd6b78de0e263a /clang | |
| parent | aebbe4700a4d3c3fbb5020e52b7f5dba03700c32 (diff) | |
| download | bcm5719-llvm-2e12c2e79023e87aa93768e7cc10c6701697d5aa.tar.gz bcm5719-llvm-2e12c2e79023e87aa93768e7cc10c6701697d5aa.zip | |
Hooked up the GRConstants analysis to the driver.
Fixed some compilation errors with GREngine that showed up during
template instantiation.
llvm-svn: 46074
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/Analysis/GRConstants.cpp | 12 | ||||
| -rw-r--r-- | clang/Analysis/GREngine.cpp | 4 | ||||
| -rw-r--r-- | clang/Driver/ASTConsumers.cpp | 12 | ||||
| -rw-r--r-- | clang/Driver/ASTConsumers.h | 2 | ||||
| -rw-r--r-- | clang/Driver/clang.cpp | 8 | ||||
| -rw-r--r-- | clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h | 35 | ||||
| -rw-r--r-- | clang/include/clang/Analysis/PathSensitive/GREngine.h | 2 | ||||
| -rw-r--r-- | clang/include/clang/Analysis/PathSensitive/GRWorkList.h | 2 |
8 files changed, 46 insertions, 31 deletions
diff --git a/clang/Analysis/GRConstants.cpp b/clang/Analysis/GRConstants.cpp index 9ec06831691..56c45042092 100644 --- a/clang/Analysis/GRConstants.cpp +++ b/clang/Analysis/GRConstants.cpp @@ -288,4 +288,14 @@ void GRConstants::VisitBinAdd(BinaryOperator* B) { void GRConstants::VisitBinSub(BinaryOperator* B) { AddBinding(B, GetBinding(B->getLHS()) - GetBinding(B->getRHS())); } -
\ No newline at end of file + +//===----------------------------------------------------------------------===// +// Driver. +//===----------------------------------------------------------------------===// + +namespace clang { +void RunGRConstants(CFG& cfg) { + GREngine<GRConstants> Engine(cfg); + Engine.ExecuteWorkList(); +} +} diff --git a/clang/Analysis/GREngine.cpp b/clang/Analysis/GREngine.cpp index 92c062092d9..42951fc24fd 100644 --- a/clang/Analysis/GREngine.cpp +++ b/clang/Analysis/GREngine.cpp @@ -44,6 +44,10 @@ public: }; } // end anonymous namespace +// Place the dstor for GRWorkList here because it contains virtual member +// functions, and we the code for the dstor generated in one compilation unit. +GRWorkList::~GRWorkList() {} + GRWorkList* GRWorkList::MakeDFS() { return new DFS(); } /// ExecuteWorkList - Run the worklist algorithm for a maximum number of steps. diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index 1bbdf388c49..5a5a0392234 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -19,6 +19,7 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/CFG.h" #include "clang/Analysis/Analyses/LiveVariables.h" +#include "clang/Analysis/Analyses/GRConstants.h" #include "clang/Analysis/LocalCheckers.h" #include "llvm/Support/Streams.h" #include <fstream> @@ -562,22 +563,21 @@ ASTConsumer *clang::CreateUnitValsChecker(Diagnostic &Diags) { } //===----------------------------------------------------------------------===// -// GRConstProp - Perform intra-procedural, path-sensitive constant propagation. +// GRConstants - Perform intra-procedural, path-sensitive constant propagation. namespace { - class GRConstPropVisitor : public CFGVisitor { + class GRConstantsVisitor : public CFGVisitor { public: virtual void Initialize(ASTContext &Context) {} virtual void VisitCFG(CFG& C) { - // FIXME: Implement. - assert (false && "Not yet implemented."); + RunGRConstants(C); } }; } // end anonymous namespace -ASTConsumer *clang::CreateGRConstProp() { - return new GRConstPropVisitor(); +ASTConsumer *clang::CreateGRConstants() { + return new GRConstantsVisitor(); } //===----------------------------------------------------------------------===// diff --git a/clang/Driver/ASTConsumers.h b/clang/Driver/ASTConsumers.h index 58a20449d76..19c339c589c 100644 --- a/clang/Driver/ASTConsumers.h +++ b/clang/Driver/ASTConsumers.h @@ -39,7 +39,7 @@ ASTConsumer *CreateDeadStoreChecker(Diagnostic &Diags); ASTConsumer *CreateUnitValsChecker(Diagnostic &Diags); -ASTConsumer *CreateGRConstProp(); +ASTConsumer *CreateGRConstants(); ASTConsumer *CreateLLVMEmitter(Diagnostic &Diags, const LangOptions &Features); diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 26cbd4863fb..e73fac92474 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -64,7 +64,7 @@ enum ProgActions { ParseCFGDump, // Parse ASTS. Build CFGs. Print CFGs. ParseCFGView, // Parse ASTS. Build CFGs. View CFGs. AnalysisLiveVariables, // Print results of live-variable analysis. - AnalysisGRConstProp, // Perform graph-reachability constant prop. + AnalysisGRConstants, // Perform graph-reachability constant prop. WarnDeadStores, // Run DeadStores checker on parsed ASTs. WarnDeadStoresCheck, // Check diagnostics for "DeadStores". WarnUninitVals, // Run UnitializedVariables checker. @@ -109,7 +109,7 @@ ProgAction(llvm::cl::desc("Choose output type:"), llvm::cl::ZeroOrMore, "Flag warnings of stores to dead variables."), clEnumValN(WarnUninitVals, "warn-uninit-values", "Flag warnings of uses of unitialized variables."), - clEnumValN(AnalysisGRConstProp, "gr-const-prop", + clEnumValN(AnalysisGRConstants, "gr-const-prop", "Perform path-sensitive constant propagation."), clEnumValN(TestSerialization, "test-pickling", "Run prototype serializtion code."), @@ -947,8 +947,8 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile, case WarnUninitVals: return CreateUnitValsChecker(Diag); - case AnalysisGRConstProp: - return CreateGRConstProp(); + case AnalysisGRConstants: + return CreateGRConstants(); case TestSerialization: return CreateSerializationTest(Diag, FileMgr, LangOpts); diff --git a/clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h b/clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h index 1fd2f408591..01266f3964b 100644 --- a/clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h +++ b/clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h @@ -40,9 +40,17 @@ protected: enum { Size1 = 0x0, SizeOther = 0x1, Infeasible = 0x2, Flags = 0x3 }; uintptr_t P; - unsigned getKind() const { return P & Flags; } - void* getPtr() const { return reinterpret_cast<void*>(P & ~Flags); } - ExplodedNodeImpl* getNode() const; + unsigned getKind() const { + return P & Flags; + } + + void* getPtr() const { + return reinterpret_cast<void*>(P & ~Flags); + } + + ExplodedNodeImpl* getNode() const { + return reinterpret_cast<ExplodedNodeImpl*>(getPtr()); + } public: NodeGroup() : P(0) {} @@ -136,8 +144,8 @@ class ExplodedNode : public ExplodedNodeImpl { public: /// Construct a ExplodedNodeImpl with the given node ID, program edge, /// and state. - explicit ExplodedNode(unsigned ID, const ProgramPoint& loc, StateTy state) - : ExplodedNodeImpl(ID, loc, GRTrait<StateTy>::toPtr(state)) {} + explicit ExplodedNode(const ProgramPoint& loc, StateTy state) + : ExplodedNodeImpl(loc, GRTrait<StateTy>::toPtr(state)) {} /// getState - Returns the state associated with the node. inline StateTy getState() const { @@ -186,13 +194,7 @@ protected: typedef llvm::DenseMap<ProgramPoint,void*> EdgeNodeSetMap; typedef llvm::SmallVector<ExplodedNodeImpl*,2> RootsTy; typedef llvm::SmallVector<ExplodedNodeImpl*,10> EndNodesTy; - - /// NodeCounter - The number of nodes that have been created, although - /// this need not be the current number of nodes in the graph that - /// are reachable from the roots. This counter is used to assign a unique - /// number to each node (which is useful for debugging). - unsigned NodeCounter; - + /// Roots - The roots of the simulation graph. Usually there will be only /// one, but clients are free to establish multiple subgraphs within a single /// SimulGraph. Moreover, these subgraphs can often merge when paths from @@ -232,7 +234,6 @@ public: unsigned num_roots() const { return Roots.size(); } unsigned num_eops() const { return EndNodes.size(); } - unsigned getCounter() const { return NodeCounter; } }; template <typename CHECKER> @@ -248,7 +249,7 @@ protected: protected: virtual ExplodedNodeImpl* getNodeImpl(const ProgramPoint& L, void* State, bool* IsNew) { - return getNode(L,GRTrait<StateTy>::toState(State),IsNew); + return getNode(L, GRTrait<StateTy>::toState(State), IsNew); } public: @@ -275,15 +276,15 @@ public: void* InsertPos = 0; StateTy::Profile(profile, State); - NodeTy* V = VSet.FindNodeOrInsertPos(profile, InsertPos); + NodeTy* V = VSet->FindNodeOrInsertPos(profile, InsertPos); if (!V) { // Allocate a new node. V = (NodeTy*) Allocator.Allocate<NodeTy>(); - new (V) NodeTy(NodeCounter++, L, State); + new (V) NodeTy(L, State); // Insert the node into the node set and return it. - VSet.InsertNode(V, InsertPos); + VSet->InsertNode(V, InsertPos); if (IsNew) *IsNew = true; } diff --git a/clang/include/clang/Analysis/PathSensitive/GREngine.h b/clang/include/clang/Analysis/PathSensitive/GREngine.h index b37e159c1bf..c37cd3965ee 100644 --- a/clang/include/clang/Analysis/PathSensitive/GREngine.h +++ b/clang/include/clang/Analysis/PathSensitive/GREngine.h @@ -173,7 +173,7 @@ protected: virtual void* getInitialState() { - return GRTrait<StateTy>::toPtr(getCheckerState()->getInitialState()); + return GRTrait<StateTy>::toPtr(getCheckerState().getInitialState()); } virtual void* ProcessEOP(CFGBlock* Blk, void* State) { diff --git a/clang/include/clang/Analysis/PathSensitive/GRWorkList.h b/clang/include/clang/Analysis/PathSensitive/GRWorkList.h index 4e3ce5427c5..6f82594f5ad 100644 --- a/clang/include/clang/Analysis/PathSensitive/GRWorkList.h +++ b/clang/include/clang/Analysis/PathSensitive/GRWorkList.h @@ -38,7 +38,7 @@ public: class GRWorkList { public: - virtual ~GRWorkList() = 0; + virtual ~GRWorkList(); virtual bool hasWork() const = 0; virtual void Enqueue(const GRWorkListUnit& U) = 0; |

