[cfe-commits] r58437 - in /cfe/trunk: include/clang/Analysis/PathSensitive/BasicValueFactory.h include/clang/Analysis/PathSensitive/SVals.h lib/Analysis/BasicValueFactory.cpp lib/Analysis/SVals.cpp
Ted Kremenek
kremenek at apple.com
Thu Oct 30 10:44:46 PDT 2008
Author: kremenek
Date: Thu Oct 30 12:44:46 2008
New Revision: 58437
URL: http://llvm.org/viewvc/llvm-project?rev=58437&view=rev
Log:
CompoundVal now uses an ImmutableList<SVal> to store its set of SVals. This change was motivated by the need to allow state-splitting in GRExprEngine::VisitInitListExpr. As a side-benefit, we no longer need to perform any copies of SVals when creating a CompoundSVal, and the profiling of CompoundSVal is now constant time.
Modified:
cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h
cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
cfe/trunk/lib/Analysis/BasicValueFactory.cpp
cfe/trunk/lib/Analysis/SVals.cpp
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h?rev=58437&r1=58436&r2=58437&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/BasicValueFactory.h Thu Oct 30 12:44:46 2008
@@ -17,33 +17,26 @@
#define LLVM_CLANG_ANALYSIS_BASICVALUEFACTORY_H
#include "clang/Analysis/PathSensitive/SymbolManager.h"
+#include "clang/Analysis/PathSensitive/SVals.h"
#include "clang/AST/ASTContext.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/APSInt.h"
-
-namespace llvm {
- class BumpPtrAllocator;
-}
+#include "llvm/ADT/ImmutableList.h"
namespace clang {
-class SVal;
-
class CompoundValData : public llvm::FoldingSetNode {
QualType T;
- unsigned NumVals;
- SVal* Vals;
+ llvm::ImmutableList<SVal> L;
public:
- CompoundValData(QualType t, const SVal* vals, unsigned n,
- llvm::BumpPtrAllocator& A);
+ CompoundValData(QualType t, llvm::ImmutableList<SVal> l)
+ : T(t), L(l) {}
- static void Profile(llvm::FoldingSetNodeID& ID, QualType T, unsigned N,
- const SVal* Vals);
+ static void Profile(llvm::FoldingSetNodeID& ID, QualType T,
+ llvm::ImmutableList<SVal> L);
- void Profile(llvm::FoldingSetNodeID& ID) {
- Profile(ID, T, NumVals, Vals);
- }
+ void Profile(llvm::FoldingSetNodeID& ID) { Profile(ID, T, L); }
};
class BasicValueFactory {
@@ -62,11 +55,13 @@
void* PersistentSVals;
void* PersistentSValPairs;
- llvm::FoldingSet<CompoundValData> CompoundValDataSet;
+ llvm::ImmutableList<SVal>::Factory SValListFactory;
+ llvm::FoldingSet<CompoundValData> CompoundValDataSet;
public:
BasicValueFactory(ASTContext& ctx, llvm::BumpPtrAllocator& Alloc)
- : Ctx(ctx), BPAlloc(Alloc), PersistentSVals(0), PersistentSValPairs(0) {}
+ : Ctx(ctx), BPAlloc(Alloc), PersistentSVals(0), PersistentSValPairs(0),
+ SValListFactory(Alloc) {}
~BasicValueFactory();
@@ -87,8 +82,16 @@
const SymIntConstraint& getConstraint(SymbolID sym, BinaryOperator::Opcode Op,
const llvm::APSInt& V);
- const CompoundValData* getCompoundValData(QualType T, const SVal* Vals,
- unsigned NumVals);
+ const CompoundValData* getCompoundValData(QualType T,
+ llvm::ImmutableList<SVal> Vals);
+
+ llvm::ImmutableList<SVal> getEmptySValList() {
+ return SValListFactory.GetEmptyList();
+ }
+
+ llvm::ImmutableList<SVal> consVals(SVal X, llvm::ImmutableList<SVal> L) {
+ return SValListFactory.Add(X, L);
+ }
const llvm::APSInt* EvaluateAPSInt(BinaryOperator::Opcode Op,
const llvm::APSInt& V1,
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h?rev=58437&r1=58436&r2=58437&view=diff
==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/SVals.h Thu Oct 30 12:44:46 2008
@@ -15,15 +15,18 @@
#ifndef LLVM_CLANG_ANALYSIS_RVALUE_H
#define LLVM_CLANG_ANALYSIS_RVALUE_H
-#include "clang/Analysis/PathSensitive/BasicValueFactory.h"
+#include "clang/Analysis/PathSensitive/SymbolManager.h"
#include "llvm/Support/Casting.h"
+#include "llvm/ADT/ImmutableList.h"
//==------------------------------------------------------------------------==//
// Base SVal types.
//==------------------------------------------------------------------------==//
namespace clang {
-
+
+class CompoundValData;
+class BasicValueFactory;
class MemRegion;
class GRStateManager;
@@ -170,7 +173,7 @@
static NonLoc MakeIntTruthVal(BasicValueFactory& BasicVals, bool b);
- static NonLoc MakeCompoundVal(QualType T, SVal* Vals, unsigned NumSVals,
+ static NonLoc MakeCompoundVal(QualType T, llvm::ImmutableList<SVal> Vals,
BasicValueFactory& BasicVals);
// Implement isa<T> support.
@@ -312,10 +315,7 @@
return V->getSubKind() == LocAsIntegerKind;
}
- static inline LocAsInteger Make(BasicValueFactory& Vals, Loc V,
- unsigned Bits) {
- return LocAsInteger(Vals.getPersistentSValWithData(V, Bits));
- }
+ static LocAsInteger Make(BasicValueFactory& Vals, Loc V, unsigned Bits);
};
class CompoundVal : public NonLoc {
Modified: cfe/trunk/lib/Analysis/BasicValueFactory.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/BasicValueFactory.cpp?rev=58437&r1=58436&r2=58437&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/BasicValueFactory.cpp (original)
+++ cfe/trunk/lib/Analysis/BasicValueFactory.cpp Thu Oct 30 12:44:46 2008
@@ -14,34 +14,18 @@
//===----------------------------------------------------------------------===//
#include "clang/Analysis/PathSensitive/BasicValueFactory.h"
-#include "clang/Analysis/PathSensitive/SVals.h"
using namespace clang;
-CompoundValData::CompoundValData(QualType t, const SVal* vals, unsigned n,
- llvm::BumpPtrAllocator& A)
- : T(t), NumVals(n) {
-
- Vals = (SVal*) A.Allocate<SVal>(n);
-
- new (Vals) SVal[n];
-
- for (unsigned i = 0; i < n; ++i)
- Vals[i] = vals[i];
-}
-
void CompoundValData::Profile(llvm::FoldingSetNodeID& ID, QualType T,
- unsigned N, const SVal* Vals) {
+ llvm::ImmutableList<SVal> L) {
T.Profile(ID);
- ID.AddInteger(N);
- for (unsigned i = 0; i < N; ++i)
- Vals[i].Profile(ID);
+ ID.AddPointer(L.getInternalPointer());
}
typedef std::pair<SVal, uintptr_t> SValData;
typedef std::pair<SVal, SVal> SValPair;
-
namespace llvm {
template<> struct FoldingSetTrait<SValData> {
static inline void Profile(const SValData& X, llvm::FoldingSetNodeID& ID) {
@@ -127,17 +111,18 @@
}
const CompoundValData*
-BasicValueFactory::getCompoundValData(QualType T, const SVal* Vals,
- unsigned NumVals) {
+BasicValueFactory::getCompoundValData(QualType T,
+ llvm::ImmutableList<SVal> Vals) {
+
llvm::FoldingSetNodeID ID;
- CompoundValData::Profile(ID, T, NumVals, Vals);
+ CompoundValData::Profile(ID, T, Vals);
void* InsertPos;
CompoundValData* D = CompoundValDataSet.FindNodeOrInsertPos(ID, InsertPos);
if (!D) {
D = (CompoundValData*) BPAlloc.Allocate<CompoundValData>();
- new (D) CompoundValData(T, Vals, NumVals, BPAlloc);
+ new (D) CompoundValData(T, Vals);
CompoundValDataSet.InsertNode(D, InsertPos);
}
Modified: cfe/trunk/lib/Analysis/SVals.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/SVals.cpp?rev=58437&r1=58436&r2=58437&view=diff
==============================================================================
--- cfe/trunk/lib/Analysis/SVals.cpp (original)
+++ cfe/trunk/lib/Analysis/SVals.cpp Thu Oct 30 12:44:46 2008
@@ -245,9 +245,9 @@
return nonloc::ConcreteInt(BasicVals.getTruthValue(b));
}
-NonLoc NonLoc::MakeCompoundVal(QualType T, SVal* Vals, unsigned NumSVals,
+NonLoc NonLoc::MakeCompoundVal(QualType T, llvm::ImmutableList<SVal> Vals,
BasicValueFactory& BasicVals) {
- return nonloc::CompoundVal(BasicVals.getCompoundValData(T, Vals, NumSVals));
+ return nonloc::CompoundVal(BasicVals.getCompoundValData(T, Vals));
}
SVal SVal::GetSymbolValue(SymbolManager& SymMgr, VarDecl* D) {
@@ -260,6 +260,11 @@
return nonloc::SymbolVal(SymMgr.getSymbol(D));
}
+nonloc::LocAsInteger nonloc::LocAsInteger::Make(BasicValueFactory& Vals, Loc V,
+ unsigned Bits) {
+ return LocAsInteger(Vals.getPersistentSValWithData(V, Bits));
+}
+
//===----------------------------------------------------------------------===//
// Utility methods for constructing Locs.
//===----------------------------------------------------------------------===//
@@ -353,7 +358,7 @@
Out << " [as " << C.getNumBits() << " bit integer]";
break;
}
-
+
default:
assert (false && "Pretty-printed not implemented for this NonLoc.");
break;
More information about the cfe-commits
mailing list