CallEvent.h revision 3f558af01643787d209a133215b0abec81b5fe30
1f540c54701e3eeb34cb619a3a4eb18f1ac70ef2dJordan Rose//===- CallEvent.h - Wrapper for all function and method calls ----*- C++ -*--//
2740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
3740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//                     The LLVM Compiler Infrastructure
4740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
5740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// This file is distributed under the University of Illinois Open Source
6740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// License. See LICENSE.TXT for details.
7740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
8740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===//
9740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
10740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \file This file defines CallEvent and its subclasses, which represent path-
11740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// sensitive instances of different kinds of function and method calls
12740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// (C, C++, and Objective-C).
13740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
14740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===//
15740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
16740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#ifndef LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL
17740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#define LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL
18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/Basic/SourceManager.h"
20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/DeclCXX.h"
21740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprCXX.h"
22740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprObjC.h"
23de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
24740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
25b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#include "llvm/ADT/PointerIntPair.h"
26740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
27740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace clang {
2828038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPoint;
2928038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPointTag;
3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
31740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace ento {
32740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
33740d490593e0de8732a697c9f77b90ddd463863bJordan Roseenum CallEventKind {
34740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Function,
35740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_CXXMember,
36fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  CE_CXXMemberOperator,
37c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember,
38c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CE_END_CXX_INSTANCE_CALLS = CE_CXXMemberOperator,
39740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Block,
40740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_SIMPLE_CALLS = CE_Function,
41740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_END_SIMPLE_CALLS = CE_Block,
42740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_CXXConstructor,
438d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  CE_CXXDestructor,
4470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_CXXAllocator,
45740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_FUNCTION_CALLS = CE_Function,
4670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_END_FUNCTION_CALLS = CE_CXXAllocator,
478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  CE_ObjCMessage
48740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
50972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEvent;
51d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventManager;
52972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
53d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosetemplate<typename T = CallEvent>
54d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventRef : public IntrusiveRefCntPtr<const T> {
55d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
56d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef(const T *Call) : IntrusiveRefCntPtr<const T>(Call) {}
57d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef(const CallEventRef &Orig) : IntrusiveRefCntPtr<const T>(Orig) {}
58d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
59d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<T> cloneWithState(ProgramStateRef State) const {
60d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return this->getPtr()->template cloneWithState<T>(State);
61d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
6257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
6357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Allow implicit conversions to a superclass type, since CallEventRef
6457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // behaves like a pointer-to-const.
6557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template <typename SuperT>
6657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  operator CallEventRef<SuperT> () const {
6757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    return this->getPtr();
6857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  }
69d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose};
70b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
715960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks/// \brief Defines the runtime definition of the called function.
72fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaksclass RuntimeDefinition {
735960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// The Declaration of the function which will be called at runtime.
745960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// 0 if not available.
75fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  const Decl *D;
765960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks
775960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// The region representing an object (ObjC/C++) on which the method is
785960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// called. With dynamic dispatch, the method definition depends on the
795960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// runtime type of this object. 0 when there is no dynamic dispatch.
80fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  const MemRegion *R;
815960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks
82fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zakspublic:
83fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(): D(0), R(0) {}
84fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(const Decl *InD): D(InD), R(0) {}
85fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(const Decl *InD, const MemRegion *InR): D(InD), R(InR) {}
865960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  const Decl *getDecl() { return D; }
875960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  const MemRegion *getDispatchRegion() { return R; }
885960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  bool mayHaveOtherDefinitions() { return R != 0; }
89e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks};
90e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks
91740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents an abstract call to a function or method along a
92740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// particular path.
93972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
94972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents are created through the factory methods of CallEventManager.
95972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
96972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents should always be cheap to create and destroy. In order for
97972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager to be able to re-use CallEvent-sized memory blocks,
98972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// subclasses of CallEvent may not add any data members to the base class.
99972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// Use the "Data" and "Location" fields instead.
100740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent {
101740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
102740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef CallEventKind Kind;
103740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
104b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseprivate:
1057c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ProgramStateRef State;
1067c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  const LocationContext *LCtx;
107b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  llvm::PointerUnion<const Expr *, const Decl *> Origin;
108b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
109972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // DO NOT IMPLEMENT
1107c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  CallEvent &operator=(const CallEvent &);
1117c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
112740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
113b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This is user data for subclasses.
114b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const void *Data;
115972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
116972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // This is user data for subclasses.
117972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // This should come right before RefCount, so that the two fields can be
118972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // packed together on LP64 platforms.
119b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceLocation Location;
120b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
121972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprivate:
122972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  mutable unsigned RefCount;
123972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
124972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  template <typename T> friend struct llvm::IntrusiveRefCntPtrInfo;
125972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void Retain() const { ++RefCount; }
126972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void Release() const;
127972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
128972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
129d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
130d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1317c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx)
132972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(state), LCtx(lctx), Origin(E), RefCount(0) {}
133b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
1347c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx)
135972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(state), LCtx(lctx), Origin(D), RefCount(0) {}
136972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
137972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // DO NOT MAKE PUBLIC
138972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEvent(const CallEvent &Original)
139972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(Original.State), LCtx(Original.LCtx), Origin(Original.Origin),
140972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      Data(Original.Data), Location(Original.Location), RefCount(0) {}
141b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
142d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1437c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ProgramStateRef getState() const {
1447c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return State;
145b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
146b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
147b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const LocationContext *getLocationContext() const {
1487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return LCtx;
149b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
150740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
151740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
152972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Copies this CallEvent, with vtable intact, into a new block of memory.
153972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const = 0;
154972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
155740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Get the value of arbitrary expressions at this point in the path.
156740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getSVal(const Stmt *S) const {
157b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getState()->getSVal(S, getLocationContext());
158740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
159740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
160972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
161740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef SmallVectorImpl<const MemRegion *> RegionList;
162740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
163740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Used to specify non-argument regions that will be invalidated as a
164740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// result of this call.
1657c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const {}
166740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
1677c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual QualType getDeclaredResultType() const = 0;
168740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
169740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
1707c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual ~CallEvent() {}
1717c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
172b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \brief Returns the kind of call this is.
1737c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const = 0;
174b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
175740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the declaration of the function or method that will be
176740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// called. May be null.
1777c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Decl *getDecl() const {
1787c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return Origin.dyn_cast<const Decl *>();
1797c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
180740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
181ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  /// \brief Returns the definition of the function or method that will be
1825960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// called.
183e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const = 0;
184ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
185740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression whose value will be the result of this call.
186740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null.
187b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Expr *getOriginExpr() const {
188b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return Origin.dyn_cast<const Expr *>();
189b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
190740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
191740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the number of arguments (explicit and implicit).
192740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
193740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// Note that this may be greater than the number of parameters in the
194740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// callee's declaration, and that it may include arguments not written in
195740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// the source.
1967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const = 0;
197740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
198740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if the callee is known to be from a system header.
199740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool isInSystemHeader() const {
200740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    const Decl *D = getDecl();
201740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (!D)
202740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return false;
203740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
204740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    SourceLocation Loc = D->getLocation();
205740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (Loc.isValid()) {
206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      const SourceManager &SM =
207b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose        getState()->getStateManager().getContext().getSourceManager();
208740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return SM.isInSystemHeader(D->getLocation());
209740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    }
210740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
211740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // Special case for implicitly-declared global operator new/delete.
212740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // These should be considered system functions.
213740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
214740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal();
215740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
216740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
217740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
218740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
219de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// \brief Returns a source range for the entire call, suitable for
220de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// outputting in diagnostics.
2217c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const {
2227c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getSourceRange();
2237c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
224de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose
225740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the value of a given argument at the time of the call.
2267c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SVal getArgSVal(unsigned Index) const;
227740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
228740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression associated with a given argument.
229740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null if this expression does not appear in the source.
2307c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const { return 0; }
231740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
232740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the source range for errors associated with this argument.
2337c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ///
234740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be invalid if the argument is not written in the source.
2357c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getArgSourceRange(unsigned Index) const;
236740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
237740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the result type, adjusted for references.
238740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getResultType() const;
239740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
240740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if any of the arguments appear to represent callbacks.
241740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool hasNonZeroCallbackArg() const;
242740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
24385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// \brief Returns true if any of the arguments are known to escape to long-
24485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// term storage, even if this method will not modify them.
24585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // NOTE: The exact semantics of this are still being defined!
24685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // We don't really want a list of hardcoded exceptions in the long run,
24785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // but we don't want duplicated lists of known APIs in the short term either.
2487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual bool argumentsMayEscape() const {
2497c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return hasNonZeroCallbackArg();
2507c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
25185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
25228038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  /// \brief Returns an appropriate ProgramPoint for this call.
2538d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  ProgramPoint getProgramPoint(bool IsPreVisit = false,
25428038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose                               const ProgramPointTag *Tag = 0) const;
25528038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
256740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns a new state with all argument regions invalidated.
257740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
258740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// This accepts an alternate state in case some processing has already
259740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// occurred.
260740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ProgramStateRef invalidateRegions(unsigned BlockCount,
261740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                                    ProgramStateRef Orig = 0) const;
262740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
263ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  typedef std::pair<Loc, SVal> FrameBindingTy;
264ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  typedef SmallVectorImpl<FrameBindingTy> BindingsTy;
265ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
266ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// Populates the given SmallVector with the bindings in the callee's stack
267ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// frame at the start of this call.
268ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
269ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const = 0;
270ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
271972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns a copy of this CallEvent, but using the given state.
272972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  template <typename T>
273d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<T> cloneWithState(ProgramStateRef NewState) const;
274972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
275972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns a copy of this CallEvent, but using the given state.
276d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<> cloneWithState(ProgramStateRef NewState) const {
277972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return cloneWithState<CallEvent>(NewState);
278972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
279972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
28085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// \brief Returns true if this is a statement that can be considered for
28185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// inlining.
2827c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ///
2837c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  /// FIXME: This should go away once CallEvents are cheap and easy to
2847c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  /// construct from ExplodedNodes.
28585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  static bool mayBeInlined(const Stmt *S);
28685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
287e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  // Iterator access to formal parameters and their types.
288740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprivate:
289740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
290740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
291740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
292e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  typedef const ParmVarDecl * const *param_iterator;
293e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
294e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the call's formal parameters.
295e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
296e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// If UseDefinitionParams is set, this will return the parameter decls
297e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// used in the callee's definition (suitable for inlining). Most of the
298e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// time it is better to use the decl found by name lookup, which likely
299e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// carries more annotations.
300e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
301e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Remember that the number of formal parameters may not match the number
302e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// of arguments for all calls. However, the first parameter will always
303e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// correspond with the argument value returned by \c getArgSVal(0).
304e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
305e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// If the call has no accessible declaration (or definition, if
306e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \p UseDefinitionParams is set), \c param_begin() will be equal to
307e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \c param_end().
308ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const =0;
309e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_begin()
310ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const = 0;
311e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
312740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef llvm::mapped_iterator<param_iterator, get_type_fun>
313740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    param_type_iterator;
314740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
315e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the types of the call's formal parameters.
316e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
317e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// This uses the callee decl found by default name lookup rather than the
318e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// definition because it represents a public interface, and probably has
319e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// more annotations.
320740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_begin() const {
321740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return llvm::map_iterator(param_begin(),
322740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                              get_type_fun(&ParmVarDecl::getType));
323740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
324e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_type_begin()
325740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_end() const {
326740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return llvm::map_iterator(param_end(), get_type_fun(&ParmVarDecl::getType));
327740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
328740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
3290ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose  // For debugging purposes only
330b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  void dump(raw_ostream &Out) const;
3310ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose  LLVM_ATTRIBUTE_USED void dump() const { dump(llvm::errs()); }
3320ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose
333740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *) { return true; }
334740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
335740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
336b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
337740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to any sort of function that might have a
338740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// FunctionDecl.
339740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass AnyFunctionCall : public CallEvent {
340740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
341b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Expr *E, ProgramStateRef St,
3427c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
3437c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CallEvent(E, St, LCtx) {}
344b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Decl *D, ProgramStateRef St,
3457c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
3467c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CallEvent(D, St, LCtx) {}
347972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  AnyFunctionCall(const AnyFunctionCall &Other) : CallEvent(Other) {}
348740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
3497c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual QualType getDeclaredResultType() const;
350740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
351740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
352b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This function is overridden by subclasses, but they must return
353b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // a FunctionDecl.
3547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const {
3557c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return cast<FunctionDecl>(CallEvent::getDecl());
356b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
357740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
358e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const {
359ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    const FunctionDecl *FD = getDecl();
360ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    // Note that hasBody() will fill FD with the definition FunctionDecl.
361ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    if (FD && FD->hasBody(FD))
3625960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks      return RuntimeDefinition(FD);
363e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks    return RuntimeDefinition();
364ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
365ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
3667c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual bool argumentsMayEscape() const;
367b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
368ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
369ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
370ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
371ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const;
372ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const;
373b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
374740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
375740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
376740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_FUNCTION_CALLS;
377740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
378740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
379740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
380740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a written as a CallExpr.
381740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass SimpleCall : public AnyFunctionCall {
382740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
383b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SimpleCall(const CallExpr *CE, ProgramStateRef St,
3847c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose             const LocationContext *LCtx)
385972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : AnyFunctionCall(CE, St, LCtx) {}
386972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  SimpleCall(const SimpleCall &Other) : AnyFunctionCall(Other) {}
387740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
388740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
3897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CallExpr *getOriginExpr() const {
390b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CallExpr>(AnyFunctionCall::getOriginExpr());
391b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
392740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
3937c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const;
394740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
3957c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
3967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
3977c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
398b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
399740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
400740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
401740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
402740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_SIMPLE_CALLS &&
403740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_SIMPLE_CALLS;
404740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
405740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
406740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
407740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a C function or static C++ member function call.
408740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
409740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c fun()
410740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass FunctionCall : public SimpleCall {
411d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
412972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
413d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
414740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  FunctionCall(const CallExpr *CE, ProgramStateRef St,
415740d490593e0de8732a697c9f77b90ddd463863bJordan Rose               const LocationContext *LCtx)
4167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : SimpleCall(CE, St, LCtx) {}
417740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
418d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  FunctionCall(const FunctionCall &Other) : SimpleCall(Other) {}
419d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) FunctionCall(*this); }
420d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
421d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
4227c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_Function; }
423b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
424740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
425740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_Function;
426740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
427740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
428740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
429c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how
430c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written.
431c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXInstanceCall : public SimpleCall {
432740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
4337c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
434740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
435c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CXXInstanceCall(const CallExpr *CE, ProgramStateRef St,
4367c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
4377c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : SimpleCall(CE, St, LCtx) {}
438c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
439972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CXXInstanceCall(const CXXInstanceCall &Other) : SimpleCall(Other) {}
440972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
441c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic:
4429da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  /// \brief Returns the expression representing the implicit 'this' object.
4439da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const = 0;
4449da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose
445ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
4469da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  SVal getCXXThisVal() const {
4479da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    const Expr *Base = getCXXThisExpr();
4489da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    // FIXME: This doesn't handle an overloaded ->* operator.
4499da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    if (!Base)
4509da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose      return UnknownVal();
4519da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    return getSVal(Base);
4529da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  }
453ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
454e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const;
455c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
456ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
457ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
458ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
459c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  static bool classof(const CallEvent *CA) {
460c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS &&
461c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose           CA->getKind() <= CE_END_CXX_INSTANCE_CALLS;
462c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  }
463c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose};
464c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
465c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call.
466c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose///
467c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun()
468c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall {
469d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
470972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
471d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
472740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St,
473c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose                const LocationContext *LCtx)
4747c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
475740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
476d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {}
477d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXMemberCall(*this); }
478d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
479d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
4807c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXMemberCallExpr *getOriginExpr() const {
481740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return cast<CXXMemberCallExpr>(SimpleCall::getOriginExpr());
482740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
483740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
4849da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const;
4857c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
4867c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXMember; }
487e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
488740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
489740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXMember;
490740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
491740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
492740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
493fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is
494fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function.
495fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose///
496fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt>
497c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall {
498d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
499d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
500972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
501d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St,
502d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        const LocationContext *LCtx)
503d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
504d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
505972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CXXMemberOperatorCall(const CXXMemberOperatorCall &Other)
506972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : CXXInstanceCall(Other) {}
507972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const {
508972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    new (Dest) CXXMemberOperatorCall(*this);
509972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
510972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
511fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic:
5127c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXOperatorCallExpr *getOriginExpr() const {
513fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return cast<CXXOperatorCallExpr>(SimpleCall::getOriginExpr());
514fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
515fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
5167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
5177c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getNumArgs() - 1;
5187c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
5197c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
520fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return getOriginExpr()->getArg(Index + 1);
521fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
522fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
5239da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const;
5247c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
5257c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXMemberOperator; }
526e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
527fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  static bool classof(const CallEvent *CA) {
528fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return CA->getKind() == CE_CXXMemberOperator;
529fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
530fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose};
531fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
532740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a block.
533740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
534fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>^{ /* ... */ }()</tt>
535740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass BlockCall : public SimpleCall {
536d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
537d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
538740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
539d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  BlockCall(const CallExpr *CE, ProgramStateRef St,
540d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose            const LocationContext *LCtx)
541d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : SimpleCall(CE, St, LCtx) {}
542d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
543972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  BlockCall(const BlockCall &Other) : SimpleCall(Other) {}
544972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) BlockCall(*this); }
545972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
5467c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
547740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
5487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual QualType getDeclaredResultType() const;
549740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
550740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
55169f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// \brief Returns the region associated with this instance of the block.
55269f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
55369f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// This may be NULL if the block's origin is unknown.
55469f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  const BlockDataRegion *getBlockRegion() const;
55569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose
55669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// \brief Gets the declaration of the block.
55769f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
55869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// This is not an override of getDecl() because AnyFunctionCall has already
55969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// assumed that it's a FunctionDecl.
56069f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  const BlockDecl *getBlockDecl() const {
56169f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    const BlockDataRegion *BR = getBlockRegion();
56269f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    if (!BR)
56369f87c956b3ac2b80124fd9604af012e1061473aJordan Rose      return 0;
56469f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    return BR->getDecl();
565740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
566740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
567e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const {
5685960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks    return RuntimeDefinition(getBlockDecl());
569ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
570ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
571ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
572ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
573ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
574ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const;
575ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const;
576b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
5777c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_Block; }
578b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
579740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
580740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_Block;
581740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
582740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
583740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
584740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor.
585740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
586740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1)
587740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall {
588d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
589b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
590d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
591d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// Creates a constructor call.
592d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///
593d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param CE The constructor expression as written in the source.
594d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param Target The region where the object should be constructed. If NULL,
595d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///               a new symbolic region will be used.
596d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param St The path-sensitive state at this point in the program.
597d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param LCtx The location context at this point in the program.
598b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *target,
599740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                     ProgramStateRef St, const LocationContext *LCtx)
6007c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {
601b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Data = target;
602b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
603740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
604d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){}
605d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXConstructorCall(*this); }
606d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
607d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
608d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
609d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
6107c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructExpr *getOriginExpr() const {
611b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr());
612b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
613b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
6147c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructorDecl *getDecl() const {
615b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getConstructor();
616740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
617740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6187c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
619740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6207c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
621b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
622740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
623740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
624ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
6257c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SVal getCXXThisVal() const;
6267c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
627ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
628ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
629ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
6307c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXConstructor; }
631e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
632740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
633740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXConstructor;
634740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
635740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
636740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6378d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// \brief Represents an implicit call to a C++ destructor.
6388d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose///
6398d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// This can occur at the end of a scope (for automatic objects), at the end
6408d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// of a full-expression (for temporaries), or as part of a delete.
6418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Roseclass CXXDestructorCall : public AnyFunctionCall {
642d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
6438d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
644d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
645b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// Creates an implicit destructor.
646b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  ///
647b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param DD The destructor that will be called.
648b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param Trigger The statement whose completion causes this destructor call.
649b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param Target The object region to be destructed.
650b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param St The path-sensitive state at this point in the program.
651b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param LCtx The location context at this point in the program.
652b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
653b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose                    const MemRegion *Target, ProgramStateRef St,
6548d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose                    const LocationContext *LCtx)
6557c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(DD, St, LCtx) {
656b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Data = Target;
657b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Location = Trigger->getLocEnd();
658b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
6598d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
660d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXDestructorCall(const CXXDestructorCall &Other) : AnyFunctionCall(Other) {}
661d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXDestructorCall(*this); }
662d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
663d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
664d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
665d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
6667c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const { return Location; }
6677c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const { return 0; }
6687c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
669ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
6707c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SVal getCXXThisVal() const;
671ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
672e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const;
6738d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
674ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
675ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
676ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
6777c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXDestructor; }
678e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
6798d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  static bool classof(const CallEvent *CA) {
6808d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose    return CA->getKind() == CE_CXXDestructor;
6818d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  }
6828d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose};
6838d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
6840e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression.
6850e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose///
6860e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new".
68770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall {
688d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
689972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
690d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
691b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St,
69270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose                   const LocationContext *LCtx)
6937c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(E, St, LCtx) {}
69470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
695d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {}
696d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXAllocatorCall(*this); }
697d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
698d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
6997c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXNewExpr *getOriginExpr() const {
700b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr());
701b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
702b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
7037c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const {
704b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getOperatorNew();
70570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
70670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7077c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
708b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumPlacementArgs() + 1;
709b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
71070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7117c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
71270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    // The first argument of an allocator call is the size of the allocation.
71370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    if (Index == 0)
71470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose      return 0;
715b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getPlacementArg(Index - 1);
71670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
71770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7187c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXAllocator; }
719b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
72070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  static bool classof(const CallEvent *CE) {
72170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    return CE->getKind() == CE_CXXAllocator;
72270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
72370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose};
72470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7258919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur.
7268919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose//
7278919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not
7288919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits.
7298919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind {
7308919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_PropertyAccess,
7318919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Subscript,
7328919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Message
7338919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose};
7348919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
735cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method.
7368919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose///
7378919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind.
738cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent {
739d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
740d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
7418919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  const PseudoObjectExpr *getContainingPseudoObjectExpr() const;
742cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
7438919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected:
744d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St,
745d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                 const LocationContext *LCtx)
746d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CallEvent(Msg, St, LCtx) {
747d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    Data = 0;
748d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
749d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
750972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {}
751972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) ObjCMethodCall(*this); }
752972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
7537c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
754740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7557c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual QualType getDeclaredResultType() const;
756740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7573f558af01643787d209a133215b0abec81b5fe30Anna Zaks  /// Check if the selector may have multiple definitions (may have overrides).
7583f558af01643787d209a133215b0abec81b5fe30Anna Zaks  virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
7593f558af01643787d209a133215b0abec81b5fe30Anna Zaks                                        Selector Sel) const;
7603f558af01643787d209a133215b0abec81b5fe30Anna Zaks
761740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
7627c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMessageExpr *getOriginExpr() const {
7638919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMessageExpr>(CallEvent::getOriginExpr());
764cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
7657c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMethodDecl *getDecl() const {
766b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getMethodDecl();
767b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
7687c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
769b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumArgs();
770b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
7717c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
772b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
773b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
774740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7758919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isInstanceMessage() const {
7768919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->isInstanceMessage();
7778919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7788919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMethodFamily getMethodFamily() const {
7798919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getMethodFamily();
7808919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7818919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  Selector getSelector() const {
7828919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getSelector();
7838919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7848919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7857c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const;
7868919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7870e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Returns the value of the receiver at the time of this call.
788740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getReceiverSVal() const;
789740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7900e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Get the interface for the receiver.
7910e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  ///
7920e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// This works whether this is an instance message or a class message.
7930e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// However, it currently just uses the static type of the receiver.
794cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  const ObjCInterfaceDecl *getReceiverInterface() const {
795b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getReceiverInterface();
796cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
797cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
7988919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMessageKind getMessageKind() const;
7998919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
8008919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isSetter() const {
8018919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    switch (getMessageKind()) {
8028919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Message:
8038919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      llvm_unreachable("This is not a pseudo-object access!");
8048919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_PropertyAccess:
8058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 0;
8068919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Subscript:
8078919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 1;
8088919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    }
8098919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    llvm_unreachable("Unknown message kind");
810740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
811740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
812e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const;
813ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
814ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
815ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
816ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
817ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const;
818ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const;
819b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
8207c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_ObjCMessage; }
821b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
822740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
823740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_ObjCMessage;
824740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
825740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
826740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
827972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
828972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// \brief Manages the lifetime of CallEvent objects.
829972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
830972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager provides a way to create arbitrary CallEvents "on the
831972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// stack" as if they were value objects by keeping a cache of CallEvent-sized
832972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// memory blocks. The CallEvents created by CallEventManager are only valid
833972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// for the lifetime of the OwnedCallEvent that holds them; right now these
834972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// objects cannot be copied and ownership cannot be transferred.
835972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEventManager {
836972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  friend class CallEvent;
837972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
838972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  llvm::BumpPtrAllocator &Alloc;
839d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  SmallVector<void *, 8> Cache;
840972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
841972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void reclaim(const void *Memory) {
842972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    Cache.push_back(const_cast<void *>(Memory));
843972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
844972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
845972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns memory that can be initialized as a CallEvent.
846972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void *allocate() {
847972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    if (Cache.empty())
848972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Alloc.Allocate<FunctionCall>();
849972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    else
850972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Cache.pop_back_val();
851972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
852972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
853d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg>
854d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) {
855d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A, St, LCtx);
856d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
857d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
858d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2>
859d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) {
860d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, St, LCtx);
861d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
862d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
863d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2, typename Arg3>
864d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St,
865d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose            const LocationContext *LCtx) {
866d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, A3, St, LCtx);
867d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
868d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
869972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosepublic:
870972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {}
871d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
87257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
87357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  CallEventRef<>
87457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State);
87557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
87657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
877d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<SimpleCall>
878d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getSimpleCall(const CallExpr *E, ProgramStateRef State,
879d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                const LocationContext *LCtx);
880d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
881d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<ObjCMethodCall>
882d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State,
883d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                    const LocationContext *LCtx) {
884d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<ObjCMethodCall>(E, State, LCtx);
885d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
886d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
887d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXConstructorCall>
888d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target,
889d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        ProgramStateRef State, const LocationContext *LCtx) {
890d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXConstructorCall>(E, Target, State, LCtx);
891d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
892d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
893d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXDestructorCall>
894d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
895d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                       const MemRegion *Target, ProgramStateRef State,
896d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                       const LocationContext *LCtx) {
897d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXDestructorCall>(DD, Trigger, Target, State, LCtx);
898d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
899d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
900d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXAllocatorCall>
901d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State,
902d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                      const LocationContext *LCtx) {
903d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXAllocatorCall>(E, State, LCtx);
904d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
905972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose};
906972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
907972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
908972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosetemplate <typename T>
909d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan RoseCallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const {
910972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(isa<T>(*this) && "Cloning to unrelated type");
911972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(sizeof(T) == sizeof(CallEvent) && "Subclasses may not add fields");
912972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
913d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  if (NewState == State)
914d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return cast<T>(this);
915d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
916972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
917972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  T *Copy = static_cast<T *>(Mgr.allocate());
918972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  cloneTo(Copy);
919972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(Copy->getKind() == this->getKind() && "Bad copy");
920972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
921972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Copy->State = NewState;
922972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  return Copy;
923972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
924972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
925972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseinline void CallEvent::Release() const {
926972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(RefCount > 0 && "Reference count is already zero.");
927972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  --RefCount;
928972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
929972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  if (RefCount > 0)
930972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return;
931972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
932972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
933972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Mgr.reclaim(this);
934972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
935972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  this->~CallEvent();
936972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
937972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
938740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento
939740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang
940740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
94157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rosenamespace llvm {
94257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Support isa<>, cast<>, and dyn_cast<> for CallEventRef.
94357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template<class T> struct simplify_type< clang::ento::CallEventRef<T> > {
94457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    typedef const T *SimpleType;
94557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
94657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    static SimpleType
94757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    getSimplifiedValue(const clang::ento::CallEventRef<T>& Val) {
94857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return Val.getPtr();
94957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    }
95057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  };
95157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose}
95257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
953740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif
954