1a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//= RValues.cpp - Abstract RValues for Path-Sens. Value Tracking -*- C++ -*-==//
2a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//
3a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//                     The LLVM Compiler Infrastructure
4a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//
5a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// This file is distributed under the University of Illinois Open Source
6a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// License. See LICENSE.TXT for details.
7a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//
8a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
9a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//
101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu//  This file defines SVal, Loc, and NonLoc, classes that represent
11a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//  abstract r-values for use with path-sensitive value tracking.
12a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//
13a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
14a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
1518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
1614429b918bd2f4cb52abc75546a7fe37142054caArgyrios Kyrtzidis#include "clang/AST/ExprObjC.h"
17c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/Basic/IdentifierTable.h"
18a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "llvm/Support/raw_ostream.h"
19a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing namespace clang;
209ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento;
21a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::APSInt;
22a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
23a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
24e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek// Symbol iteration within an SVal.
2590e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek//===----------------------------------------------------------------------===//
2690e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek
27a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
28e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek//===----------------------------------------------------------------------===//
29e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek// Utility methods.
30e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek//===----------------------------------------------------------------------===//
31cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
32264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xubool SVal::hasConjuredSymbol() const {
33dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<nonloc::SymbolVal> SV = getAs<nonloc::SymbolVal>()) {
34264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu    SymbolRef sym = SV->getSymbol();
35264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu    if (isa<SymbolConjured>(sym))
36264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu      return true;
37264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu  }
38264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu
39dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<loc::MemRegionVal> RV = getAs<loc::MemRegionVal>()) {
40264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu    const MemRegion *R = RV->getRegion();
41264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu    if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(R)) {
42264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu      SymbolRef sym = SR->getSymbol();
43264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu      if (isa<SymbolConjured>(sym))
44264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu        return true;
45264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu    }
46264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu  }
47264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu
48264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu  return false;
49264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu}
50264e93799c891c03d60cf0b09a032b0a9935d3b5Zhongxing Xu
51abd46e13cfd48f2c9bf26d9759edb4366aaa6d5bTed Kremenekconst FunctionDecl *SVal::getAsFunctionDecl() const {
52dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>()) {
53369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu    const MemRegion* R = X->getRegion();
54eb1c7a04509f5d25c09005a6d46bd8bbb3ca88cbTed Kremenek    if (const FunctionTextRegion *CTR = R->getAs<FunctionTextRegion>())
555fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks      if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(CTR->getDecl()))
565fc1d0c4532c55cc47ba6628f296bf5b86d2eaf0Anna Zaks        return FD;
57369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu  }
58369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu
5957e156a7ed2ce9083f77dde7a4b757ccc9cf8e50Anna Zaks  return 0;
60369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu}
61369f447eded97e6048ced02c0c2be3842f61fc1cZhongxing Xu
62076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// \brief If this SVal is a location (subclasses Loc) and wraps a symbol,
63076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// return that SymbolRef.  Otherwise return 0.
64076add680e281709cf081052be0dcb822dc8f37dAnna Zaks///
65076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// Implicit casts (ex: void* -> char*) can turn Symbolic region into Element
66076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// region. If that is the case, gets the underlining region.
678ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// When IncludeBaseRegions is set to true and the SubRegion is non-symbolic,
688ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// the first symbolic parent region is returned.
698ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna ZaksSymbolRef SVal::getAsLocSymbol(bool IncludeBaseRegions) const {
70076add680e281709cf081052be0dcb822dc8f37dAnna Zaks  // FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
71dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<nonloc::LocAsInteger> X = getAs<nonloc::LocAsInteger>())
7246d1a4f046e5a7d35a7857be271b6701823542faZhongxing Xu    return X->getLoc().getAsLocSymbol();
7346d1a4f046e5a7d35a7857be271b6701823542faZhongxing Xu
74dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>()) {
758ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks    const MemRegion *R = X->getRegion();
768ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks    if (const SymbolicRegion *SymR = IncludeBaseRegions ?
778ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks                                      R->getSymbolicBase() :
788ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks                                      dyn_cast<SymbolicRegion>(R->StripCasts()))
79f7a0cf426eddae76e1a71dd2295631a2cf0560afTed Kremenek      return SymR->getSymbol();
8094c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek  }
8157e156a7ed2ce9083f77dde7a4b757ccc9cf8e50Anna Zaks  return 0;
8294c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek}
8394c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek
84c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu/// Get the symbol in the SVal or its base region.
85c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing XuSymbolRef SVal::getLocSymbolInBase() const {
86dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>();
87c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu
88c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu  if (!X)
89c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu    return 0;
90c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu
91c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu  const MemRegion *R = X->getRegion();
92c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu
93c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu  while (const SubRegion *SR = dyn_cast<SubRegion>(R)) {
94c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu    if (const SymbolicRegion *SymR = dyn_cast<SymbolicRegion>(SR))
95c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu      return SymR->getSymbol();
96c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu    else
97c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu      R = SR->getSuperRegion();
98c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu  }
99c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu
100c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu  return 0;
101c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu}
102c8023788ace75cf0a0417b9b88e643ceebae91e2Zhongxing Xu
103aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks// TODO: The next 3 functions have to be simplified.
104076add680e281709cf081052be0dcb822dc8f37dAnna Zaks
105076add680e281709cf081052be0dcb822dc8f37dAnna Zaks/// \brief If this SVal wraps a symbol return that SymbolRef.
1068ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// Otherwise, return 0.
1078ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks///
1088ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// Casts are ignored during lookup.
1098ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// \param IncludeBaseRegions The boolean that controls whether the search
1108ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks/// should continue to the base regions if the region is not symbolic.
1118ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna ZaksSymbolRef SVal::getAsSymbol(bool IncludeBaseRegion) const {
112076add680e281709cf081052be0dcb822dc8f37dAnna Zaks  // FIXME: should we consider SymbolRef wrapped in CodeTextRegion?
113dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<nonloc::SymbolVal> X = getAs<nonloc::SymbolVal>())
11494c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek    return X->getSymbol();
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1168ef064d53fb33b5a8f8743bcbb0a2fd5c3e97be1Anna Zaks  return getAsLocSymbol(IncludeBaseRegion);
11794c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek}
11894c969804b1f98650316a8f75434b2d24dbe94eaTed Kremenek
119e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek/// getAsSymbolicExpression - If this Sval wraps a symbolic expression then
120e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek///  return that expression.  Otherwise return NULL.
121e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenekconst SymExpr *SVal::getAsSymbolicExpression() const {
122dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<nonloc::SymbolVal> X = getAs<nonloc::SymbolVal>())
1235344baa704f42b22d9df25c24ffbbf6b4716603bAnna Zaks    return X->getSymbol();
1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
125e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek  return getAsSymbol();
126e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek}
127edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu
12864595fad45abbaa75778609196b9223bf6f2ece3Anna Zaksconst SymExpr* SVal::getAsSymExpr() const {
12964595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks  const SymExpr* Sym = getAsSymbol();
13064595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks  if (!Sym)
13164595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks    Sym = getAsSymbolicExpression();
13264595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks  return Sym;
13364595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks}
13464595fad45abbaa75778609196b9223bf6f2ece3Anna Zaks
135edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xuconst MemRegion *SVal::getAsRegion() const {
136dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<loc::MemRegionVal> X = getAs<loc::MemRegionVal>())
137edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu    return X->getRegion();
138edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu
139dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<nonloc::LocAsInteger> X = getAs<nonloc::LocAsInteger>())
140604848a49d2a9c0985225bbe3a39fca223e961bbZhongxing Xu    return X->getLoc().getAsRegion();
141604848a49d2a9c0985225bbe3a39fca223e961bbZhongxing Xu
142edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu  return 0;
143edb883cabf32ef39a3f2ce7a7437894e176a740bZhongxing Xu}
144e0e4ebf6bfca5a71b2344d8a1b748b852509279cTed Kremenek
145b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Roseconst MemRegion *loc::MemRegionVal::stripCasts(bool StripBaseCasts) const {
1460e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek  const MemRegion *R = getRegion();
147b11a3ada9a22e146c6edd33bcc6301e221fedd7aJordan Rose  return R ?  R->StripCasts(StripBaseCasts) : NULL;
1480e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek}
1490e3ec3ff2477e60f0ceda922cc2e3a25a59d81f2Ted Kremenek
150bfcaf8048d1673320de60a22ca9c297d7484b2a8Zhongxing Xuconst void *nonloc::LazyCompoundVal::getStore() const {
151bfcaf8048d1673320de60a22ca9c297d7484b2a8Zhongxing Xu  return static_cast<const LazyCompoundValData*>(Data)->getStore();
152a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek}
153a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek
154978aeac1a90020b2a0ae6c7eb7fe65aa8226f74aJordan Roseconst TypedValueRegion *nonloc::LazyCompoundVal::getRegion() const {
155a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek  return static_cast<const LazyCompoundValData*>(Data)->getRegion();
156a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek}
157a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek
158cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
159a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek// Other Iterators.
160a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek//===----------------------------------------------------------------------===//
161a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek
162a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremeneknonloc::CompoundVal::iterator nonloc::CompoundVal::begin() const {
163a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek  return getValue()->begin();
164a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek}
165a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek
166a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremeneknonloc::CompoundVal::iterator nonloc::CompoundVal::end() const {
167a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek  return getValue()->end();
168a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek}
169a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek
170a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek//===----------------------------------------------------------------------===//
17140fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek// Useful predicates.
17240fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===//
17340fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek
174b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xubool SVal::isConstant() const {
1755251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie  return getAs<nonloc::ConcreteInt>() || getAs<loc::ConcreteInt>();
176b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu}
177b10a7c235f82c6eb074be097c9ae7ee51fccc9c6Zhongxing Xu
178db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Carebool SVal::isConstant(int I) const {
179dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<loc::ConcreteInt> LV = getAs<loc::ConcreteInt>())
1805251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie    return LV->getValue() == I;
181dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie  if (Optional<nonloc::ConcreteInt> NV = getAs<nonloc::ConcreteInt>())
1825251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie    return NV->getValue() == I;
1835251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie  return false;
18440fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek}
18540fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek
186db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Carebool SVal::isZeroConstant() const {
187db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care  return isConstant(0);
188db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care}
189db2fa8a7eb67b1e8f32a590b8e000e1259cff91aTom Care
19040fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek
19140fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===//
1921c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Non-Locs.
193cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
194cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
195c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekSVal nonloc::ConcreteInt::evalBinOp(SValBuilder &svalBuilder,
1966c07bdba93b095b66e2c8c82dd5ed458fa8285eaTed Kremenek                                    BinaryOperator::Opcode Op,
1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    const nonloc::ConcreteInt& R) const {
19875b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek  const llvm::APSInt* X =
199c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    svalBuilder.getBasicValueFactory().evalAPSInt(Op, getValue(), R.getValue());
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2018cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  if (X)
2021c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return nonloc::ConcreteInt(*X);
2038cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  else
2048cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek    return UndefinedVal();
205cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek}
206cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
2071c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt
208c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremeneknonloc::ConcreteInt::evalComplement(SValBuilder &svalBuilder) const {
209c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return svalBuilder.makeIntVal(~getValue());
210cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek}
211cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
212c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremeneknonloc::ConcreteInt
213c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremeneknonloc::ConcreteInt::evalMinus(SValBuilder &svalBuilder) const {
214c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  return svalBuilder.makeIntVal(-getValue());
215c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek}
216c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek
217cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
2181c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Locs.
219cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
220c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek
2219c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed KremenekSVal loc::ConcreteInt::evalBinOp(BasicValueFactory& BasicVals,
222ccaad9dd61b5dcbb489cfd06596ab40cda9a06acTed Kremenek                                 BinaryOperator::Opcode Op,
223ccaad9dd61b5dcbb489cfd06596ab40cda9a06acTed Kremenek                                 const loc::ConcreteInt& R) const {
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225a339cd66be6202c6e86916f52a347d0289bf2eeaJordan Rose  assert(BinaryOperator::isComparisonOp(Op) || Op == BO_Sub);
2261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
227a339cd66be6202c6e86916f52a347d0289bf2eeaJordan Rose  const llvm::APSInt *X = BasicVals.evalAPSInt(Op, getValue(), R.getValue());
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2298cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  if (X)
230a339cd66be6202c6e86916f52a347d0289bf2eeaJordan Rose    return nonloc::ConcreteInt(*X);
2318cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  else
2328cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek    return UndefinedVal();
233a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
234a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
235a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
236a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// Pretty-Printing.
237a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
238a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2396f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenekvoid SVal::dump() const { dumpToStream(llvm::errs()); }
240aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
2419c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid SVal::dumpToStream(raw_ostream &os) const {
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  switch (getBaseKind()) {
2439012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case UnknownKind:
24402282acd7a42d06a3178e3102d34a585bd82dd9fTed Kremenek      os << "Unknown";
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
2469012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case NonLocKind:
2475251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      castAs<NonLoc>().dumpToStream(os);
2481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
2499012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case LocKind:
2505251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      castAs<Loc>().dumpToStream(os);
2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
2529012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case UndefinedKind:
2536f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek      os << "Undefined";
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
2559012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
2569012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
2579012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
2589c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid NonLoc::dumpToStream(raw_ostream &os) const {
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  switch (getSubKind()) {
260601fa4e4e2df34442aea987e9bc6621f350eef2dTed Kremenek    case nonloc::ConcreteIntKind: {
2615251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      const nonloc::ConcreteInt& C = castAs<nonloc::ConcreteInt>();
26235df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek      if (C.getValue().isUnsigned())
26335df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek        os << C.getValue().getZExtValue();
26435df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek      else
26535df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek        os << C.getValue().getSExtValue();
26635df9c70f5dc04a2ed74129bcf31b1938238e4c2Ted Kremenek      os << ' ' << (C.getValue().isUnsigned() ? 'U' : 'S')
267601fa4e4e2df34442aea987e9bc6621f350eef2dTed Kremenek         << C.getValue().getBitWidth() << 'b';
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
269601fa4e4e2df34442aea987e9bc6621f350eef2dTed Kremenek    }
2705344baa704f42b22d9df25c24ffbbf6b4716603bAnna Zaks    case nonloc::SymbolValKind: {
2715251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      os << castAs<nonloc::SymbolVal>().getSymbol();
2729012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
2749012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case nonloc::LocAsIntegerKind: {
2755251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      const nonloc::LocAsInteger& C = castAs<nonloc::LocAsInteger>();
2766f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek      os << C.getLoc() << " [as " << C.getNumBits() << " bit integer]";
2779012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
2789012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    }
279a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek    case nonloc::CompoundValKind: {
2805251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      const nonloc::CompoundVal& C = castAs<nonloc::CompoundVal>();
2817b679528c1e193ff08d496264c6aed051506d9bfTed Kremenek      os << "compoundVal{";
282b8b4161e52bacc6d189146bd632393dc5f060cb0Ted Kremenek      bool first = true;
283b8b4161e52bacc6d189146bd632393dc5f060cb0Ted Kremenek      for (nonloc::CompoundVal::iterator I=C.begin(), E=C.end(); I!=E; ++I) {
2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (first) {
2856f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek          os << ' '; first = false;
2866f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek        }
2876f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek        else
2886f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek          os << ", ";
2896f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek
2906f9b3a4d7143362d3c2ac1f843d76971799f5b97Ted Kremenek        (*I).dumpToStream(os);
291b8b4161e52bacc6d189146bd632393dc5f060cb0Ted Kremenek      }
2927b679528c1e193ff08d496264c6aed051506d9bfTed Kremenek      os << "}";
293a6fac4e446eb30ed270eff9d4084d5db5e657fcfTed Kremenek      break;
294a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    }
295a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek    case nonloc::LazyCompoundValKind: {
2965251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      const nonloc::LazyCompoundVal &C = castAs<nonloc::LazyCompoundVal>();
297cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman      os << "lazyCompoundVal{" << const_cast<void *>(C.getStore())
298cb421fa690da545b58a720abe5f1c49b166dbde7Dan Gohman         << ',' << C.getRegion()
299a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek         << '}';
300a5e81f1240bcc5b9b0721fc6275075ad7cadaf5eTed Kremenek      break;
3011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
3029012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    default:
3039012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      assert (false && "Pretty-printed not implemented for this NonLoc.");
3049012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
3059012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
3069012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
3079012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
3089c378f705405d37f49795d5e915989de774fe11fTed Kremenekvoid Loc::dumpToStream(raw_ostream &os) const {
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  switch (getSubKind()) {
3109012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::ConcreteIntKind:
3115251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      os << castAs<loc::ConcreteInt>().getValue().getZExtValue() << " (Loc)";
3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
3139012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::GotoLabelKind:
3145251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      os << "&&" << castAs<loc::GotoLabel>().getLabel()->getName();
3159012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
3169012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::MemRegionKind:
3175251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie      os << '&' << castAs<loc::MemRegionVal>().getRegion()->getString();
3181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
3199012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    default:
320b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Pretty-printing not implemented for this Loc.");
3219012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
3229012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
323