1846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek// SValBuilder.h - Construction of SVals from evaluating expressions -*- C++ -*-
2e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
3e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//                     The LLVM Compiler Infrastructure
4e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
5e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// This file is distributed under the University of Illinois Open Source
6e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// License. See LICENSE.TXT for details.
7e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
8e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===//
9e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
10846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek//  This file defines SValBuilder, a class that defines the interface for
11e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//  "symbolical evaluators" which construct an SVal from an expression.
121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//
13e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===//
14e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
155a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#ifndef LLVM_CLANG_GR_SVALBUILDER
165a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis#define LLVM_CLANG_GR_SVALBUILDER
17e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
18478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
19e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#include "clang/AST/Expr.h"
201a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek#include "clang/AST/ExprObjC.h"
219b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/BasicValueFactory.h"
229b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h"
2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
24e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
25e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremeneknamespace clang {
26c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
27c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramerclass CXXBoolLiteralExpr;
28c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
299ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremeneknamespace ento {
305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
31846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenekclass SValBuilder {
3299ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
33e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekprotected:
34c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  ASTContext &Context;
35c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
36c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  /// Manager of APSInt values.
37c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  BasicValueFactory BasicVals;
38c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
39c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  /// Manages the creation of symbols.
40c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  SymbolManager SymMgr;
41c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
42c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  /// Manages the creation of memory regions.
43c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  MemRegionManager MemMgr;
44c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
4518c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  ProgramStateManager &StateMgr;
46c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
47c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  /// The scalar type to use for array indices.
48c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  const QualType ArrayIndexTy;
49c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
50c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  /// The width of the scalar type used for array indices.
51c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  const unsigned ArrayIndexWidth;
5232c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek
53aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks  virtual SVal evalCastFromNonLoc(NonLoc val, QualType castTy) = 0;
54aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks  virtual SVal evalCastFromLoc(Loc val, QualType castTy) = 0;
55aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks
56c50e6df965ff264952d8d5805d151f89c89af302Ted Kremenekpublic:
579f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  // FIXME: Make these protected again once RegionStoreManager correctly
589f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  // handles loads from different bound value types.
59aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks  virtual SVal dispatchCast(SVal val, QualType castTy) = 0;
6032c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek
61e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekpublic:
62c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  SValBuilder(llvm::BumpPtrAllocator &alloc, ASTContext &context,
6318c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek              ProgramStateManager &stateMgr)
64c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    : Context(context), BasicVals(context, alloc),
65c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek      SymMgr(context, BasicVals, alloc),
66c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek      MemMgr(context, alloc),
67c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek      StateMgr(stateMgr),
68c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek      ArrayIndexTy(context.IntTy),
69c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek      ArrayIndexWidth(context.getTypeSize(ArrayIndexTy)) {}
70c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
71846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek  virtual ~SValBuilder() {}
721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
73432a4558b8161c362efc319f8a38e074e74da201Anna Zaks  bool haveSameType(const SymExpr *Sym1, const SymExpr *Sym2) {
74732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek    return haveSameType(Sym1->getType(), Sym2->getType());
75432a4558b8161c362efc319f8a38e074e74da201Anna Zaks  }
76432a4558b8161c362efc319f8a38e074e74da201Anna Zaks
77432a4558b8161c362efc319f8a38e074e74da201Anna Zaks  bool haveSameType(QualType Ty1, QualType Ty2) {
78432a4558b8161c362efc319f8a38e074e74da201Anna Zaks    // FIXME: Remove the second disjunct when we support symbolic
79432a4558b8161c362efc319f8a38e074e74da201Anna Zaks    // truncation/extension.
80432a4558b8161c362efc319f8a38e074e74da201Anna Zaks    return (Context.getCanonicalType(Ty1) == Context.getCanonicalType(Ty2) ||
81a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose            (Ty1->isIntegralOrEnumerationType() &&
82a5796f87229b4aeebca71fa6ee1790ae7a5a0382Jordan Rose             Ty2->isIntegralOrEnumerationType()));
83432a4558b8161c362efc319f8a38e074e74da201Anna Zaks  }
84432a4558b8161c362efc319f8a38e074e74da201Anna Zaks
859f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  SVal evalCast(SVal val, QualType castTy, QualType originalType);
865b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
879c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  virtual SVal evalMinus(NonLoc val) = 0;
881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
899c14953d0c84f7cf5adfb4cd3c0f05a9b1723c1cTed Kremenek  virtual SVal evalComplement(NonLoc val) = 0;
90e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Create a new value which represents a binary expression with two non-
920d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// location operands.
938bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  virtual SVal evalBinOpNN(ProgramStateRef state, BinaryOperator::Opcode op,
94cd8f6ac9b613e1fe962ebf9c87d822ce765275e6Ted Kremenek                           NonLoc lhs, NonLoc rhs, QualType resultTy) = 0;
95e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
960d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// Create a new value which represents a binary expression with two memory
970d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// location operands.
988bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  virtual SVal evalBinOpLL(ProgramStateRef state, BinaryOperator::Opcode op,
99eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose                           Loc lhs, Loc rhs, QualType resultTy) = 0;
100e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
1010d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// Create a new value which represents a binary expression with a memory
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// location and non-location operands. For example, this would be used to
1030d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// evaluate a pointer arithmetic operation.
1048bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  virtual SVal evalBinOpLN(ProgramStateRef state, BinaryOperator::Opcode op,
1051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                           Loc lhs, NonLoc rhs, QualType resultTy) = 0;
10632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
1070d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// Evaluates a given SVal. If the SVal has only one possible (integer) value,
1080d339d06f8721d14befd6311bd306ac485772188Anna Zaks  /// that value is returned. Otherwise, returns NULL.
1098bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  virtual const llvm::APSInt *getKnownValue(ProgramStateRef state, SVal val) = 0;
1105b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
111e2241cbb0455a60ba27d6c4b9d601ffef3ed103fAnna Zaks  /// Constructs a symbolic expression for two non-location values.
112e2241cbb0455a60ba27d6c4b9d601ffef3ed103fAnna Zaks  SVal makeSymExprValNN(ProgramStateRef state, BinaryOperator::Opcode op,
113e2241cbb0455a60ba27d6c4b9d601ffef3ed103fAnna Zaks                      NonLoc lhs, NonLoc rhs, QualType resultTy);
1140d339d06f8721d14befd6311bd306ac485772188Anna Zaks
1158bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  SVal evalBinOp(ProgramStateRef state, BinaryOperator::Opcode op,
1169f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan                 SVal lhs, SVal rhs, QualType type);
1175b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
1188bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek  DefinedOrUnknownSVal evalEQ(ProgramStateRef state, DefinedOrUnknownSVal lhs,
1199f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan                              DefinedOrUnknownSVal rhs);
120c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
121c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  ASTContext &getContext() { return Context; }
122c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  const ASTContext &getContext() const { return Context; }
123c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
12418c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek  ProgramStateManager &getStateManager() { return StateMgr; }
1256bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek
1266bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek  QualType getConditionType() const {
127a4317709127e3b63c44a34f9fa1c3f8abe6a77a3Ted Kremenek    return Context.getLangOpts().CPlusPlus ? Context.BoolTy : Context.IntTy;
1286bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek  }
1296bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek
1306bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek  QualType getArrayIndexType() const {
1316bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek    return ArrayIndexTy;
1326bd8124f53d6694ef0de1713f06325893c0ea2caTed Kremenek  }
133c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
134c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  BasicValueFactory &getBasicValueFactory() { return BasicVals; }
135c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  const BasicValueFactory &getBasicValueFactory() const { return BasicVals; }
136c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
137c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  SymbolManager &getSymbolManager() { return SymMgr; }
138c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  const SymbolManager &getSymbolManager() const { return SymMgr; }
139c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
140c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  MemRegionManager &getRegionManager() { return MemMgr; }
141c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  const MemRegionManager &getRegionManager() const { return MemMgr; }
142c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
143c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  // Forwarding methods to SymbolManager.
144c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
1453b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek  const SymbolConjured* conjureSymbol(const Stmt *stmt,
1463b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                      const LocationContext *LCtx,
1473b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                      QualType type,
1483b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                      unsigned visitCount,
1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                      const void *symbolTag = nullptr) {
1503b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek    return SymMgr.conjureSymbol(stmt, LCtx, type, visitCount, symbolTag);
151c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
152c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
1533b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek  const SymbolConjured* conjureSymbol(const Expr *expr,
1543b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                      const LocationContext *LCtx,
1553b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                      unsigned visitCount,
1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                      const void *symbolTag = nullptr) {
1573b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek    return SymMgr.conjureSymbol(expr, LCtx, visitCount, symbolTag);
158c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
159c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
160426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// Construct an SVal representing '0' for the specified type.
1619f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  DefinedOrUnknownSVal makeZeroVal(QualType type);
162c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
163426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// Make a unique symbol for value of region.
1649697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  DefinedOrUnknownSVal getRegionValueSymbolVal(const TypedValueRegion *region);
165c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
166426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// \brief Create a new symbol with a unique 'name'.
167426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  ///
168426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// We resort to conjured symbols when we cannot construct a derived symbol.
169426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// The advantage of symbols derived/built from other symbols is that we
170426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// preserve the relation between related(or even equivalent) expressions, so
171426a16d4e5efe7efefe76c405207fb170cabad9fAnna Zaks  /// conjured symbols should be used sparingly.
1723b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek  DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag,
1733b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        const Expr *expr,
1743b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        const LocationContext *LCtx,
1753b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        unsigned count);
1763b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek  DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag,
1773b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        const Expr *expr,
1783b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        const LocationContext *LCtx,
1793b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        QualType type,
1803b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        unsigned count);
181337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek
1823b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek  DefinedOrUnknownSVal conjureSymbolVal(const Stmt *stmt,
1833b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        const LocationContext *LCtx,
1843b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        QualType type,
1853b1df8bb941a18c4a7256d7cfcbccb9de7e39995Ted Kremenek                                        unsigned visitCount);
186e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// \brief Conjure a symbol representing heap allocated memory region.
187e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  ///
188e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  /// Note, the expression should represent a location.
189e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks  DefinedOrUnknownSVal getConjuredHeapSymbolVal(const Expr *E,
190e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks                                                const LocationContext *LCtx,
191e17fdb2d5dbf0ffefd417587003eebbe5baf5984Anna Zaks                                                unsigned Count);
192c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
1939f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  DefinedOrUnknownSVal getDerivedRegionValueSymbolVal(
1949697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek      SymbolRef parentSymbol, const TypedValueRegion *region);
195c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
1969f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  DefinedSVal getMetadataSymbolVal(
1979f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan      const void *symbolTag, const MemRegion *region,
1989f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan      const Expr *expr, QualType type, unsigned count);
199c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2009f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  DefinedSVal getFunctionPointer(const FunctionDecl *func);
201c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2029f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  DefinedSVal getBlockPointer(const BlockDecl *block, CanQualType locTy,
2033eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                              const LocationContext *locContext,
2043eb52bb5d791630f926ff2226dae25012315ad9aBill Wendling                              unsigned blockCount);
205c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
206e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose  /// Returns the value of \p E, if it can be determined in a non-path-sensitive
207e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose  /// manner.
208e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose  ///
209e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose  /// If \p E is not a constant or cannot be modeled, returns \c None.
210e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose  Optional<SVal> getConstantVal(const Expr *E);
211e2b1246a24e8babf2f58c93713fba16b8edb8e2dJordan Rose
2129f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  NonLoc makeCompoundVal(QualType type, llvm::ImmutableList<SVal> vals) {
2139f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::CompoundVal(BasicVals.getCompoundValData(type, vals));
214c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
215c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2169697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek  NonLoc makeLazyCompoundVal(const StoreRef &store,
2179697934650354bed2e509d8e7e44f21a1fb00f76Ted Kremenek                             const TypedValueRegion *region) {
2189f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::LazyCompoundVal(
2199f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan        BasicVals.getLazyCompoundValData(store, region));
220c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
221c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
222c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  NonLoc makeZeroArrayIndex() {
223c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::ConcreteInt(BasicVals.getValue(0, ArrayIndexTy));
224c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
225c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
226c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  NonLoc makeArrayIndex(uint64_t idx) {
227c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::ConcreteInt(BasicVals.getValue(idx, ArrayIndexTy));
228c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
229c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2309f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  SVal convertToArrayIndex(SVal val);
231c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2329f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  nonloc::ConcreteInt makeIntVal(const IntegerLiteral* integer) {
2339f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(
2349f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan        BasicVals.getValue(integer->getValue(),
2355e9ebb3c0fb554d9285aa99c470abdf283272bd9Douglas Gregor                     integer->getType()->isUnsignedIntegerOrEnumerationType()));
236c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
2372e4457a006fa2beaa87d909b743aa8f09fbf9ec6Bob Wilson
2381a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek  nonloc::ConcreteInt makeBoolVal(const ObjCBoolLiteralExpr *boolean) {
2391a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek    return makeTruthVal(boolean->getValue(), boolean->getType());
2401a45a5ff5d495cb6cd9a3d4d06317af79c0f634dTed Kremenek  }
241c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
242c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer  nonloc::ConcreteInt makeBoolVal(const CXXBoolLiteralExpr *boolean);
243c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2449f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  nonloc::ConcreteInt makeIntVal(const llvm::APSInt& integer) {
2459f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(BasicVals.getValue(integer));
246c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
247c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2489f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  loc::ConcreteInt makeIntLocVal(const llvm::APSInt &integer) {
2499f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return loc::ConcreteInt(BasicVals.getValue(integer));
250c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
251c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2529f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  NonLoc makeIntVal(const llvm::APInt& integer, bool isUnsigned) {
2539f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(BasicVals.getValue(integer, isUnsigned));
254c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
255c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2569f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  DefinedSVal makeIntVal(uint64_t integer, QualType type) {
2579f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    if (Loc::isLocType(type))
2589f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan      return loc::ConcreteInt(BasicVals.getValue(integer, type));
259c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2609f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(BasicVals.getValue(integer, type));
261c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
262c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2639f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  NonLoc makeIntVal(uint64_t integer, bool isUnsigned) {
2649f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(BasicVals.getIntValue(integer, isUnsigned));
265c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
266c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2679f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  NonLoc makeIntValWithPtrWidth(uint64_t integer, bool isUnsigned) {
2689f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(
2699f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan        BasicVals.getIntWithPtrWidth(integer, isUnsigned));
270c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
271c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2729f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  NonLoc makeLocAsInteger(Loc loc, unsigned bits) {
2739f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::LocAsInteger(BasicVals.getPersistentSValWithData(loc, bits));
274c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
275c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
276c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
2779f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan                    const llvm::APSInt& rhs, QualType type);
278c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
2796d6a83c3754b449ac24cb83bc6d3a50b10535061Anna Zaks  NonLoc makeNonLoc(const llvm::APSInt& rhs, BinaryOperator::Opcode op,
2806d6a83c3754b449ac24cb83bc6d3a50b10535061Anna Zaks                    const SymExpr *lhs, QualType type);
2816d6a83c3754b449ac24cb83bc6d3a50b10535061Anna Zaks
282c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
2839f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan                    const SymExpr *rhs, QualType type);
284c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
285aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks  /// \brief Create a NonLoc value for cast.
286aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks  NonLoc makeNonLoc(const SymExpr *operand, QualType fromTy, QualType toTy);
287aace9ef279be3dadd53b481aee568bd7701178b4Anna Zaks
2889f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  nonloc::ConcreteInt makeTruthVal(bool b, QualType type) {
2899f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return nonloc::ConcreteInt(BasicVals.getTruthValue(b, type));
290c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
291c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
292370e6e984cc32167228b66eaf9610c010da0d794Argyrios Kyrtzidis  nonloc::ConcreteInt makeTruthVal(bool b) {
293c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return nonloc::ConcreteInt(BasicVals.getTruthValue(b));
294c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
295c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
296c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  Loc makeNull() {
297c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek    return loc::ConcreteInt(BasicVals.getZeroWithPtrWidth());
298c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
299c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
3009f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  Loc makeLoc(SymbolRef sym) {
3019f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return loc::MemRegionVal(MemMgr.getSymbolicRegion(sym));
302c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
303c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
3049f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  Loc makeLoc(const MemRegion* region) {
3059f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return loc::MemRegionVal(region);
306c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
307c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
3089f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  Loc makeLoc(const AddrLabelExpr *expr) {
3099f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return loc::GotoLabel(expr->getLabel());
310c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
311c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
3129f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan  Loc makeLoc(const llvm::APSInt& integer) {
3139f8862aa64300ef97b8fe85034ee93bbc03e3b7bZhanyong Wan    return loc::ConcreteInt(BasicVals.getValue(integer));
314c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek  }
315c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek
31610f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  /// Return a memory region for the 'this' object reference.
31710f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  loc::MemRegionVal getCXXThis(const CXXMethodDecl *D,
31810f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek                               const StackFrameContext *SFC);
31910f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek
32010f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  /// Return a memory region for the 'this' object reference.
32110f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek  loc::MemRegionVal getCXXThis(const CXXRecordDecl *D,
32210f77ad7fc5e5cf3f37a9b14ff5843468b8b84d2Ted Kremenek                               const StackFrameContext *SFC);
323e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek};
3241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
325c8413fd03f73084a5c93028f8b4db619fc388087Ted KremenekSValBuilder* createSimpleSValBuilder(llvm::BumpPtrAllocator &alloc,
326c8413fd03f73084a5c93028f8b4db619fc388087Ted Kremenek                                     ASTContext &context,
32718c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek                                     ProgramStateManager &stateMgr);
3281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3295a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis} // end GR namespace
3305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
331e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek} // end clang namespace
3325a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis
333e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#endif
334