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
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_CALLEVENT_H
18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/DeclCXX.h"
20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprCXX.h"
21740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprObjC.h"
22a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek#include "clang/Analysis/AnalysisContext.h"
2330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "clang/Basic/SourceManager.h"
24de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
25740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
26b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#include "llvm/ADT/PointerIntPair.h"
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include <utility>
28740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
29740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace clang {
3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPoint;
3128038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPointTag;
3228038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
33740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace ento {
34740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
35740d490593e0de8732a697c9f77b90ddd463863bJordan Roseenum CallEventKind {
36740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Function,
37645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXMember,
38645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXMemberOperator,
398d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  CE_CXXDestructor,
40645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember,
41645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_END_CXX_INSTANCE_CALLS = CE_CXXDestructor,
42645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CE_CXXConstructor,
4370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_CXXAllocator,
44740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_FUNCTION_CALLS = CE_Function,
4570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_END_FUNCTION_CALLS = CE_CXXAllocator,
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CE_Block,
478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  CE_ObjCMessage
48740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
50972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEvent;
51d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventManager;
52972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// This class represents a description of a function call using the number of
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// arguments and the name of the function.
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CallDescription {
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  friend CallEvent;
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  mutable IdentifierInfo *II;
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StringRef FuncName;
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  unsigned RequiredArgs;
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic:
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const static unsigned NoArgRequirement = ~0;
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Constructs a CallDescription object.
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// @param FuncName The name of the function that will be matched.
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// @param RequiredArgs The number of arguments that is expected to match a
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// call. Omit this parameter to match every occurance of call with a given
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// name regardless the number of arguments.
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  CallDescription(StringRef FuncName, unsigned RequiredArgs = NoArgRequirement)
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : II(nullptr), FuncName(FuncName), RequiredArgs(RequiredArgs) {}
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Get the name of the function that this object matches.
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  StringRef getFunctionName() const { return FuncName; }
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
77d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosetemplate<typename T = CallEvent>
78d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseclass CallEventRef : public IntrusiveRefCntPtr<const T> {
79d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
80d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef(const T *Call) : IntrusiveRefCntPtr<const T>(Call) {}
81d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef(const CallEventRef &Orig) : IntrusiveRefCntPtr<const T>(Orig) {}
82d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
83d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<T> cloneWithState(ProgramStateRef State) const {
84c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return this->get()->template cloneWithState<T>(State);
85d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
8657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
8757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Allow implicit conversions to a superclass type, since CallEventRef
8857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // behaves like a pointer-to-const.
8957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template <typename SuperT>
9057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  operator CallEventRef<SuperT> () const {
91c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines    return this->get();
9257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  }
93d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose};
94b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
951becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// \class RuntimeDefinition
965960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks/// \brief Defines the runtime definition of the called function.
971becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks///
981becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// Encapsulates the information we have about which Decl will be used
991becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// when the call is executed on the given path. When dealing with dynamic
1001becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// dispatch, the information is based on DynamicTypeInfo and might not be
1011becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks/// precise.
102fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaksclass RuntimeDefinition {
1031becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// The Declaration of the function which could be called at runtime.
1041becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// NULL if not available.
105fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  const Decl *D;
1065960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks
1075960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// The region representing an object (ObjC/C++) on which the method is
1085960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// called. With dynamic dispatch, the method definition depends on the
1091becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// runtime type of this object. NULL when the DynamicTypeInfo is
1101becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// precise.
111fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  const MemRegion *R;
1125960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks
113fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zakspublic:
1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  RuntimeDefinition(): D(nullptr), R(nullptr) {}
1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  RuntimeDefinition(const Decl *InD): D(InD), R(nullptr) {}
116fc05decf08feefd2ffe8cc250219aee6eab3119cAnna Zaks  RuntimeDefinition(const Decl *InD, const MemRegion *InR): D(InD), R(InR) {}
1175960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  const Decl *getDecl() { return D; }
1181becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks
1191becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// \brief Check if the definition we have is precise.
1201becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// If not, it is possible that the call dispatches to another definition at
1211becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// execution time.
1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  bool mayHaveOtherDefinitions() { return R != nullptr; }
1231becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks
1241becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// When other definitions are possible, returns the region whose runtime type
1251becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  /// determines the method definition.
1261becab2120142b1be87d684a68d3bea98f5abfb5Anna Zaks  const MemRegion *getDispatchRegion() { return R; }
127e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks};
128e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks
129740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents an abstract call to a function or method along a
130740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// particular path.
131972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
132972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents are created through the factory methods of CallEventManager.
133972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
134972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEvents should always be cheap to create and destroy. In order for
135972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager to be able to re-use CallEvent-sized memory blocks,
136972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// subclasses of CallEvent may not add any data members to the base class.
137972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// Use the "Data" and "Location" fields instead.
138740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent {
139740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
140740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef CallEventKind Kind;
141740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
142b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseprivate:
1437c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ProgramStateRef State;
1447c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  const LocationContext *LCtx;
145b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  llvm::PointerUnion<const Expr *, const Decl *> Origin;
146b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
1470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  void operator=(const CallEvent &) = delete;
1487c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
149740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
150b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This is user data for subclasses.
151b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const void *Data;
152972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
153972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // This is user data for subclasses.
154972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // This should come right before RefCount, so that the two fields can be
155972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // packed together on LP64 platforms.
156b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceLocation Location;
157b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
158972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprivate:
159972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  mutable unsigned RefCount;
160972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
161972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  template <typename T> friend struct llvm::IntrusiveRefCntPtrInfo;
162972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void Retain() const { ++RefCount; }
163972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void Release() const;
164972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
165972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
166d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
167d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1685204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose  CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx)
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : State(std::move(state)), LCtx(lctx), Origin(E), RefCount(0) {}
170b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
1715204d9e2fe0ea4e4b9c85087e355021c93221764Jordan Rose  CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx)
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      : State(std::move(state)), LCtx(lctx), Origin(D), RefCount(0) {}
173972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
174972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  // DO NOT MAKE PUBLIC
175972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEvent(const CallEvent &Original)
176972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : State(Original.State), LCtx(Original.LCtx), Origin(Original.Origin),
177972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      Data(Original.Data), Location(Original.Location), RefCount(0) {}
178b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
179972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Copies this CallEvent, with vtable intact, into a new block of memory.
180972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  virtual void cloneTo(void *Dest) const = 0;
181972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
182740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Get the value of arbitrary expressions at this point in the path.
183740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getSVal(const Stmt *S) const {
184b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getState()->getSVal(S, getLocationContext());
185740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
186740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
187972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
188658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  typedef SmallVectorImpl<SVal> ValueList;
189740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
190740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Used to specify non-argument regions that will be invalidated as a
191740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// result of this call.
19287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  virtual void getExtraInvalidatedValues(ValueList &Values,
19387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar                 RegionAndSymbolInvalidationTraits *ETraits) const {}
194740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
195740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
1967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual ~CallEvent() {}
1977c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
198b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \brief Returns the kind of call this is.
1997c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual Kind getKind() const = 0;
200b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
201740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the declaration of the function or method that will be
202740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// called. May be null.
2037c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const Decl *getDecl() const {
2047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return Origin.dyn_cast<const Decl *>();
2057c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
2075a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief The state in which the call is being evaluated.
2080a6e09f67c719c318856be19d57e19972101f62cJordan Rose  const ProgramStateRef &getState() const {
2095a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks    return State;
2105a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  }
2115a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
2125a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief The context in which the call is being evaluated.
2135a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  const LocationContext *getLocationContext() const {
2145a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks    return LCtx;
2155a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  }
2165a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
217ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  /// \brief Returns the definition of the function or method that will be
2185960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks  /// called.
219ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  virtual RuntimeDefinition getRuntimeDefinition() const = 0;
220ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
221740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression whose value will be the result of this call.
222740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null.
223b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Expr *getOriginExpr() const {
224b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return Origin.dyn_cast<const Expr *>();
225b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
226740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
227740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the number of arguments (explicit and implicit).
228740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
229740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// Note that this may be greater than the number of parameters in the
230740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// callee's declaration, and that it may include arguments not written in
231740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// the source.
2327c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual unsigned getNumArgs() const = 0;
233740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
234740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if the callee is known to be from a system header.
235740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool isInSystemHeader() const {
236740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    const Decl *D = getDecl();
237740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (!D)
238740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return false;
239740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
240740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    SourceLocation Loc = D->getLocation();
241740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (Loc.isValid()) {
242740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      const SourceManager &SM =
243b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose        getState()->getStateManager().getContext().getSourceManager();
244740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return SM.isInSystemHeader(D->getLocation());
245740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    }
246740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
247740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // Special case for implicitly-declared global operator new/delete.
248740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // These should be considered system functions.
249740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
250740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal();
251740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
252740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
253740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
254740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// \brief Returns true if the CallEvent is a call to a function that matches
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// the CallDescription.
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  ///
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// Note that this function is not intended to be used to match Obj-C method
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  /// calls.
2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  bool isCalled(const CallDescription &CD) const;
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
262de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// \brief Returns a source range for the entire call, suitable for
263de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// outputting in diagnostics.
2647c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getSourceRange() const {
2657c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getSourceRange();
2667c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
267de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose
268740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the value of a given argument at the time of the call.
2697c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SVal getArgSVal(unsigned Index) const;
270740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
271740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression associated with a given argument.
272740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null if this expression does not appear in the source.
2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual const Expr *getArgExpr(unsigned Index) const { return nullptr; }
274740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
275740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the source range for errors associated with this argument.
2767c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ///
277740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be invalid if the argument is not written in the source.
2787c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual SourceRange getArgSourceRange(unsigned Index) const;
279740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
280740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the result type, adjusted for references.
281740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getResultType() const;
282740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
2832f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \brief Returns the return value of the call.
2842f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
2852f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// This should only be called if the CallEvent was created using a state in
2862f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// which the return value has already been bound to the origin expression.
2872f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  SVal getReturnValue() const;
2882f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
28987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns true if the type of any of the non-null arguments satisfies
29087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// the condition.
29187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool hasNonNullArgumentsWithType(bool (*Condition)(QualType)) const;
29287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
293740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if any of the arguments appear to represent callbacks.
294740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool hasNonZeroCallbackArg() const;
295740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
29687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief Returns true if any of the arguments is void*.
29787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool hasVoidPointerToNonConstArg() const;
29887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
29985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// \brief Returns true if any of the arguments are known to escape to long-
30085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// term storage, even if this method will not modify them.
30185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // NOTE: The exact semantics of this are still being defined!
30285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // We don't really want a list of hardcoded exceptions in the long run,
30385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // but we don't want duplicated lists of known APIs in the short term either.
3047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual bool argumentsMayEscape() const {
3057c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return hasNonZeroCallbackArg();
3067c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
30785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
3082f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \brief Returns true if the callee is an externally-visible function in the
3092f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// top-level namespace, such as \c malloc.
3102f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
3112f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// You can use this call to determine that a particular function really is
3122f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// a library function and not, say, a C++ member function with the same name.
3132f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
3142f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// If a name is provided, the function must additionally match the given
3152f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// name.
3162f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
3172f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// Note that this deliberately excludes C++ library functions in the \c std
3182f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// namespace, but will include C library functions accessed through the
3192f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \c std namespace. This also does not check if the function is declared
3202f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// as 'extern "C"', or if it uses C++ name mangling.
3212f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // FIXME: Add a helper for checking namespaces.
3222f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // FIXME: Move this down to AnyFunctionCall once checkers have more
3232f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // precise callbacks.
3242f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  bool isGlobalCFunction(StringRef SpecificName = StringRef()) const;
3252f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
3262f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// \brief Returns the name of the callee, if its name is a simple identifier.
3272f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  ///
3282f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// Note that this will fail for Objective-C methods, blocks, and C++
3292f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// overloaded operators. The former is named by a Selector rather than a
3302f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  /// simple identifier, and the latter two do not have names.
3312f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // FIXME: Move this down to AnyFunctionCall once checkers have more
3322f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  // precise callbacks.
3332f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  const IdentifierInfo *getCalleeIdentifier() const {
3342f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    const NamedDecl *ND = dyn_cast_or_null<NamedDecl>(getDecl());
3352f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    if (!ND)
3366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return nullptr;
3372f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    return ND->getIdentifier();
3382f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  }
3392f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
34028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  /// \brief Returns an appropriate ProgramPoint for this call.
3418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  ProgramPoint getProgramPoint(bool IsPreVisit = false,
3426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                               const ProgramPointTag *Tag = nullptr) const;
34328038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
344740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns a new state with all argument regions invalidated.
345740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
346740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// This accepts an alternate state in case some processing has already
347740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// occurred.
348740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ProgramStateRef invalidateRegions(unsigned BlockCount,
3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                    ProgramStateRef Orig = nullptr) const;
350740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
351ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  typedef std::pair<Loc, SVal> FrameBindingTy;
352ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  typedef SmallVectorImpl<FrameBindingTy> BindingsTy;
353ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
354ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// Populates the given SmallVector with the bindings in the callee's stack
355ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// frame at the start of this call.
356ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  virtual void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
357ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const = 0;
358ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
359972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns a copy of this CallEvent, but using the given state.
360972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  template <typename T>
361d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<T> cloneWithState(ProgramStateRef NewState) const;
362972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
363972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns a copy of this CallEvent, but using the given state.
364d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<> cloneWithState(ProgramStateRef NewState) const {
365972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return cloneWithState<CallEvent>(NewState);
366972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
367972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
3686062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose  /// \brief Returns true if this is a statement is a function or method call
3696062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose  /// of some kind.
3706062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose  static bool isCallStmt(const Stmt *S);
37185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
372962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose  /// \brief Returns the result type of a function or method declaration.
373962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose  ///
374962fbc46664f2486d6805549130fa6b310de6d60Jordan Rose  /// This will return a null QualType if the result type cannot be determined.
37516e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  static QualType getDeclaredResultType(const Decl *D);
37616e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks
3779b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose  /// \brief Returns true if the given decl is known to be variadic.
3789b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose  ///
3799b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose  /// \p D must not be null.
3809b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose  static bool isVariadic(const Decl *D);
3819b072b31ee2f41b8e30d1d22142c9ab72ac5ff1fJordan Rose
382e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  // Iterator access to formal parameters and their types.
383740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprivate:
384740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
385e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
386651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
387651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Return call's formal parameters.
388e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
389e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Remember that the number of formal parameters may not match the number
390e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// of arguments for all calls. However, the first parameter will always
391e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// correspond with the argument value returned by \c getArgSVal(0).
392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  virtual ArrayRef<ParmVarDecl*> parameters() const = 0;
393e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef llvm::mapped_iterator<ArrayRef<ParmVarDecl*>::iterator, get_type_fun>
395740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    param_type_iterator;
396740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
397e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the types of the call's formal parameters.
398e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
399e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// This uses the callee decl found by default name lookup rather than the
400e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// definition because it represents a public interface, and probably has
401e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// more annotations.
402740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_begin() const {
403651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return llvm::map_iterator(parameters().begin(),
404740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                              get_type_fun(&ParmVarDecl::getType));
405740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
406e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_type_begin()
407740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_end() const {
408651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return llvm::map_iterator(parameters().end(),
409651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              get_type_fun(&ParmVarDecl::getType));
410740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
411740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
4120ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose  // For debugging purposes only
413b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  void dump(raw_ostream &Out) const;
414651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void dump() const;
415740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
416740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
417b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
418740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to any sort of function that might have a
419740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// FunctionDecl.
420740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass AnyFunctionCall : public CallEvent {
421740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
422b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Expr *E, ProgramStateRef St,
4237c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
4247c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CallEvent(E, St, LCtx) {}
425b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Decl *D, ProgramStateRef St,
4267c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
4277c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CallEvent(D, St, LCtx) {}
428972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  AnyFunctionCall(const AnyFunctionCall &Other) : CallEvent(Other) {}
429740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
430740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
431b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This function is overridden by subclasses, but they must return
432b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // a FunctionDecl.
433651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FunctionDecl *getDecl() const override {
4347c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return cast<FunctionDecl>(CallEvent::getDecl());
435b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
436740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
437651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RuntimeDefinition getRuntimeDefinition() const override {
438ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    const FunctionDecl *FD = getDecl();
439a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    // Note that the AnalysisDeclContext will have the FunctionDecl with
440a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    // the definition (if one exists).
441a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    if (FD) {
442ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek      AnalysisDeclContext *AD =
443ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek        getLocationContext()->getAnalysisDeclContext()->
444ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek        getManager()->getContext(FD);
445a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek      if (AD->getBody())
446a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek        return RuntimeDefinition(AD->getDecl());
447a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek    }
448a43df9539644bf1c258e12710cd69d79b0b078cdTed Kremenek
449e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks    return RuntimeDefinition();
450ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
451ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
452651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool argumentsMayEscape() const override;
453b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
454651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
455651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    BindingsTy &Bindings) const override;
456ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
457651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<ParmVarDecl *> parameters() const override;
458b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
459740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
460740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
461740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_FUNCTION_CALLS;
462740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
463740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
464740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
465651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Represents a C function or static C++ member function call.
466651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines///
467651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// Example: \c fun()
468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass SimpleFunctionCall : public AnyFunctionCall {
469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  friend class CallEventManager;
470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
471740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SimpleFunctionCall(const CallExpr *CE, ProgramStateRef St,
473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                     const LocationContext *LCtx)
474972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : AnyFunctionCall(CE, St, LCtx) {}
475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SimpleFunctionCall(const SimpleFunctionCall &Other)
476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    : AnyFunctionCall(Other) {}
477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override {
478651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    new (Dest) SimpleFunctionCall(*this);
479651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
480740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
481740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
4827c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CallExpr *getOriginExpr() const {
483b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CallExpr>(AnyFunctionCall::getOriginExpr());
484b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
485740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
486651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FunctionDecl *getDecl() const override;
487740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
488651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
4897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
490651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
491b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
492740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
493740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
494651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_Function; }
495b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
496740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
497740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_Function;
498740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
499740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
500740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
501645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents a call to a block.
502645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose///
503645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// Example: <tt>^{ /* ... */ }()</tt>
504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass BlockCall : public CallEvent {
505645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  friend class CallEventManager;
506645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
507645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseprotected:
508645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  BlockCall(const CallExpr *CE, ProgramStateRef St,
509645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose            const LocationContext *LCtx)
510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    : CallEvent(CE, St, LCtx) {}
511645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
512651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  BlockCall(const BlockCall &Other) : CallEvent(Other) {}
513651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override { new (Dest) BlockCall(*this); }
514645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
51587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void getExtraInvalidatedValues(ValueList &Values,
51687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         RegionAndSymbolInvalidationTraits *ETraits) const override;
517645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
518645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic:
519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  virtual const CallExpr *getOriginExpr() const {
520651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return cast<CallExpr>(CallEvent::getOriginExpr());
521651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
523651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
524651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
525651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
526651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return getOriginExpr()->getArg(Index);
527651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
528651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
529645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Returns the region associated with this instance of the block.
530645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  ///
531645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// This may be NULL if the block's origin is unknown.
532645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const BlockDataRegion *getBlockRegion() const;
533645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
534651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const BlockDecl *getDecl() const override {
535645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    const BlockDataRegion *BR = getBlockRegion();
536645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    if (!BR)
5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return nullptr;
538645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return BR->getDecl();
539645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
540645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
54187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  bool isConversionFromLambda() const {
54287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const BlockDecl *BD = getDecl();
54387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (!BD)
54487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return false;
54587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
54687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return BD->isConversionFromLambda();
54787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
54887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
54987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// \brief For a block converted from a C++ lambda, returns the block
55087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  /// VarRegion for the variable holding the captured C++ lambda record.
55187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  const VarRegion *getRegionStoringCapturedLambda() const {
55287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    assert(isConversionFromLambda());
55387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const BlockDataRegion *BR = getBlockRegion();
55487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    assert(BR && "Block converted from lambda must have a block region");
55587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
55687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    auto I = BR->referenced_vars_begin();
55787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    assert(I != BR->referenced_vars_end());
55887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
55987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return I.getCapturedRegion();
56087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
56187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RuntimeDefinition getRuntimeDefinition() const override {
56387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    if (!isConversionFromLambda())
56487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar      return RuntimeDefinition(getDecl());
56587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
56687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Clang converts lambdas to blocks with an implicit user-defined
56787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // conversion operator method on the lambda record that looks (roughly)
56887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // like:
56987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //
57087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // typedef R(^block_type)(P1, P2, ...);
57187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // operator block_type() const {
57287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //   auto Lambda = *this;
57387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //   return ^(P1 p1, P2 p2, ...){
57487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //     /* return Lambda(p1, p2, ...); */
57587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //   };
57687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // }
57787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //
57887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Here R is the return type of the lambda and P1, P2, ... are
57987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // its parameter types. 'Lambda' is a fake VarDecl captured by the block
58087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // that is initialized to a copy of the lambda.
58187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    //
58287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // Sema leaves the body of a lambda-converted block empty (it is
58387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // produced by CodeGen), so we can't analyze it directly. Instead, we skip
58487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    // the block body and analyze the operator() method on the captured lambda.
58587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const VarDecl *LambdaVD = getRegionStoringCapturedLambda()->getDecl();
58687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    const CXXRecordDecl *LambdaDecl = LambdaVD->getType()->getAsCXXRecordDecl();
58787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    CXXMethodDecl* LambdaCallOperator = LambdaDecl->getLambdaCallOperator();
58887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
58987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    return RuntimeDefinition(LambdaCallOperator);
590645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
591645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool argumentsMayEscape() const override {
593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return true;
594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
595645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    BindingsTy &Bindings) const override;
598645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<ParmVarDecl*> parameters() const override;
600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_Block; }
602645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
603645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  static bool classof(const CallEvent *CA) {
604645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return CA->getKind() == CE_Block;
605645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
606645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose};
607645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
608c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how
609c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written.
610645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXInstanceCall : public AnyFunctionCall {
611740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
61287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void getExtraInvalidatedValues(ValueList &Values,
61387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         RegionAndSymbolInvalidationTraits *ETraits) const override;
614740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
615c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CXXInstanceCall(const CallExpr *CE, ProgramStateRef St,
6167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose                  const LocationContext *LCtx)
617645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {}
618645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXInstanceCall(const FunctionDecl *D, ProgramStateRef St,
619645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose                  const LocationContext *LCtx)
620645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : AnyFunctionCall(D, St, LCtx) {}
621645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
622c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
623645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXInstanceCall(const CXXInstanceCall &Other) : AnyFunctionCall(Other) {}
624972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
625c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic:
6269da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  /// \brief Returns the expression representing the implicit 'this' object.
6276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  virtual const Expr *getCXXThisExpr() const { return nullptr; }
6289da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose
629ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
6306ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  virtual SVal getCXXThisVal() const;
631ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
632651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FunctionDecl *getDecl() const override;
633645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
634651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RuntimeDefinition getRuntimeDefinition() const override;
635c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
636651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    BindingsTy &Bindings) const override;
638ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
639c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  static bool classof(const CallEvent *CA) {
640c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS &&
641c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose           CA->getKind() <= CE_END_CXX_INSTANCE_CALLS;
642c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  }
643c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose};
644c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
645c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call.
646c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose///
647c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun()
648c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall {
649d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
650972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
651d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
652740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St,
653c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose                const LocationContext *LCtx)
6547c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
655740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
656d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberCall(const CXXMemberCall &Other) : CXXInstanceCall(Other) {}
657651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override { new (Dest) CXXMemberCall(*this); }
658d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
659d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
6607c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXMemberCallExpr *getOriginExpr() const {
661645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return cast<CXXMemberCallExpr>(CXXInstanceCall::getOriginExpr());
662645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
663645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override {
665645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    if (const CallExpr *CE = getOriginExpr())
666645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose      return CE->getNumArgs();
667645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return 0;
668645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  }
669645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
671645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return getOriginExpr()->getArg(Index);
672740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
673740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getCXXThisExpr() const override;
6757c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RuntimeDefinition getRuntimeDefinition() const override;
677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_CXXMember; }
679e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
680740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
681740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXMember;
682740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
683740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
684740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
685fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is
686fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function.
687fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose///
688fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt>
689c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall {
690d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
691d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
692972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseprotected:
693d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St,
694d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        const LocationContext *LCtx)
695d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CXXInstanceCall(CE, St, LCtx) {}
696d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
697972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CXXMemberOperatorCall(const CXXMemberOperatorCall &Other)
698972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    : CXXInstanceCall(Other) {}
699651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override {
700972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    new (Dest) CXXMemberOperatorCall(*this);
701972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
702972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
703fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic:
7047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXOperatorCallExpr *getOriginExpr() const {
705645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return cast<CXXOperatorCallExpr>(CXXInstanceCall::getOriginExpr());
706fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
707fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
708651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override {
7097c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return getOriginExpr()->getNumArgs() - 1;
7107c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
712fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return getOriginExpr()->getArg(Index + 1);
713fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
714fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getCXXThisExpr() const override;
7167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_CXXMemberOperator; }
718e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
719fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  static bool classof(const CallEvent *CA) {
720fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return CA->getKind() == CE_CXXMemberOperator;
721fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
722fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose};
723fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
724645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// \brief Represents an implicit call to a C++ destructor.
725740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
726645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// This can occur at the end of a scope (for automatic objects), at the end
727645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose/// of a full-expression (for temporaries), or as part of a delete.
728645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseclass CXXDestructorCall : public CXXInstanceCall {
729d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
730d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
731740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
732200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  typedef llvm::PointerIntPair<const MemRegion *, 1, bool> DtorDataTy;
733200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
734645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// Creates an implicit destructor.
73569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
736645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param DD The destructor that will be called.
737645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param Trigger The statement whose completion causes this destructor call.
738645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param Target The object region to be destructed.
739645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param St The path-sensitive state at this point in the program.
740645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \param LCtx The location context at this point in the program.
741645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
742200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                    const MemRegion *Target, bool IsBaseDestructor,
743200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                    ProgramStateRef St, const LocationContext *LCtx)
744645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    : CXXInstanceCall(DD, St, LCtx) {
745200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    Data = DtorDataTy(Target, IsBaseDestructor).getOpaqueValue();
746645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    Location = Trigger->getLocEnd();
747740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
748740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
749645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CXXDestructorCall(const CXXDestructorCall &Other) : CXXInstanceCall(Other) {}
750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override {new (Dest) CXXDestructorCall(*this);}
751ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
752645baeed6800f952e9ad1d5666e01080385531a2Jordan Rosepublic:
753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceRange getSourceRange() const override { return Location; }
754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override { return 0; }
755ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RuntimeDefinition getRuntimeDefinition() const override;
757200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
758645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SVal getCXXThisVal() const override;
760b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
761200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  /// Returns true if this is a call to a base class destructor.
762200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  bool isBaseDestructor() const {
763200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return DtorDataTy::getFromOpaqueValue(Data).getInt();
764200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  }
765200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_CXXDestructor; }
767b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
768740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
769645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return CA->getKind() == CE_CXXDestructor;
770740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
771740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
772740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
773740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor.
774740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
775740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1)
776740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall {
777d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
778b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
779d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
780d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// Creates a constructor call.
781d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///
782d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param CE The constructor expression as written in the source.
783d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param Target The region where the object should be constructed. If NULL,
784d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ///               a new symbolic region will be used.
785d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param St The path-sensitive state at this point in the program.
786d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  /// \param LCtx The location context at this point in the program.
78770517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko  CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *Target,
788740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                     ProgramStateRef St, const LocationContext *LCtx)
7897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(CE, St, LCtx) {
79070517ca5c07c4b41ff8662b94ee22047b0299f8cDmitri Gribenko    Data = Target;
791b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
792740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
793d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXConstructorCall(const CXXConstructorCall &Other) : AnyFunctionCall(Other){}
794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override { new (Dest) CXXConstructorCall(*this); }
795d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
79687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void getExtraInvalidatedValues(ValueList &Values,
79787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         RegionAndSymbolInvalidationTraits *ETraits) const override;
798d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
799d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
8007c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXConstructExpr *getOriginExpr() const {
801b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr());
802b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
803b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const CXXConstructorDecl *getDecl() const override {
805b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getConstructor();
806740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
807740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override { return getOriginExpr()->getNumArgs(); }
809740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
811b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
812740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
813740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
814ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  /// \brief Returns the value of the implicit 'this' object.
815645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  SVal getCXXThisVal() const;
8167c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    BindingsTy &Bindings) const override;
819ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_CXXConstructor; }
821e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
822740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
823740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXConstructor;
824740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
825740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
826740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
8270e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression.
8280e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose///
8290e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new".
83070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall {
831d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
832972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
833d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Roseprotected:
834b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St,
83570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose                   const LocationContext *LCtx)
8367c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    : AnyFunctionCall(E, St, LCtx) {}
83770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
838d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CXXAllocatorCall(const CXXAllocatorCall &Other) : AnyFunctionCall(Other) {}
839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override { new (Dest) CXXAllocatorCall(*this); }
840d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
841d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rosepublic:
8427c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const CXXNewExpr *getOriginExpr() const {
843b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr());
844b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
845b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const FunctionDecl *getDecl() const override {
847b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getOperatorNew();
84870cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
84970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override {
851b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumPlacementArgs() + 1;
852b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
85370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
85570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    // The first argument of an allocator call is the size of the allocation.
85670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    if (Index == 0)
8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return nullptr;
858b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getPlacementArg(Index - 1);
85970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
86070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_CXXAllocator; }
862b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
86370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  static bool classof(const CallEvent *CE) {
86470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    return CE->getKind() == CE_CXXAllocator;
86570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
86670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose};
86770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
8688919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur.
8698919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose//
8708919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not
8718919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits.
8728919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind {
8738919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_PropertyAccess,
8748919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Subscript,
8758919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Message
8768919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose};
8778919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
878cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method.
8798919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose///
8808919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind.
881cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent {
882d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  friend class CallEventManager;
883d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
8848919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  const PseudoObjectExpr *getContainingPseudoObjectExpr() const;
885cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
8868919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected:
887d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St,
888d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                 const LocationContext *LCtx)
889d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    : CallEvent(Msg, St, LCtx) {
8906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Data = nullptr;
891d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
892d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
893972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  ObjCMethodCall(const ObjCMethodCall &Other) : CallEvent(Other) {}
894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void cloneTo(void *Dest) const override { new (Dest) ObjCMethodCall(*this); }
895972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
89687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  void getExtraInvalidatedValues(ValueList &Values,
89787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar         RegionAndSymbolInvalidationTraits *ETraits) const override;
898740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
8993f558af01643787d209a133215b0abec81b5fe30Anna Zaks  /// Check if the selector may have multiple definitions (may have overrides).
9003f558af01643787d209a133215b0abec81b5fe30Anna Zaks  virtual bool canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
9013f558af01643787d209a133215b0abec81b5fe30Anna Zaks                                        Selector Sel) const;
9023f558af01643787d209a133215b0abec81b5fe30Anna Zaks
903740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
9047c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  virtual const ObjCMessageExpr *getOriginExpr() const {
9058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMessageExpr>(CallEvent::getOriginExpr());
906cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const ObjCMethodDecl *getDecl() const override {
908b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getMethodDecl();
909b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getNumArgs() const override {
911b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumArgs();
912b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Expr *getArgExpr(unsigned Index) const override {
914b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
915b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
916740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
9178919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isInstanceMessage() const {
9188919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->isInstanceMessage();
9198919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
9208919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMethodFamily getMethodFamily() const {
9218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getMethodFamily();
9228919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
9238919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  Selector getSelector() const {
9248919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getSelector();
9258919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
9268919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SourceRange getSourceRange() const override;
9288919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
9290e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Returns the value of the receiver at the time of this call.
930740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getReceiverSVal() const;
931740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
9325a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief Return the value of 'self' if available.
9335a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  SVal getSelfSVal() const;
9345a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
9350e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Get the interface for the receiver.
9360e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  ///
9370e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// This works whether this is an instance message or a class message.
9380e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// However, it currently just uses the static type of the receiver.
939cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  const ObjCInterfaceDecl *getReceiverInterface() const {
940b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getReceiverInterface();
941cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
942cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
9435a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  /// \brief Checks if the receiver refers to 'self' or 'super'.
9445a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  bool isReceiverSelfOrSuper() const;
9455a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
94609647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// Returns how the message was written in the source (property access,
94709647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// subscript, or explicit message send).
9488919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMessageKind getMessageKind() const;
9498919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
95009647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// Returns true if this property access or subscript is a setter (has the
95109647f28d7955d0c948ebbbb376a46844056f11aJordan Rose  /// form of an assignment).
9528919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isSetter() const {
9538919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    switch (getMessageKind()) {
9548919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Message:
9558919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      llvm_unreachable("This is not a pseudo-object access!");
9568919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_PropertyAccess:
9578919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 0;
9588919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Subscript:
9598919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 1;
9608919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    }
9618919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    llvm_unreachable("Unknown message kind");
962740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
963740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
9644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Returns the property accessed by this method, either explicitly via
9654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // property syntax or implicitly via a getter or setter method. Returns
9664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // nullptr if the call is not a prooperty access.
9674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const ObjCPropertyDecl *getAccessedProperty() const;
9684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  RuntimeDefinition getRuntimeDefinition() const override;
970ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool argumentsMayEscape() const override;
972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    BindingsTy &Bindings) const override;
975ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
976651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ArrayRef<ParmVarDecl*> parameters() const override;
977b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
978651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Kind getKind() const override { return CE_ObjCMessage; }
979b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
980740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
981740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_ObjCMessage;
982740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
983740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
984740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
985972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
986972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// \brief Manages the lifetime of CallEvent objects.
987972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose///
988972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// CallEventManager provides a way to create arbitrary CallEvents "on the
989972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// stack" as if they were value objects by keeping a cache of CallEvent-sized
990972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// memory blocks. The CallEvents created by CallEventManager are only valid
991972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// for the lifetime of the OwnedCallEvent that holds them; right now these
992972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose/// objects cannot be copied and ownership cannot be transferred.
993972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseclass CallEventManager {
994972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  friend class CallEvent;
995972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
996972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  llvm::BumpPtrAllocator &Alloc;
997d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  SmallVector<void *, 8> Cache;
998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  typedef SimpleFunctionCall CallEventTemplateTy;
999972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1000972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void reclaim(const void *Memory) {
1001972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    Cache.push_back(const_cast<void *>(Memory));
1002972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
1003972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1004972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  /// Returns memory that can be initialized as a CallEvent.
1005972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  void *allocate() {
1006972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    if (Cache.empty())
1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return Alloc.Allocate<CallEventTemplateTy>();
1008972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    else
1009972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose      return Cache.pop_back_val();
1010972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  }
1011972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1012d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg>
1013d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg A, ProgramStateRef St, const LocationContext *LCtx) {
1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  "CallEvent subclasses are not all the same size");
1016d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A, St, LCtx);
1017d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1018d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1019d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2>
1020d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, ProgramStateRef St, const LocationContext *LCtx) {
1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  "CallEvent subclasses are not all the same size");
1023d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, St, LCtx);
1024d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1025d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1026d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  template <typename T, typename Arg1, typename Arg2, typename Arg3>
1027d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  T *create(Arg1 A1, Arg2 A2, Arg3 A3, ProgramStateRef St,
1028d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose            const LocationContext *LCtx) {
1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  "CallEvent subclasses are not all the same size");
1031d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return new (allocate()) T(A1, A2, A3, St, LCtx);
1032d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1033d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1034200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  template <typename T, typename Arg1, typename Arg2, typename Arg3,
1035200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose            typename Arg4>
1036200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  T *create(Arg1 A1, Arg2 A2, Arg3 A3, Arg4 A4, ProgramStateRef St,
1037200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose            const LocationContext *LCtx) {
1038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static_assert(sizeof(T) == sizeof(CallEventTemplateTy),
1039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                  "CallEvent subclasses are not all the same size");
1040200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return new (allocate()) T(A1, A2, A3, A4, St, LCtx);
1041200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  }
1042200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
1043972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosepublic:
1044972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager(llvm::BumpPtrAllocator &alloc) : Alloc(alloc) {}
1045d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
104657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
104757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  CallEventRef<>
104857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  getCaller(const StackFrameContext *CalleeCtx, ProgramStateRef State);
104957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
105057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
1051645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  CallEventRef<>
1052d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getSimpleCall(const CallExpr *E, ProgramStateRef State,
1053d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                const LocationContext *LCtx);
1054d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1055d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<ObjCMethodCall>
1056d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getObjCMethodCall(const ObjCMessageExpr *E, ProgramStateRef State,
1057d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                    const LocationContext *LCtx) {
1058d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<ObjCMethodCall>(E, State, LCtx);
1059d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1060d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1061d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXConstructorCall>
1062d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXConstructorCall(const CXXConstructExpr *E, const MemRegion *Target,
1063d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                        ProgramStateRef State, const LocationContext *LCtx) {
1064d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXConstructorCall>(E, Target, State, LCtx);
1065d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1066d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1067d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXDestructorCall>
1068d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
1069200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                       const MemRegion *Target, bool IsBase,
1070200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose                       ProgramStateRef State, const LocationContext *LCtx) {
1071200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return create<CXXDestructorCall>(DD, Trigger, Target, IsBase, State, LCtx);
1072d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1073d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1074d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  CallEventRef<CXXAllocatorCall>
1075d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  getCXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef State,
1076d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                      const LocationContext *LCtx) {
1077d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXAllocatorCall>(E, State, LCtx);
1078d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
1079972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose};
1080972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1081972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1082972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rosetemplate <typename T>
1083d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan RoseCallEventRef<T> CallEvent::cloneWithState(ProgramStateRef NewState) const {
1084972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(isa<T>(*this) && "Cloning to unrelated type");
1085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static_assert(sizeof(T) == sizeof(CallEvent),
1086651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                "Subclasses may not add fields");
1087972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1088d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  if (NewState == State)
1089d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return cast<T>(this);
1090d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
1091972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
1092972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  T *Copy = static_cast<T *>(Mgr.allocate());
1093972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  cloneTo(Copy);
1094972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(Copy->getKind() == this->getKind() && "Bad copy");
1095972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1096972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Copy->State = NewState;
1097972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  return Copy;
1098972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
1099972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1100972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Roseinline void CallEvent::Release() const {
1101972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  assert(RefCount > 0 && "Reference count is already zero.");
1102972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  --RefCount;
1103972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1104972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  if (RefCount > 0)
1105972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose    return;
1106972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1107972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  CallEventManager &Mgr = State->getStateManager().getCallEventManager();
1108972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  Mgr.reclaim(this);
1109972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1110972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose  this->~CallEvent();
1111972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose}
1112972a3680bdd95f2e9d6316b391f1c47513dc78ccJordan Rose
1113740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento
1114740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang
1115740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
111657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rosenamespace llvm {
111757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Support isa<>, cast<>, and dyn_cast<> for CallEventRef.
111857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  template<class T> struct simplify_type< clang::ento::CallEventRef<T> > {
111957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    typedef const T *SimpleType;
112057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
112157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    static SimpleType
112294cf910ac2d1719c1dfc163bbec3953f12efdf6fRafael Espindola    getSimplifiedValue(clang::ento::CallEventRef<T> Val) {
1123c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines      return Val.get();
112457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    }
112557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  };
112657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose}
112757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
1128740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif
1129