SVals.cpp revision 9012bff2ce5afc85936315662d675f2bcede1ca2
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
159e24049bef26b6289cce9ac9b483c5cbb096e3aeTed Kremenek#include "clang/Analysis/PathSensitive/GRState.h"
16c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar#include "clang/Basic/IdentifierTable.h"
17d70d0b05e5143be9e952eceb5aad7914b2ecab97Ted Kremenek#include "llvm/Support/Streams.h"
18a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
19a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing namespace clang;
20a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::dyn_cast;
21a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::cast;
22a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenekusing llvm::APSInt;
23a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
24a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
2590e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek// Symbol Iteration.
2690e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek//===----------------------------------------------------------------------===//
2790e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek
281c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal::symbol_iterator SVal::symbol_begin() const {
29718c4f7b3ff713c3ebee46553d687bde63e5666fTed Kremenek
30718c4f7b3ff713c3ebee46553d687bde63e5666fTed Kremenek  // FIXME: This is a rat's nest.  Cleanup.
31718c4f7b3ff713c3ebee46553d687bde63e5666fTed Kremenek
321c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  if (isa<loc::SymbolVal>(this))
33aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    return (symbol_iterator) (&Data);
341c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  else if (isa<nonloc::SymbolVal>(this))
35aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    return (symbol_iterator) (&Data);
361c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  else if (isa<nonloc::SymIntConstraintVal>(this)) {
37aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    const SymIntConstraint& C =
381c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      cast<nonloc::SymIntConstraintVal>(this)->getConstraint();
39aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
40aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    return (symbol_iterator) &C.getSymbol();
4190e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek  }
421c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  else if (isa<nonloc::LocAsInteger>(this)) {
431c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    const nonloc::LocAsInteger& V = cast<nonloc::LocAsInteger>(*this);
441c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return V.getPersistentLoc().symbol_begin();
450fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek  }
46d9bc33efa195114d6f2a365c26e5b8dba4e1cc38Ted Kremenek
47d9bc33efa195114d6f2a365c26e5b8dba4e1cc38Ted Kremenek  // FIXME: We need to iterate over the symbols of regions.
48d9bc33efa195114d6f2a365c26e5b8dba4e1cc38Ted Kremenek
4990e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek  return NULL;
5090e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek}
51a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
521c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal::symbol_iterator SVal::symbol_end() const {
5390e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek  symbol_iterator X = symbol_begin();
5490e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek  return X ? X+1 : NULL;
5590e1481ef15ec75e3503e0c6e5effad5bd639f01Ted Kremenek}
56cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
57cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
5840fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek// Useful predicates.
5940fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===//
6040fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek
611c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xubool SVal::isZeroConstant() const {
621c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  if (isa<loc::ConcreteInt>(*this))
631c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return cast<loc::ConcreteInt>(*this).getValue() == 0;
641c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  else if (isa<nonloc::ConcreteInt>(*this))
651c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return cast<nonloc::ConcreteInt>(*this).getValue() == 0;
6640fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek  else
6740fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek    return false;
6840fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek}
6940fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek
7040fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek
7140fc5c7e235965af368a34cdbb6d32827cd1e1d8Ted Kremenek//===----------------------------------------------------------------------===//
721c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Non-Locs.
73cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
74cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
751c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal nonloc::ConcreteInt::EvalBinOp(BasicValueFactory& BasicVals,
7675b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek                                     BinaryOperator::Opcode Op,
771c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                                     const nonloc::ConcreteInt& R) const {
78aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
7975b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek  const llvm::APSInt* X =
8075b0a1ce3e98904c6ac6c5634633b3580f5b4c7eTed Kremenek    BasicVals.EvaluateAPSInt(Op, getValue(), R.getValue());
818cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek
828cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  if (X)
831c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return nonloc::ConcreteInt(*X);
848cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  else
858cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek    return UndefinedVal();
86cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek}
87cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
88cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek  // Bitwise-Complement.
89cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
901c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt
911c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt::EvalComplement(BasicValueFactory& BasicVals) const {
92240f1f00dda1d481276ea872fe8f8851581a7e6bTed Kremenek  return BasicVals.getValue(~getValue());
93cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek}
94cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
95cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek  // Unary Minus.
96a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek
971c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt
981c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xunonloc::ConcreteInt::EvalMinus(BasicValueFactory& BasicVals, UnaryOperator* U) const {
99cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek  assert (U->getType() == U->getSubExpr()->getType());
100cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek  assert (U->getType()->isIntegerType());
101240f1f00dda1d481276ea872fe8f8851581a7e6bTed Kremenek  return BasicVals.getValue(-getValue());
102c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek}
103c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek
104cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
1051c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Transfer function dispatch for Locs.
106cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek//===----------------------------------------------------------------------===//
107c5d3b4ca4707b1fe69629bfefd73087dc4893dd8Ted Kremenek
1081c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal
1091c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuloc::ConcreteInt::EvalBinOp(BasicValueFactory& BasicVals, BinaryOperator::Opcode Op,
1101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                             const loc::ConcreteInt& R) const {
111cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
112cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek  assert (Op == BinaryOperator::Add || Op == BinaryOperator::Sub ||
113cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek          (Op >= BinaryOperator::LT && Op <= BinaryOperator::NE));
114cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
115240f1f00dda1d481276ea872fe8f8851581a7e6bTed Kremenek  const llvm::APSInt* X = BasicVals.EvaluateAPSInt(Op, getValue(), R.getValue());
1168cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek
1178cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  if (X)
1181c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return loc::ConcreteInt(*X);
1198cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek  else
1208cc13ea74fea1c04042a2f4087665bc5182e8408Ted Kremenek    return UndefinedVal();
121a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
122a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
1231c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc Loc::EQ(BasicValueFactory& BasicVals, const Loc& R) const {
124aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
125a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  switch (getSubKind()) {
126a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek    default:
1271c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      assert(false && "EQ not implemented for this Loc.");
128aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek      break;
129cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
1301c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::ConcreteIntKind:
1311c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      if (isa<loc::ConcreteInt>(R)) {
1321c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        bool b = cast<loc::ConcreteInt>(this)->getValue() ==
1331c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                 cast<loc::ConcreteInt>(R).getValue();
134cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
1351c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        return NonLoc::MakeIntTruthVal(BasicVals, b);
1360806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
1371c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      else if (isa<loc::SymbolVal>(R)) {
138cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
1390806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek        const SymIntConstraint& C =
1401c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          BasicVals.getConstraint(cast<loc::SymbolVal>(R).getSymbol(),
141aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek                               BinaryOperator::EQ,
1421c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                               cast<loc::ConcreteInt>(this)->getValue());
1430806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1441c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        return nonloc::SymIntConstraintVal(C);
1450806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
1460806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1470806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      break;
1480806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1491c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      case loc::SymbolValKind: {
1501c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        if (isa<loc::ConcreteInt>(R)) {
151cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
152cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek          const SymIntConstraint& C =
1531c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu            BasicVals.getConstraint(cast<loc::SymbolVal>(this)->getSymbol(),
154aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek                                 BinaryOperator::EQ,
1551c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                                 cast<loc::ConcreteInt>(R).getValue());
156cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
1571c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          return nonloc::SymIntConstraintVal(C);
158cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek        }
159cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
1601c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        assert (!isa<loc::SymbolVal>(R) && "FIXME: Implement unification.");
1610806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
162cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek        break;
1630806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
164a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
1651c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      case loc::MemRegionKind:
1661c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      if (isa<loc::MemRegionVal>(R)) {
1671c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        bool b = cast<loc::MemRegionVal>(*this) == cast<loc::MemRegionVal>(R);
1681c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        return NonLoc::MakeIntTruthVal(BasicVals, b);
1690806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
1700806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1710806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      break;
172a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  }
1730806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1741c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return NonLoc::MakeIntTruthVal(BasicVals, false);
175a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
176a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
1771c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc Loc::NE(BasicValueFactory& BasicVals, const Loc& R) const {
178a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  switch (getSubKind()) {
179a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek    default:
1801c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      assert(false && "NE not implemented for this Loc.");
181aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek      break;
182a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
1831c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::ConcreteIntKind:
1841c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      if (isa<loc::ConcreteInt>(R)) {
1851c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        bool b = cast<loc::ConcreteInt>(this)->getValue() !=
1861c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                 cast<loc::ConcreteInt>(R).getValue();
1870806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1881c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        return NonLoc::MakeIntTruthVal(BasicVals, b);
1890806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
1901c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      else if (isa<loc::SymbolVal>(R)) {
1910806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1920806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek        const SymIntConstraint& C =
1931c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        BasicVals.getConstraint(cast<loc::SymbolVal>(R).getSymbol(),
1940806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek                             BinaryOperator::NE,
1951c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                             cast<loc::ConcreteInt>(this)->getValue());
1960806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
1971c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        return nonloc::SymIntConstraintVal(C);
1980806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
199a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek
2000806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      break;
201a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek
2021c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      case loc::SymbolValKind: {
2031c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        if (isa<loc::ConcreteInt>(R)) {
2040806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
2050806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek          const SymIntConstraint& C =
2061c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          BasicVals.getConstraint(cast<loc::SymbolVal>(this)->getSymbol(),
2070806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek                               BinaryOperator::NE,
2081c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu                               cast<loc::ConcreteInt>(R).getValue());
2090806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
2101c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          return nonloc::SymIntConstraintVal(C);
2110806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek        }
2120806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
2131c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        assert (!isa<loc::SymbolVal>(R) && "FIXME: Implement sym !=.");
2140806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
2150806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek        break;
2160806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      }
2170806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
2181c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      case loc::MemRegionKind:
2191c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        if (isa<loc::MemRegionVal>(R)) {
2201c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          bool b = cast<loc::MemRegionVal>(*this)==cast<loc::MemRegionVal>(R);
2211c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          return NonLoc::MakeIntTruthVal(BasicVals, b);
222aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek        }
2230806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
224aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek        break;
225a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  }
2260806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
2271c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return NonLoc::MakeIntTruthVal(BasicVals, true);
228a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
229a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
230a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
2311c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Utility methods for constructing Non-Locs.
232a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
233a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2341c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, uint64_t X, QualType T) {
2351c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return nonloc::ConcreteInt(BasicVals.getValue(X, T));
236a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
237a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2381c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc NonLoc::MakeVal(BasicValueFactory& BasicVals, IntegerLiteral* I) {
239aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
2401c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return nonloc::ConcreteInt(BasicVals.getValue(APSInt(I->getValue(),
241aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek                              I->getType()->isUnsignedIntegerType())));
242a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
243a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2441c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuNonLoc NonLoc::MakeIntTruthVal(BasicValueFactory& BasicVals, bool b) {
2451c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return nonloc::ConcreteInt(BasicVals.getTruthValue(b));
246cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek}
247cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
2481c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuSVal SVal::GetSymbolValue(SymbolManager& SymMgr, VarDecl* D) {
249aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
250a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  QualType T = D->getType();
251a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2521c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  if (Loc::IsLocType(T))
2531c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    return loc::SymbolVal(SymMgr.getSymbol(D));
254c1ff3cd5fe4436bb14309fdc5ee7e1c2b702b7c3Ted Kremenek
2551c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return nonloc::SymbolVal(SymMgr.getSymbol(D));
256a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
257a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2582a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek//===----------------------------------------------------------------------===//
2591c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu// Utility methods for constructing Locs.
2602a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek//===----------------------------------------------------------------------===//
2612a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek
2621c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuLoc Loc::MakeVal(AddrLabelExpr* E) { return loc::GotoLabel(E->getLabel()); }
263cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
2641c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing XuLoc Loc::MakeVal(StringLiteral* S) {
2651c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu  return loc::StringLiteralVal(S);
266a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek}
267a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek
268a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
269a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek// Pretty-Printing.
270a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek//===----------------------------------------------------------------------===//
271a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2721c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid SVal::printStdErr() const { print(*llvm::cerr.stream()); }
273aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
2741c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid SVal::print(std::ostream& Out) const {
2752a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek
276a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  switch (getBaseKind()) {
277aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
27853c641a735da0c3fe077aab63a6fef16c8798937Ted Kremenek    case UnknownKind:
279aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek      Out << "Invalid"; break;
280a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2811c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case NonLocKind:
2821c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      cast<NonLoc>(this)->print(Out); break;
283a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2841c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case LocKind:
2851c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      cast<Loc>(this)->print(Out); break;
286a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2874a4e524afef40d6f3ddb25d0e407c814e4ca56a8Ted Kremenek    case UndefinedKind:
2884a4e524afef40d6f3ddb25d0e407c814e4ca56a8Ted Kremenek      Out << "Undefined"; break;
289a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
290a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek    default:
2911c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      assert (false && "Invalid SVal.");
292a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  }
293a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
294a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
2950806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenekstatic void printOpcode(std::ostream& Out, BinaryOperator::Opcode Op) {
296aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
297aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek  switch (Op) {
298aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Mul: Out << '*'  ; break;
299aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Div: Out << '/'  ; break;
300aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Rem: Out << '%'  ; break;
301aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Add: Out << '+'  ; break;
302aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Sub: Out << '-'  ; break;
30350d0ac299c641bee9024f3fbae2ea0640898a040Ted Kremenek    case BinaryOperator::Shl: Out << "<<" ; break;
30450d0ac299c641bee9024f3fbae2ea0640898a040Ted Kremenek    case BinaryOperator::Shr: Out << ">>" ; break;
305aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::LT:  Out << "<"  ; break;
306aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::GT:  Out << '>'  ; break;
307aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::LE:  Out << "<=" ; break;
308aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::GE:  Out << ">=" ; break;
309aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::EQ:  Out << "==" ; break;
310aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::NE:  Out << "!=" ; break;
311aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::And: Out << '&'  ; break;
312aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Xor: Out << '^'  ; break;
313aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek    case BinaryOperator::Or:  Out << '|'  ; break;
314aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
3150806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek    default: assert(false && "Not yet implemented.");
3160806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek  }
3170806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek}
3180806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
3191c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid NonLoc::print(std::ostream& Out) const {
320aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
321a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  switch (getSubKind()) {
322aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
3231c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case nonloc::ConcreteIntKind:
3241c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      Out << cast<nonloc::ConcreteInt>(this)->getValue().getZExtValue();
325cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
3261c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      if (cast<nonloc::ConcreteInt>(this)->getValue().isUnsigned())
327cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek        Out << 'U';
328cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
329a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek      break;
330a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
3311c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case nonloc::SymbolValKind:
3321c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      Out << '$' << cast<nonloc::SymbolVal>(this)->getSymbol();
333a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek      break;
3340806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
3351c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case nonloc::SymIntConstraintValKind: {
3361c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      const nonloc::SymIntConstraintVal& C =
3371c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu        *cast<nonloc::SymIntConstraintVal>(this);
3380806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek
3390806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      Out << '$' << C.getConstraint().getSymbol() << ' ';
3400806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      printOpcode(Out, C.getConstraint().getOpcode());
341405674c26c52b05df0d833fae6bae818cd52bc32Chris Lattner      Out << ' ' << C.getConstraint().getInt().getZExtValue();
342cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
343cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek      if (C.getConstraint().getInt().isUnsigned())
344cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek        Out << 'U';
345cf78b6a771bb4537d5ee8fa44e718e842c2f70c7Ted Kremenek
3460806acf6a197ac7bd5c87649c0429e64e5d0db06Ted Kremenek      break;
3470fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek    }
3480fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek
3491c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case nonloc::LocAsIntegerKind: {
3501c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      const nonloc::LocAsInteger& C = *cast<nonloc::LocAsInteger>(this);
3511c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      C.getLoc().print(Out);
3520fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek      Out << " [as " << C.getNumBits() << " bit integer]";
3530fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek      break;
3540fe33bc94a822e315585e5cde1964d3c3b9052f9Ted Kremenek    }
355a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
356a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek    default:
3571c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      assert (false && "Pretty-printed not implemented for this NonLoc.");
358a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek      break;
359a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  }
360a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
361a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
3621c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xuvoid Loc::print(std::ostream& Out) const {
363aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
364a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek  switch (getSubKind()) {
365aa1c4e5a6b87b62d991c55a0d4522bcd778068d7Ted Kremenek
3661c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::ConcreteIntKind:
3671c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      Out << cast<loc::ConcreteInt>(this)->getValue().getZExtValue()
3681c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          << " (Loc)";
369a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek      break;
370a6e4d21dc4fe87fe1b0bcd9c3c3ec43b391aa44bTed Kremenek
3711c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::SymbolValKind:
3721c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      Out << '$' << cast<loc::SymbolVal>(this)->getSymbol();
373a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek      break;
3742a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek
3751c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::GotoLabelKind:
3762a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek      Out << "&&"
3771c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          << cast<loc::GotoLabel>(this)->getLabel()->getID()->getName();
3782a502578a785d5e7ed9e08e2895dbdcfa5333c11Ted Kremenek      break;
37908b66255e2605adfa8777dbff293db1c69bc1092Ted Kremenek
3801c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::MemRegionKind:
3811c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      Out << '&' << cast<loc::MemRegionVal>(this)->getRegion()->getString();
382de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek      break;
383de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek
3841c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::FuncValKind:
385de43424560f1a744de6214dab6bbee28ad8437f5Ted Kremenek      Out << "function "
3861c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          << cast<loc::FuncVal>(this)->getDecl()->getIdentifier()->getName();
387a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek      break;
388a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek
3891c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu    case loc::StringLiteralValKind:
390a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek      Out << "literal \""
3911c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu          << cast<loc::StringLiteralVal>(this)->getLiteral()->getStrData()
392a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek          << "\"";
393a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek      break;
394a548846b471f7ca05ec6038c7d9d3b4d0de777ccTed Kremenek
395a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek    default:
3961c96b24285d05c0eac455ae96d7c9ff43d42bc96Zhongxing Xu      assert (false && "Pretty-printing not implemented for this Loc.");
397a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek      break;
398a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek  }
399a90ccfe03ce62f4c33cbb96982947cf474b4fae4Ted Kremenek}
4009012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4019012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu//===----------------------------------------------------------------------===//
4029012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu// Pretty-Printing with llvm::raw_ostream.
4039012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu//===----------------------------------------------------------------------===//
4049012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4059012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xuvoid SVal::print(llvm::raw_ostream& Out) const {
4069012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4079012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  switch (getBaseKind()) {
4089012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4099012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case UnknownKind:
4109012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << "Invalid"; break;
4119012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4129012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case NonLocKind:
4139012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      cast<NonLoc>(this)->print(Out); break;
4149012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4159012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case LocKind:
4169012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      cast<Loc>(this)->print(Out); break;
4179012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4189012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case UndefinedKind:
4199012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << "Undefined"; break;
4209012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4219012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    default:
4229012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      assert (false && "Invalid SVal.");
4239012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
4249012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
4259012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4269012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xustatic void printOpcode(llvm::raw_ostream& Out, BinaryOperator::Opcode Op) {
4279012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4289012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  switch (Op) {
4299012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Mul: Out << '*'  ; break;
4309012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Div: Out << '/'  ; break;
4319012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Rem: Out << '%'  ; break;
4329012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Add: Out << '+'  ; break;
4339012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Sub: Out << '-'  ; break;
4349012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Shl: Out << "<<" ; break;
4359012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Shr: Out << ">>" ; break;
4369012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::LT:  Out << "<"  ; break;
4379012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::GT:  Out << '>'  ; break;
4389012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::LE:  Out << "<=" ; break;
4399012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::GE:  Out << ">=" ; break;
4409012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::EQ:  Out << "==" ; break;
4419012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::NE:  Out << "!=" ; break;
4429012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::And: Out << '&'  ; break;
4439012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Xor: Out << '^'  ; break;
4449012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case BinaryOperator::Or:  Out << '|'  ; break;
4459012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4469012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    default: assert(false && "Not yet implemented.");
4479012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
4489012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
4499012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4509012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xuvoid NonLoc::print(llvm::raw_ostream& Out) const {
4519012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4529012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  switch (getSubKind()) {
4539012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4549012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case nonloc::ConcreteIntKind:
4559012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << cast<nonloc::ConcreteInt>(this)->getValue().getZExtValue();
4569012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4579012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      if (cast<nonloc::ConcreteInt>(this)->getValue().isUnsigned())
4589012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu        Out << 'U';
4599012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4609012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
4619012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4629012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case nonloc::SymbolValKind:
4639012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << '$' << cast<nonloc::SymbolVal>(this)->getSymbol();
4649012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
4659012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4669012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case nonloc::SymIntConstraintValKind: {
4679012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      const nonloc::SymIntConstraintVal& C =
4689012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu        *cast<nonloc::SymIntConstraintVal>(this);
4699012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4709012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << '$' << C.getConstraint().getSymbol() << ' ';
4719012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      printOpcode(Out, C.getConstraint().getOpcode());
4729012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << ' ' << C.getConstraint().getInt().getZExtValue();
4739012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4749012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      if (C.getConstraint().getInt().isUnsigned())
4759012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu        Out << 'U';
4769012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4779012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
4789012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    }
4799012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4809012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case nonloc::LocAsIntegerKind: {
4819012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      const nonloc::LocAsInteger& C = *cast<nonloc::LocAsInteger>(this);
4829012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      C.getLoc().print(Out);
4839012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << " [as " << C.getNumBits() << " bit integer]";
4849012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
4859012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    }
4869012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4879012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    default:
4889012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      assert (false && "Pretty-printed not implemented for this NonLoc.");
4899012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
4909012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
4919012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
4929012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4939012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xuvoid Loc::print(llvm::raw_ostream& Out) const {
4949012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4959012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  switch (getSubKind()) {
4969012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
4979012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::ConcreteIntKind:
4989012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << cast<loc::ConcreteInt>(this)->getValue().getZExtValue()
4999012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu          << " (Loc)";
5009012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5019012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
5029012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::SymbolValKind:
5039012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << '$' << cast<loc::SymbolVal>(this)->getSymbol();
5049012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5059012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
5069012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::GotoLabelKind:
5079012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << "&&"
5089012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu          << cast<loc::GotoLabel>(this)->getLabel()->getID()->getName();
5099012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5109012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
5119012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::MemRegionKind:
5129012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << '&' << cast<loc::MemRegionVal>(this)->getRegion()->getString();
5139012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5149012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
5159012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::FuncValKind:
5169012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << "function "
5179012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu          << cast<loc::FuncVal>(this)->getDecl()->getIdentifier()->getName();
5189012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5199012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
5209012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    case loc::StringLiteralValKind:
5219012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      Out << "literal \""
5229012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu          << cast<loc::StringLiteralVal>(this)->getLiteral()->getStrData()
5239012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu          << "\"";
5249012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5259012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu
5269012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu    default:
5279012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      assert (false && "Pretty-printing not implemented for this Loc.");
5289012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu      break;
5299012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu  }
5309012bff2ce5afc85936315662d675f2bcede1ca2Zhongxing Xu}
531