summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-01-16 18:18:48 +0000
committerTed Kremenek <kremenek@apple.com>2008-01-16 18:18:48 +0000
commit2e12c2e79023e87aa93768e7cc10c6701697d5aa (patch)
tree66582010ef2bf3530b4f4ecfbbbd6b78de0e263a /clang
parentaebbe4700a4d3c3fbb5020e52b7f5dba03700c32 (diff)
downloadbcm5719-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.cpp12
-rw-r--r--clang/Analysis/GREngine.cpp4
-rw-r--r--clang/Driver/ASTConsumers.cpp12
-rw-r--r--clang/Driver/ASTConsumers.h2
-rw-r--r--clang/Driver/clang.cpp8
-rw-r--r--clang/include/clang/Analysis/PathSensitive/ExplodedGraph.h35
-rw-r--r--clang/include/clang/Analysis/PathSensitive/GREngine.h2
-rw-r--r--clang/include/clang/Analysis/PathSensitive/GRWorkList.h2
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;
OpenPOWER on IntegriCloud