CallEvent.h revision 09647f28d7955d0c948ebbbb376a46844056f11a
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_Block,
36740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_SIMPLE_CALLS = CE_Function,
37740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_END_SIMPLE_CALLS = CE_Block,
38645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXMember,
39645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXMemberOperator,
408d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  CE_CXXDestructor,
41645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember,
42645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_END_CXX_INSTANCE_CALLS = CE_CXXDestructor,
43645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXConstructor,
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;
33142c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramer  LLVM_ATTRIBUTE_USED void dump() const;
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
380645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents a call to a non-C++ function, 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
429645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents a call to a block.
430645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose///
431645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// Example: <tt>^{ /* ... */ }()</tt>
432645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass BlockCall : public SimpleCall {
433645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  friend class CallEventManager;
434645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
435645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseprotected:
436645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  BlockCall(const CallExpr *CE, ProgramStateRef St,
437645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose            const LocationContext *LCtx)
438645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : SimpleCall(CE, St, LCtx) {}
439645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
440645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  BlockCall(const BlockCall &Other) : SimpleCall(Other) {}
441645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) BlockCall(*this); }
442645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
443645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
444645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
445645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual QualType getDeclaredResultType() const;
446645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
447645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic:
448645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Returns the region associated with this instance of the block.
449645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  ///
450645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// This may be NULL if the block's origin is unknown.
451645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const BlockDataRegion *getBlockRegion() const;
452645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
453645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Gets the declaration of the block.
454645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  ///
455645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// This is not an override of getDecl() because AnyFunctionCall has already
456645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// assumed that it's a FunctionDecl.
457645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const BlockDecl *getBlockDecl() const {
458645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    const BlockDataRegion *BR = getBlockRegion();
459645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    if (!BR)
460645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose      return 0;
461645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return BR->getDecl();
462645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
463645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
464645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual RuntimeDefinition getRuntimeDefinition() const {
465645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return RuntimeDefinition(getBlockDecl());
466645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
467645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
468645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
469645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                                            BindingsTy &Bindings) const;
470645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
471645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual param_iterator param_begin() const;
472645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual param_iterator param_end() const;
473645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
474645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual Kind getKind() const { return CE_Block; }
475645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
476645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  static bool classof(const CallEvent *CA) {
477645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return CA->getKind() == CE_Block;
478645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
479645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose};
480645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
481c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how
482c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written.
483645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXInstanceCall : public AnyFunctionCall {
484740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
4857c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
486740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
487c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CXXInstanceCall(const CallExpr *CE, ProgramStateRef St,
4887c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
489645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {}
490645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St,
491645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                  const LocationContext *LCtx)
492645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : AnyFunctionCall(D, St, LCtx) {}
493645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
494c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
495645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXInstanceCall(const CXXInstanceCall &Other) : AnyFunctionCall(Other) {}
496972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
497c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic:
4989da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  /// \brief Returns the expression representing the implicit 'this' object.
499645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual const Expr *getCXXThisExpr() const { return 0; }
5009da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose
501ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
502645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual SVal getCXXThisVal() const {
5039da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    const Expr *Base = getCXXThisExpr();
5049da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    // FIXME: This doesn't handle an overloaded ->* operator.
5059da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    if (!Base)
5069da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose      return UnknownVal();
5079da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose    return getSVal(Base);
5089da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  }
509ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
510645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual const FunctionDecl *getDecl() const;
511645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
512e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const;
513c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
514ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
515ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
516ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
517c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  static bool classof(const CallEvent *CA) {
518c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS &&
519c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose           CA->getKind() <= CE_END_CXX_INSTANCE_CALLS;
520c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  }
521c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose};
522c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
523c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call.
524c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose///
525c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun()
526c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall {
527d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
528972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
529d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
530740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St,
531c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose                const LocationContext *LCtx)
5327c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
533740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
534d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {}
535d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXMemberCall(*this); }
536d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
537d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
5387c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXMemberCallExpr *getOriginExpr() const {
539645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr());
540645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
541645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
542645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual unsigned getNumArgs() const {
543645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    if (const CallExpr *CE = getOriginExpr())
544645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose      return CE->getNumArgs();
545645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return 0;
546645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
547645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
548645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
549645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return getOriginExpr()->getArg(Index);
550740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
551740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
5529da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const;
5537c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
5547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXMember; }
555e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
556740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
557740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXMember;
558740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
559740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
560740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
561fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is
562fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function.
563fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose///
564fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt>
565c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall {
566d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
567d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
568972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
569d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St,
570d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        const LocationContext *LCtx)
571d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
572d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
573972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CXXMemberOperatorCall(const CXXMemberOperatorCall &Other)
574972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : CXXInstanceCall(Other) {}
575972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const {
576972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    new (Dest) CXXMemberOperatorCall(*this);
577972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
578972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
579fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic:
5807c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXOperatorCallExpr *getOriginExpr() const {
581645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr());
582fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
583fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
5847c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
5857c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getNumArgs() - 1;
5867c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
5877c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
588fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return getOriginExpr()->getArg(Index + 1);
589fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
590fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
5919da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  virtual const Expr *getCXXThisExpr() const;
5927c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
5937c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXMemberOperator; }
594e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
595fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  static bool classof(const CallEvent *CA) {
596fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return CA->getKind() == CE_CXXMemberOperator;
597fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
598fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose};
599fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
600645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents an implicit call to a C++ destructor.
601740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
602645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// This can occur at the end of a scope (for automatic objects), at the end
603645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// of a full-expression (for temporaries), or as part of a delete.
604645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXDestructorCall : public CXXInstanceCall {
605d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
606d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
607740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
608645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// Creates an implicit destructor.
60969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
610645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param DD The destructor that will be called.
611645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param Trigger The statement whose completion causes this destructor call.
612645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param Target The object region to be destructed.
613645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param St The path-sensitive state at this point in the program.
614645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param LCtx The location context at this point in the program.
615645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
616645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                    const MemRegion *Target, ProgramStateRef St,
617645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                    const LocationContext *LCtx)
618645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : CXXInstanceCall(DD, St, LCtx) {
619645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    Data = Target;
620645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    Location = Trigger->getLocEnd();
621740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
622740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
623645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXDestructorCall(const CXXDestructorCall &Other) : CXXInstanceCall(Other) {}
624645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXDestructorCall(*this); }
625ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
626645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic:
627645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual SourceRange getSourceRange() const { return Location; }
628645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual unsigned getNumArgs() const { return 0; }
629ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
630645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
631645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual SVal getCXXThisVal() const;
632b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
633645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  virtual Kind getKind() const { return CE_CXXDestructor; }
634b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
635740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
636645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return CA->getKind() == CE_CXXDestructor;
637740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
638740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
639740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
640740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor.
641740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
642740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1)
643740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall {
644d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
645b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
646d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
647d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// Creates a constructor call.
648d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///
649d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param CE The constructor expression as written in the source.
650d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param Target The region where the object should be constructed. If NULL,
651d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///               a new symbolic region will be used.
652d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param St The path-sensitive state at this point in the program.
653d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param LCtx The location context at this point in the program.
654b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *target,
655740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                     ProgramStateRef St, const LocationContext *LCtx)
6567c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {
657b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Data = target;
658b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
659740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
660d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){}
661d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXConstructorCall(*this); }
662d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
663d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
664d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
665d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
6667c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructExpr *getOriginExpr() const {
667b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr());
668b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
669b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
6707c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructorDecl *getDecl() const {
671b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getConstructor();
672740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
673740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6747c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
675740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6767c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
677b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
678740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
679740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
680ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
681645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  SVal getCXXThisVal() const;
6827c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
683ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
684ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
685ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
6867c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXConstructor; }
687e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
688740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
689740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXConstructor;
690740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
691740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
692740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6930e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression.
6940e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose///
6950e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new".
69670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall {
697d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
698972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
699d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
700b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St,
70170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose                   const LocationContext *LCtx)
7027c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(E, St, LCtx) {}
70370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
704d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {}
705d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) CXXAllocatorCall(*this); }
706d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
707d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
7087c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXNewExpr *getOriginExpr() const {
709b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr());
710b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
711b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
7127c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const FunctionDecl *getDecl() const {
713b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getOperatorNew();
71470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
71570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
717b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumPlacementArgs() + 1;
718b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
71970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7207c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
72170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    // The first argument of an allocator call is the size of the allocation.
72270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    if (Index == 0)
72370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose      return 0;
724b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getPlacementArg(Index - 1);
72570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
72670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7277c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_CXXAllocator; }
728b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
72970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  static bool classof(const CallEvent *CE) {
73070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    return CE->getKind() == CE_CXXAllocator;
73170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
73270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose};
73370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
7348919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur.
7358919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose//
7368919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not
7378919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits.
7388919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind {
7398919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_PropertyAccess,
7408919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Subscript,
7418919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Message
7428919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose};
7438919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
744cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method.
7458919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose///
7468919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind.
747cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent {
748d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
749d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
7508919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  const PseudoObjectExpr *getContainingPseudoObjectExpr() const;
751cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
7528919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected:
753d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St,
754d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                 const LocationContext *LCtx)
755d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CallEvent(Msg, St, LCtx) {
756d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    Data = 0;
757d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
758d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
759972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {}
760972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const { new (Dest) ObjCMethodCall(*this); }
761972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
7627c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual void getExtraInvalidatedRegions(RegionList &Regions) const;
763740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7647c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual QualType getDeclaredResultType() const;
765740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7663f558af01643787d209a133215b0abec81b5fe30Anna Zaks  /// Check if the selector may have multiple definitions (may have overrides).
7673f558af01643787d209a133215b0abec81b5fe30Anna Zaks  virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
7683f558af01643787d209a133215b0abec81b5fe30Anna Zaks                                        Selector Sel) const;
7693f558af01643787d209a133215b0abec81b5fe30Anna Zaks
770740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
7717c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMessageExpr *getOriginExpr() const {
7728919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMessageExpr>(CallEvent::getOriginExpr());
773cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
7747c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMethodDecl *getDecl() const {
775b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getMethodDecl();
776b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
7777c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const {
778b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumArgs();
779b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
7807c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Expr *getArgExpr(unsigned Index) const {
781b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
782b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
783740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7848919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isInstanceMessage() const {
7858919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->isInstanceMessage();
7868919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7878919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMethodFamily getMethodFamily() const {
7888919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getMethodFamily();
7898919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7908919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  Selector getSelector() const {
7918919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getSelector();
7928919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7938919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7947c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const;
7958919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7960e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Returns the value of the receiver at the time of this call.
797740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getReceiverSVal() const;
798740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
7990e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Get the interface for the receiver.
8000e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  ///
8010e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// This works whether this is an instance message or a class message.
8020e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// However, it currently just uses the static type of the receiver.
803cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  const ObjCInterfaceDecl *getReceiverInterface() const {
804b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getReceiverInterface();
805cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
806cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
80709647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// Returns how the message was written in the source (property access,
80809647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// subscript, or explicit message send).
8098919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMessageKind getMessageKind() const;
8108919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
81109647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// Returns true if this property access or subscript is a setter (has the
81209647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// form of an assignment).
8138919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isSetter() const {
8148919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    switch (getMessageKind()) {
8158919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Message:
8168919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      llvm_unreachable("This is not a pseudo-object access!");
8178919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_PropertyAccess:
8188919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 0;
8198919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Subscript:
8208919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 1;
8218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    }
8228919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    llvm_unreachable("Unknown message kind");
823740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
824740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
825e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  virtual RuntimeDefinition getRuntimeDefinition() const;
826ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
827ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
828ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const;
829ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
830ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_begin() const;
831ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual param_iterator param_end() const;
832b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
8337c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const { return CE_ObjCMessage; }
834b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
835740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
836740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_ObjCMessage;
837740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
838740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
839740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
840972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
841972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// \brief Manages the lifetime of CallEvent objects.
842972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
843972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager provides a way to create arbitrary CallEvents "on the
844972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// stack" as if they were value objects by keeping a cache of CallEvent-sized
845972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// memory blocks. The CallEvents created by CallEventManager are only valid
846972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// for the lifetime of the OwnedCallEvent that holds them; right now these
847972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// objects cannot be copied and ownership cannot be transferred.
848972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEventManager {
849972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  friend class CallEvent;
850972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
851972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  llvm::BumpPtrAllocator &Alloc;
852d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  SmallVector<void *, 8> Cache;
853972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
854972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void reclaim(const void *Memory) {
855972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    Cache.push_back(const_cast<void *>(Memory));
856972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
857972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
858972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns memory that can be initialized as a CallEvent.
859972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void *allocate() {
860972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    if (Cache.empty())
861972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Alloc.Allocate<FunctionCall>();
862972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    else
863972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Cache.pop_back_val();
864972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
865972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
866d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg>
867d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) {
868d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A, St, LCtx);
869d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
870d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
871d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2>
872d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) {
873d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, St, LCtx);
874d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
875d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
876d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2, typename Arg3>
877d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St,
878d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose            const LocationContext *LCtx) {
879d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, A3, St, LCtx);
880d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
881d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
882972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosepublic:
883972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {}
884d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
88557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
88657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  CallEventRef<>
88757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State);
88857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
88957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
890645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CallEventRef<>
891d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getSimpleCall(const CallExpr *E, ProgramStateRef State,
892d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                const LocationContext *LCtx);
893d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
894d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<ObjCMethodCall>
895d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State,
896d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                    const LocationContext *LCtx) {
897d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<ObjCMethodCall>(E, State, LCtx);
898d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
899d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
900d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXConstructorCall>
901d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target,
902d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        ProgramStateRef State, const LocationContext *LCtx) {
903d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXConstructorCall>(E, Target, State, LCtx);
904d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
905d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
906d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXDestructorCall>
907d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
908d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                       const MemRegion *Target, ProgramStateRef State,
909d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                       const LocationContext *LCtx) {
910d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXDestructorCall>(DD, Trigger, Target, State, LCtx);
911d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
912d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
913d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXAllocatorCall>
914d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State,
915d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                      const LocationContext *LCtx) {
916d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXAllocatorCall>(E, State, LCtx);
917d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
918972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose};
919972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
920972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
921972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosetemplate <typename T>
922d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan RoseCallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const {
923972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(isa<T>(*this) && "Cloning to unrelated type");
924972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(sizeof(T) == sizeof(CallEvent) && "Subclasses may not add fields");
925972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
926d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  if (NewState == State)
927d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return cast<T>(this);
928d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
929972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
930972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  T *Copy = static_cast<T *>(Mgr.allocate());
931972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  cloneTo(Copy);
932972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(Copy->getKind() == this->getKind() && "Bad copy");
933972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
934972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Copy->State = NewState;
935972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  return Copy;
936972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
937972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
938972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseinline void CallEvent::Release() const {
939972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(RefCount > 0 && "Reference count is already zero.");
940972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  --RefCount;
941972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
942972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  if (RefCount > 0)
943972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return;
944972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
945972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
946972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Mgr.reclaim(this);
947972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
948972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  this->~CallEvent();
949972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
950972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
951740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento
952740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang
953740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
95457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rosenamespace llvm {
95557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Support isa<>, cast<>, and dyn_cast<> for CallEventRef.
95657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template<class T> struct simplify_type< clang::ento::CallEventRef<T> > {
95757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    typedef const T *SimpleType;
95857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
95957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    static SimpleType
96057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    getSimplifiedValue(const clang::ento::CallEventRef<T>& Val) {
96157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return Val.getPtr();
96257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    }
96357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  };
96457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose}
96557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
966740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif
967