CallEvent.h revision f540c54701e3eeb34cb619a3a4eb18f1ac70ef2d
1f540c54701e3eeb34cb619a3a4eb18f1ac70ef2dJordan Rose//===- CallEvent.h - Wrapper for all function and method calls ----*- C++ -*--//
2740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
3740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//                     The LLVM Compiler Infrastructure
4740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
5740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// This file is distributed under the University of Illinois Open Source
6740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// License. See LICENSE.TXT for details.
7740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
8740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===//
9740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
10740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \file This file defines CallEvent and its subclasses, which represent path-
11740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// sensitive instances of different kinds of function and method calls
12740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// (C, C++, and Objective-C).
13740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//
14740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===----------------------------------------------------------------------===//
15740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
16740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#ifndef LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL
17740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#define LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_CALL
18740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
19740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/Basic/SourceManager.h"
20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/DeclCXX.h"
21740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprCXX.h"
22740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/AST/ExprObjC.h"
23de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
24740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
25b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#include "llvm/ADT/PointerIntPair.h"
26740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
27740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace clang {
2828038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPoint;
2928038f33aa2db4833881fea757a1f0daf85ac02bJordan Roseclass ProgramPointTag;
3028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
31740d490593e0de8732a697c9f77b90ddd463863bJordan Rosenamespace ento {
32740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
33740d490593e0de8732a697c9f77b90ddd463863bJordan Roseenum CallEventKind {
34740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Function,
35740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_CXXMember,
36fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  CE_CXXMemberOperator,
37c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CE_BEG_CXX_INSTANCE_CALLS = CE_CXXMember,
38c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CE_END_CXX_INSTANCE_CALLS = CE_CXXMemberOperator,
39740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_Block,
40740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_SIMPLE_CALLS = CE_Function,
41740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_END_SIMPLE_CALLS = CE_Block,
42740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_CXXConstructor,
438d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  CE_CXXDestructor,
4470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_CXXAllocator,
45740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CE_BEG_FUNCTION_CALLS = CE_Function,
4670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  CE_END_FUNCTION_CALLS = CE_CXXAllocator,
478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  CE_ObjCMessage
48740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
50b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
51740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents an abstract call to a function or method along a
52740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// particular path.
53740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CallEvent {
54740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
55740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef CallEventKind Kind;
56740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
57b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseprivate:
58b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // PointerIntPair doesn't respect IntrusiveRefCntPtr, so we have to manually
59b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // retain and release the state.
60b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  llvm::PointerIntPair<const ProgramState *, 2> State;
61b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  llvm::PointerIntPair<const LocationContext *, 2> LCtx;
62b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  llvm::PointerUnion<const Expr *, const Decl *> Origin;
63b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
64740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
65b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This is user data for subclasses.
66b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const void *Data;
67b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceLocation Location;
68b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
69b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CallEvent(const Expr *E, ProgramStateRef state, const LocationContext *lctx,
70b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose            Kind k)
71b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : State(state.getPtr(), (k & 0x3)),
72b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose      LCtx(lctx, ((k >> 2) & 0x3)),
73b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose      Origin(E) {
74b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    IntrusiveRefCntPtrInfo<const ProgramState>::retain(getState());
75b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    assert(k == getKind() && "More kinds than bits in the PointerIntPairs.");
76b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
77b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
78b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CallEvent(const Decl *D, ProgramStateRef state, const LocationContext *lctx,
79b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose            Kind k)
80b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : State(state.getPtr(), (k & 0x3)),
81b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose      LCtx(lctx, ((k >> 2) & 0x3)),
82b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose      Origin(D) {
83b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    IntrusiveRefCntPtrInfo<const ProgramState>::retain(getState());
84b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    assert(k == getKind() && "More kinds than bits in the PointerIntPairs.");
85b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
86b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
87b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const ProgramState *getState() const {
88b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return State.getPointer();
89b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
90b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
91b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const LocationContext *getLocationContext() const {
92b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return LCtx.getPointer();
93b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
94b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
95b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  ~CallEvent() {
96b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    IntrusiveRefCntPtrInfo<const ProgramState>::release(getState());
97b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
98740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
99740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
100740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Get the value of arbitrary expressions at this point in the path.
101740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getSVal(const Stmt *S) const {
102b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getState()->getSVal(S, getLocationContext());
103740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
104740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
105740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef SmallVectorImpl<const MemRegion *> RegionList;
106740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
107740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Used to specify non-argument regions that will be invalidated as a
108740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// result of this call.
1094b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const;
110740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
111b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  QualType getDeclaredResultType() const;
112740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
113740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
114b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \brief Returns the kind of call this is.
115b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  Kind getKind() const {
116b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return static_cast<Kind>((State.getInt()) | (LCtx.getInt() << 2));
117b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
118b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
119740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the declaration of the function or method that will be
120740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// called. May be null.
121b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Decl *getDecl() const;
122740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
123ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  /// \brief Returns the definition of the function or method that will be
1249dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  /// called. Returns NULL if the definition cannot be found; ex: due to
1259dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  /// dynamic dispatch in ObjC methods.
1269dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  const Decl *getRuntimeDefinition() const;
127ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
128740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression whose value will be the result of this call.
129740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null.
130b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Expr *getOriginExpr() const {
131b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return Origin.dyn_cast<const Expr *>();
132b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
133740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
134740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the number of arguments (explicit and implicit).
135740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
136740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// Note that this may be greater than the number of parameters in the
137740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// callee's declaration, and that it may include arguments not written in
138740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// the source.
139b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  unsigned getNumArgs() const;
140740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
141740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if the callee is known to be from a system header.
142740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool isInSystemHeader() const {
143740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    const Decl *D = getDecl();
144740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (!D)
145740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return false;
146740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
147740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    SourceLocation Loc = D->getLocation();
148740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (Loc.isValid()) {
149740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      const SourceManager &SM =
150b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose        getState()->getStateManager().getContext().getSourceManager();
151740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return SM.isInSystemHeader(D->getLocation());
152740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    }
153740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
154740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // Special case for implicitly-declared global operator new/delete.
155740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    // These should be considered system functions.
156740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
157740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal();
158740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
159740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
160740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
161740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
162de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// \brief Returns a source range for the entire call, suitable for
163de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose  /// outputting in diagnostics.
164b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getSourceRange() const;
165de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose
166740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the value of a given argument at the time of the call.
167b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getArgSVal(unsigned Index) const;
168740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
169740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the expression associated with a given argument.
170740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be null if this expression does not appear in the source.
171b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Expr *getArgExpr(unsigned Index) const;
172740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
173740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the source range for errors associated with this argument.
174740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// May be invalid if the argument is not written in the source.
175740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // FIXME: Is it better to return an invalid range or the range of the origin
176740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // expression?
177b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getArgSourceRange(unsigned Index) const;
178740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
179740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns the result type, adjusted for references.
180740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getResultType() const;
181740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
182e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \brief Returns the value of the implicit 'this' object, or UndefinedVal if
183e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// this is not a C++ member function call.
184b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getCXXThisVal() const;
185e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
186740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns true if any of the arguments appear to represent callbacks.
187740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  bool hasNonZeroCallbackArg() const;
188740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
18985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// \brief Returns true if any of the arguments are known to escape to long-
19085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// term storage, even if this method will not modify them.
19185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // NOTE: The exact semantics of this are still being defined!
19285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // We don't really want a list of hardcoded exceptions in the long run,
19385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // but we don't want duplicated lists of known APIs in the short term either.
194b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  bool argumentsMayEscape() const;
19585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
19628038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  /// \brief Returns an appropriate ProgramPoint for this call.
1978d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  ProgramPoint getProgramPoint(bool IsPreVisit = false,
19828038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose                               const ProgramPointTag *Tag = 0) const;
19928038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
200740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// \brief Returns a new state with all argument regions invalidated.
201740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ///
202740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// This accepts an alternate state in case some processing has already
203740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  /// occurred.
204740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  ProgramStateRef invalidateRegions(unsigned BlockCount,
205740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                                    ProgramStateRef Orig = 0) const;
206740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
20785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// \brief Returns true if this is a statement that can be considered for
20885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  /// inlining.
20985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  static bool mayBeInlined(const Stmt *S);
21085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
211e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  // Iterator access to formal parameters and their types.
212740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprivate:
213740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
214740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
215740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
216e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  typedef const ParmVarDecl * const *param_iterator;
217e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
218e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the call's formal parameters.
219e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
220e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// If UseDefinitionParams is set, this will return the parameter decls
221e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// used in the callee's definition (suitable for inlining). Most of the
222e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// time it is better to use the decl found by name lookup, which likely
223e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// carries more annotations.
224e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
225e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Remember that the number of formal parameters may not match the number
226e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// of arguments for all calls. However, the first parameter will always
227e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// correspond with the argument value returned by \c getArgSVal(0).
228e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
229e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// If the call has no accessible declaration (or definition, if
230e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \p UseDefinitionParams is set), \c param_begin() will be equal to
231e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \c param_end().
232b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_begin(bool UseDefinitionParams = false) const;
233e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_begin()
234b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_end(bool UseDefinitionParams = false) const;
235e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
236740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  typedef llvm::mapped_iterator<param_iterator, get_type_fun>
237740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    param_type_iterator;
238740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
239e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// Returns an iterator over the types of the call's formal parameters.
240e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  ///
241e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// This uses the callee decl found by default name lookup rather than the
242e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// definition because it represents a public interface, and probably has
243e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// more annotations.
244740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_begin() const {
245740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return llvm::map_iterator(param_begin(),
246740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                              get_type_fun(&ParmVarDecl::getType));
247740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
248e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  /// \sa param_type_begin()
249740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  param_type_iterator param_type_end() const {
250740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return llvm::map_iterator(param_end(), get_type_fun(&ParmVarDecl::getType));
251740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
252740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
2530ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose  // For debugging purposes only
254b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  void dump(raw_ostream &Out) const;
2550ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose  LLVM_ATTRIBUTE_USED void dump() const { dump(llvm::errs()); }
2560ffbfd1a7f80f9a3c07317cb8f44c562f2ba1ba5Jordan Rose
257740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *) { return true; }
258740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
259740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
260b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
261740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to any sort of function that might have a
262740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// FunctionDecl.
263740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass AnyFunctionCall : public CallEvent {
264b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  friend class CallEvent;
265b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
266740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
267b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Expr *E, ProgramStateRef St,
268b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose                  const LocationContext *LCtx, Kind K)
269b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : CallEvent(E, St, LCtx, K) {}
270b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  AnyFunctionCall(const Decl *D, ProgramStateRef St,
271b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose                  const LocationContext *LCtx, Kind K)
272b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : CallEvent(D, St, LCtx, K) {}
273740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
274b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // Most function calls have no extra invalidated regions.
2754b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const {}
276740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
277740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getDeclaredResultType() const;
278740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
279740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
280b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // This function is overridden by subclasses, but they must return
281b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // a FunctionDecl.
282b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const FunctionDecl *getDecl() const {
283b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast_or_null<FunctionDecl>(CallEvent::getDecl());
284b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
285740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
2869dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  const Decl *getRuntimeDefinition() const {
287ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    const FunctionDecl *FD = getDecl();
288ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    // Note that hasBody() will fill FD with the definition FunctionDecl.
289ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    if (FD && FD->hasBody(FD))
290ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose      return FD;
291ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    return 0;
292ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
293ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
29485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  bool argumentsMayEscape() const;
29585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
296b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getArgSVal(unsigned Index) const;
297b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getArgSourceRange(unsigned Index) const;
298b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
299b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_begin(bool UseDefinitionParams = false) const;
300b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_end(bool UseDefinitionParams = false) const;
301b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
302740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
303740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_FUNCTION_CALLS &&
304740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_FUNCTION_CALLS;
305740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
306740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
307740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
308740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a written as a CallExpr.
309740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass SimpleCall : public AnyFunctionCall {
310740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
311b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SimpleCall(const CallExpr *CE, ProgramStateRef St,
312740d490593e0de8732a697c9f77b90ddd463863bJordan Rose             const LocationContext *LCtx, Kind K)
313b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : AnyFunctionCall(CE, St, LCtx, K) {
314740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
315740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
316740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
317b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const CallExpr *getOriginExpr() const {
318b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CallExpr>(AnyFunctionCall::getOriginExpr());
319b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
320740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
321740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const FunctionDecl *getDecl() const;
322740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
323b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
324b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getSourceRange() const {
325b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getSourceRange();
326b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
327740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
328740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const Expr *getArgExpr(unsigned Index) const {
329b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
330740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
331740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
332740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
333740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() >= CE_BEG_SIMPLE_CALLS &&
334740d490593e0de8732a697c9f77b90ddd463863bJordan Rose           CA->getKind() <= CE_END_SIMPLE_CALLS;
335740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
336740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
337740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
338740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a C function or static C++ member function call.
339740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
340740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c fun()
341740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass FunctionCall : public SimpleCall {
342740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
343740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  FunctionCall(const CallExpr *CE, ProgramStateRef St,
344740d490593e0de8732a697c9f77b90ddd463863bJordan Rose               const LocationContext *LCtx)
345740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    : SimpleCall(CE, St, LCtx, CE_Function) {}
346740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
347b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getCXXThisVal() const { return UndefinedVal(); }
348b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
349740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
350740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_Function;
351740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
352740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
353740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
354c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call, no matter how
355c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// it is written.
356c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXInstanceCall : public SimpleCall {
357b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  friend class CallEvent;
358b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
359740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
3604b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const;
361740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
362c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  CXXInstanceCall(const CallExpr *CE, ProgramStateRef St,
363c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose                  const LocationContext *LCtx, Kind K)
364c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    : SimpleCall(CE, St, LCtx, K) {}
365c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
366c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rosepublic:
3679dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  const Decl *getRuntimeDefinition() const;
368c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
369c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  static bool classof(const CallEvent *CA) {
370c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    return CA->getKind() >= CE_BEG_CXX_INSTANCE_CALLS &&
371c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose           CA->getKind() <= CE_END_CXX_INSTANCE_CALLS;
372c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  }
373c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose};
374c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
375c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// \brief Represents a non-static C++ member function call.
376c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose///
377c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose/// Example: \c obj.fun()
378c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberCall : public CXXInstanceCall {
379740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
380740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  CXXMemberCall(const CXXMemberCallExpr *CE, ProgramStateRef St,
381c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose                const LocationContext *LCtx)
382c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    : CXXInstanceCall(CE, St, LCtx, CE_CXXMember) {}
383740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
384740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const CXXMemberCallExpr *getOriginExpr() const {
385740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return cast<CXXMemberCallExpr>(SimpleCall::getOriginExpr());
386740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
387740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
388e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  SVal getCXXThisVal() const;
389e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
390740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
391740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXMember;
392740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
393740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
394740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
395fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// \brief Represents a C++ overloaded operator call where the operator is
396fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// implemented as a non-static member function.
397fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose///
398fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>iter + 1</tt>
399c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Roseclass CXXMemberOperatorCall : public CXXInstanceCall {
400fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rosepublic:
401fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  CXXMemberOperatorCall(const CXXOperatorCallExpr *CE, ProgramStateRef St,
402fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose                        const LocationContext *LCtx)
403c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose    : CXXInstanceCall(CE, St, LCtx, CE_CXXMemberOperator) {}
404fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
405fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  const CXXOperatorCallExpr *getOriginExpr() const {
406fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return cast<CXXOperatorCallExpr>(SimpleCall::getOriginExpr());
407fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
408fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
409fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  unsigned getNumArgs() const { return getOriginExpr()->getNumArgs() - 1; }
410fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  const Expr *getArgExpr(unsigned Index) const {
411fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return getOriginExpr()->getArg(Index + 1);
412fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
413fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
414e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  SVal getCXXThisVal() const;
415e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
416fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  static bool classof(const CallEvent *CA) {
417fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose    return CA->getKind() == CE_CXXMemberOperator;
418fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose  }
419fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose};
420fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
421740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a block.
422740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
423fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose/// Example: <tt>^{ /* ... */ }()</tt>
424740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass BlockCall : public SimpleCall {
425b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  friend class CallEvent;
426b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
427740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
4284b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const;
429740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
430740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getDeclaredResultType() const;
431740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
432740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
433740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  BlockCall(const CallExpr *CE, ProgramStateRef St,
434740d490593e0de8732a697c9f77b90ddd463863bJordan Rose            const LocationContext *LCtx)
43569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    : SimpleCall(CE, St, LCtx, CE_Block) {}
43669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose
43769f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// \brief Returns the region associated with this instance of the block.
43869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
43969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// This may be NULL if the block's origin is unknown.
44069f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  const BlockDataRegion *getBlockRegion() const;
44169f87c956b3ac2b80124fd9604af012e1061473aJordan Rose
44269f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// \brief Gets the declaration of the block.
44369f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  ///
44469f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// This is not an override of getDecl() because AnyFunctionCall has already
44569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  /// assumed that it's a FunctionDecl.
44669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  const BlockDecl *getBlockDecl() const {
44769f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    const BlockDataRegion *BR = getBlockRegion();
44869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    if (!BR)
44969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose      return 0;
45069f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    return BR->getDecl();
451740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
452740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
4539dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  const Decl *getRuntimeDefinition() const {
454ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    return getBlockDecl();
455ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
456ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
457b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_begin(bool UseDefinitionParams = false) const;
458b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_end(bool UseDefinitionParams = false) const;
459b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
460b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getCXXThisVal() const { return UndefinedVal(); }
461b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
462740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
463740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_Block;
464740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
465740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
466740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
467740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Represents a call to a C++ constructor.
468740d490593e0de8732a697c9f77b90ddd463863bJordan Rose///
469740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// Example: \c T(1)
470740d490593e0de8732a697c9f77b90ddd463863bJordan Roseclass CXXConstructorCall : public AnyFunctionCall {
471b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  friend class CallEvent;
472740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
473740d490593e0de8732a697c9f77b90ddd463863bJordan Roseprotected:
4744b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const;
475740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
476740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
477b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// Represents a constructor call to a new or unknown region.
478b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXConstructorCall(const CXXConstructExpr *CE, ProgramStateRef St,
479740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                     const LocationContext *LCtx)
480b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : AnyFunctionCall(CE, St, LCtx, CE_CXXConstructor) {
481b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Data = 0;
482b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
483b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
484b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// Represents a constructor call on an existing object region.
485b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXConstructorCall(const CXXConstructExpr *CE, const MemRegion *target,
486740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                     ProgramStateRef St, const LocationContext *LCtx)
487b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : AnyFunctionCall(CE, St, LCtx, CE_CXXConstructor) {
488b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Data = target;
489b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
490740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
491b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const CXXConstructExpr *getOriginExpr() const {
492b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructExpr>(AnyFunctionCall::getOriginExpr());
493b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
494b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
495b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getSourceRange() const {
496b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getSourceRange();
497b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
498740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
499740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const CXXConstructorDecl *getDecl() const {
500b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getConstructor();
501740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
502740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
503b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  unsigned getNumArgs() const { return getOriginExpr()->getNumArgs(); }
504740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
505740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const Expr *getArgExpr(unsigned Index) const {
506b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
507740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
508740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
509e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  SVal getCXXThisVal() const;
510e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
511740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
512740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_CXXConstructor;
513740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
514740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
515740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
5168d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// \brief Represents an implicit call to a C++ destructor.
5178d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose///
5188d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// This can occur at the end of a scope (for automatic objects), at the end
5198d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose/// of a full-expression (for temporaries), or as part of a delete.
5208d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Roseclass CXXDestructorCall : public AnyFunctionCall {
521b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  friend class CallEvent;
5228d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
5238d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Roseprotected:
5244b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const;
5258d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
5268d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rosepublic:
527b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// Creates an implicit destructor.
528b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  ///
529b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param DD The destructor that will be called.
530b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param Trigger The statement whose completion causes this destructor call.
531b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param Target The object region to be destructed.
532b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param St The path-sensitive state at this point in the program.
533b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  /// \param LCtx The location context at this point in the program.
534b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXDestructorCall(const CXXDestructorDecl *DD, const Stmt *Trigger,
535b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose                    const MemRegion *Target, ProgramStateRef St,
5368d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose                    const LocationContext *LCtx)
537b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : AnyFunctionCall(DD, St, LCtx, CE_CXXDestructor) {
538b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Data = Target;
539b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    Location = Trigger->getLocEnd();
540b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
5418d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
542b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getSourceRange() const { return Location; }
5438d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  unsigned getNumArgs() const { return 0; }
5448d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
545e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  SVal getCXXThisVal() const;
5469dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  const Decl *getRuntimeDefinition() const;
547e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
5488d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  static bool classof(const CallEvent *CA) {
5498d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose    return CA->getKind() == CE_CXXDestructor;
5508d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose  }
5518d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose};
5528d276d38c258dfc572586daf6c0e8f8fce249c0eJordan Rose
5530e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// \brief Represents the memory allocation call in a C++ new-expression.
5540e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose///
5550e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose/// This is a call to "operator new".
55670cbf3cc09eb21db1108396d30a414ea66d842ccJordan Roseclass CXXAllocatorCall : public AnyFunctionCall {
55770cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rosepublic:
558b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  CXXAllocatorCall(const CXXNewExpr *E, ProgramStateRef St,
55970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose                   const LocationContext *LCtx)
560b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    : AnyFunctionCall(E, St, LCtx, CE_CXXAllocator) {}
56170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
562b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const CXXNewExpr *getOriginExpr() const {
563b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXNewExpr>(AnyFunctionCall::getOriginExpr());
564b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
565b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
566b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  // FIXME: This isn't exactly the range of the allocator...
567b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getSourceRange() const {
568b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getSourceRange();
569b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
57070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
57170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  const FunctionDecl *getDecl() const {
572b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getOperatorNew();
57370cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
57470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
575b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  unsigned getNumArgs() const {
576b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumPlacementArgs() + 1;
577b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
57870cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
57970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  const Expr *getArgExpr(unsigned Index) const {
58070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    // The first argument of an allocator call is the size of the allocation.
58170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    if (Index == 0)
58270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose      return 0;
583b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getPlacementArg(Index - 1);
58470cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
58570cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
586b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getCXXThisVal() const { return UndefinedVal(); }
587b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
58870cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  static bool classof(const CallEvent *CE) {
58970cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose    return CE->getKind() == CE_CXXAllocator;
59070cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose  }
59170cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose};
59270cbf3cc09eb21db1108396d30a414ea66d842ccJordan Rose
5938919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// \brief Represents the ways an Objective-C message send can occur.
5948919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose//
5958919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// Note to maintainers: OCM_Message should always be last, since it does not
5968919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose// need to fit in the Data field's low bits.
5978919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseenum ObjCMessageKind {
5988919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_PropertyAccess,
5998919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Subscript,
6008919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  OCM_Message
6018919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose};
6028919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
603cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose/// \brief Represents any expression that calls an Objective-C method.
6048919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose///
6058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose/// This includes all of the kinds listed in ObjCMessageKind.
606cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Roseclass ObjCMethodCall : public CallEvent {
607b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  friend class CallEvent;
608740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6098919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  const PseudoObjectExpr *getContainingPseudoObjectExpr() const;
610cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
6118919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseprotected:
6124b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  void getExtraInvalidatedRegions(RegionList &Regions) const;
613740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
614740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType getDeclaredResultType() const;
6159dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  ObjCMethodDecl *LookupClassMethodDefinition(Selector Sel,
6169dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks                                           ObjCInterfaceDecl *ClassDecl) const;
617740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
618740d490593e0de8732a697c9f77b90ddd463863bJordan Rosepublic:
6198919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMethodCall(const ObjCMessageExpr *Msg, ProgramStateRef St,
6208919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose                 const LocationContext *LCtx)
6218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    : CallEvent(Msg, St, LCtx, CE_ObjCMessage) {
6228919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    Data = 0;
623b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
624de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose
6258919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  const ObjCMessageExpr *getOriginExpr() const {
6268919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMessageExpr>(CallEvent::getOriginExpr());
627cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
628b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const ObjCMethodDecl *getDecl() const {
629b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getMethodDecl();
630b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
631b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  unsigned getNumArgs() const {
632b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getNumArgs();
633b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
634b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const Expr *getArgExpr(unsigned Index) const {
635b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getArg(Index);
636b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
637740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6388919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isInstanceMessage() const {
6398919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->isInstanceMessage();
6408919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
6418919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMethodFamily getMethodFamily() const {
6428919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getMethodFamily();
6438919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
6448919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  Selector getSelector() const {
6458919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getSelector();
6468919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
6478919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6488919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  SourceRange getSourceRange() const;
6498919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6500e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Returns the value of the receiver at the time of this call.
651740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  SVal getReceiverSVal() const;
652740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6530e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// \brief Get the interface for the receiver.
6540e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  ///
6550e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// This works whether this is an instance message or a class message.
6560e020adcb69e91826f4ee14a0c1d381f7b624a34Jordan Rose  /// However, it currently just uses the static type of the receiver.
657cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  const ObjCInterfaceDecl *getReceiverInterface() const {
658b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getOriginExpr()->getReceiverInterface();
659cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose  }
660cde8cdbd6a662c636164465ad309b5f17ff01064Jordan Rose
6618919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMessageKind getMessageKind() const;
6628919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6638919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  bool isSetter() const {
6648919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    switch (getMessageKind()) {
6658919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Message:
6668919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      llvm_unreachable("This is not a pseudo-object access!");
6678919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_PropertyAccess:
6688919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 0;
6698919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    case OCM_Subscript:
6708919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      return getNumArgs() > 1;
6718919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    }
6728919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    llvm_unreachable("Unknown message kind");
673740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
674740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6759dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  // TODO: We might want to only compute this once (or change the API for
6769dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  // getting the parameters). Currently, this gets called 3 times during
6779dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  // inlining.
6789dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  const Decl *getRuntimeDefinition() const {
6798919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6809dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks    const ObjCMessageExpr *E = getOriginExpr();
6819dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks    if (E->isInstanceMessage()) {
6829dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks      return 0;
6839dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks    } else {
6849dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks      // This is a calss method.
6859dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks      // If we have type info for the receiver class, we are calling via
6869dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks      // class name.
6879dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks      if (ObjCInterfaceDecl *IDecl = E->getReceiverInterface()) {
6889dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks        return LookupClassMethodDefinition(E->getSelector(), IDecl);
6899dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks      }
690ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    }
6919dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks
692ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose    return 0;
693ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose  }
694ee158bc29bc12ce544996f7cdfde14aba63acf4dJordan Rose
695b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getCXXThisVal() const { return UndefinedVal(); }
696b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
697b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  bool argumentsMayEscape() const {
698b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return hasNonZeroCallbackArg();
699b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
700b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
701b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SVal getArgSVal(unsigned Index) const { return getSVal(getArgExpr(Index)); }
702b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  SourceRange getArgSourceRange(unsigned Index) const {
703b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return getArgExpr(Index)->getSourceRange();
704b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  }
705b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
706b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_begin(bool UseDefinitionParams = false) const;
707b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  param_iterator param_end(bool UseDefinitionParams = false) const;
708b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
709740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  static bool classof(const CallEvent *CA) {
710740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return CA->getKind() == CE_ObjCMessage;
711740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
712740d490593e0de8732a697c9f77b90ddd463863bJordan Rose};
713740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
714b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
715b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose// FIXME: Use a .def or .td file for this.
716b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#define DISPATCH(fn) \
717b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  switch (getKind()) { \
718b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_Function: \
719b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<FunctionCall>(this)->fn(); \
720b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXMember: \
721b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXMemberCall>(this)->fn(); \
722b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXMemberOperator: \
723b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXMemberOperatorCall>(this)->fn(); \
724b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_Block: \
725b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<BlockCall>(this)->fn(); \
726b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXConstructor: \
727b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructorCall>(this)->fn(); \
728b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXDestructor: \
729b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXDestructorCall>(this)->fn(); \
730b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXAllocator: \
731b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXAllocatorCall>(this)->fn(); \
732b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_ObjCMessage: \
7338919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMethodCall>(this)->fn(); \
7347dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith  } \
7357dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith  llvm_unreachable("unknown CallEvent kind");
736b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
737b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#define DISPATCH_ARG(fn, arg) \
738b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  switch (getKind()) { \
739b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_Function: \
740b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<FunctionCall>(this)->fn(arg); \
741b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXMember: \
742b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXMemberCall>(this)->fn(arg); \
743b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXMemberOperator: \
744b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXMemberOperatorCall>(this)->fn(arg); \
745b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_Block: \
746b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<BlockCall>(this)->fn(arg); \
747b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXConstructor: \
748b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXConstructorCall>(this)->fn(arg); \
749b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXDestructor: \
750b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXDestructorCall>(this)->fn(arg); \
751b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_CXXAllocator: \
752b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return cast<CXXAllocatorCall>(this)->fn(arg); \
753b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  case CE_ObjCMessage: \
7548919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return cast<ObjCMethodCall>(this)->fn(arg); \
7557dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith  } \
7567dfbfb1835198bf0cb4b0caaa5d9f3c6301f9920Richard Smith  llvm_unreachable("unknown CallEvent kind");
757b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
7584b3918e9534e46f9ac067c6e0018f94613292efaJordan Roseinline void CallEvent::getExtraInvalidatedRegions(RegionList &Regions) const {
7594b3918e9534e46f9ac067c6e0018f94613292efaJordan Rose  DISPATCH_ARG(getExtraInvalidatedRegions, Regions);
760b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
761b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
762b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline QualType CallEvent::getDeclaredResultType() const {
763b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH(getDeclaredResultType);
764b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
765b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
766b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline const Decl *CallEvent::getDecl() const {
767b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  if (const Decl *D = Origin.dyn_cast<const Decl *>())
768b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return D;
769b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH(getDecl);
770b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
771b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
7729dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaksinline const Decl *CallEvent::getRuntimeDefinition() const {
7739dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  DISPATCH(getRuntimeDefinition);
774b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
775b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
776b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline unsigned CallEvent::getNumArgs() const {
777b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH(getNumArgs);
778b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
779b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
780b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SourceRange CallEvent::getSourceRange() const {
781b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH(getSourceRange);
782b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
783b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
784b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SVal CallEvent::getArgSVal(unsigned Index) const {
785b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH_ARG(getArgSVal, Index);
786b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
787b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
788b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline const Expr *CallEvent::getArgExpr(unsigned Index) const {
789b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH_ARG(getArgExpr, Index);
790b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
791b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
792b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SourceRange CallEvent::getArgSourceRange(unsigned Index) const {
793b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH_ARG(getArgSourceRange, Index);
794b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
795b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
796b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline SVal CallEvent::getCXXThisVal() const {
797b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH(getCXXThisVal);
798b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
799b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
800b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
801b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline bool CallEvent::argumentsMayEscape() const {
802b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH(argumentsMayEscape);
803b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
804b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
805b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline CallEvent::param_iterator
806b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan RoseCallEvent::param_begin(bool UseDefinitionParams) const {
807b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH_ARG(param_begin, UseDefinitionParams);
808b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
809b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
810b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Roseinline CallEvent::param_iterator
811b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan RoseCallEvent::param_end(bool UseDefinitionParams) const {
812b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  DISPATCH_ARG(param_end, UseDefinitionParams);
813b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
814b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
815b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#undef DISPATCH
816b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#undef DISPATCH_ARG
817b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
818740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace ento
819740d490593e0de8732a697c9f77b90ddd463863bJordan Rose} // end namespace clang
820740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
821740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#endif
822