diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-12-20 06:32:12 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2008-12-20 06:32:12 +0000 |
commit | af7415ffb1b01b91f9abf190f32766514156db5a (patch) | |
tree | c063372b7ad54a40a986ebdb70281b90f6440c6b /clang/lib/Analysis/SVals.cpp | |
parent | ab66b87f7f008e5314003512d6c3f4214b905484 (diff) | |
download | bcm5719-llvm-af7415ffb1b01b91f9abf190f32766514156db5a.tar.gz bcm5719-llvm-af7415ffb1b01b91f9abf190f32766514156db5a.zip |
Lazy bingding for region-store manager.
* Now Bind() methods take and return GRState* because binding could
also alter GDM.
* No variables are initialized except those declared with initial
values.
* failed C test cases are due to bugs in RemoveDeadBindings(),
which removes constraints that is still alive. This will be fixed in later
patch.
* default value of array and struct regions will be implemented in later patch.
llvm-svn: 61274
Diffstat (limited to 'clang/lib/Analysis/SVals.cpp')
-rw-r--r-- | clang/lib/Analysis/SVals.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Analysis/SVals.cpp b/clang/lib/Analysis/SVals.cpp index 3288b74a993..6cc5e914f40 100644 --- a/clang/lib/Analysis/SVals.cpp +++ b/clang/lib/Analysis/SVals.cpp @@ -242,6 +242,11 @@ NonLoc Loc::NE(BasicValueFactory& BasicVals, const Loc& R) const { //===----------------------------------------------------------------------===// // Utility methods for constructing Non-Locs. //===----------------------------------------------------------------------===// + +NonLoc NonLoc::MakeVal(SymbolRef sym) { + return nonloc::SymbolVal(sym); +} + NonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, unsigned X, bool isUnsigned) { return nonloc::ConcreteInt(BasicVals.getValue(X, sizeof(unsigned)*8, @@ -281,6 +286,14 @@ NonLoc NonLoc::MakeCompoundVal(QualType T, llvm::ImmutableList<SVal> Vals, return nonloc::CompoundVal(BasicVals.getCompoundValData(T, Vals)); } +SVal SVal::MakeSymbolValue(SymbolManager& SymMgr, const MemRegion* R, + QualType T) { + if (Loc::IsLocType(T)) + return Loc::MakeVal(SymMgr.getSymbol(R)); + else + return NonLoc::MakeVal(SymMgr.getSymbol(R)); +} + SVal SVal::GetSymbolValue(SymbolManager& SymMgr, VarDecl* D) { QualType T = D->getType(); @@ -320,6 +333,8 @@ Loc Loc::MakeVal(const MemRegion* R) { return loc::MemRegionVal(R); } Loc Loc::MakeVal(AddrLabelExpr* E) { return loc::GotoLabel(E->getLabel()); } +Loc Loc::MakeVal(SymbolRef sym) { return loc::SymbolVal(sym); } + //===----------------------------------------------------------------------===// // Pretty-Printing. //===----------------------------------------------------------------------===// |