1740d490593e0de8732a697c9f77b90ddd463863bJordan Rose//===- Calls.cpp - 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
16f540c54701e3eeb34cb619a3a4eb18f1ac70ef2dJordan Rose#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
17b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose#include "clang/AST/ParentMap.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Analysis/ProgramPoint.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
20740d490593e0de8732a697c9f77b90ddd463863bJordan Rose#include "llvm/ADT/SmallSet.h"
21de507eaf3cb54d3cb234dc14499c10ab3373d15fJordan Rose#include "llvm/ADT/StringExtras.h"
22a93d0f280693b8418bc88cf7a8c93325f7fcf4c6Benjamin Kramer#include "llvm/Support/raw_ostream.h"
23740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
24740d490593e0de8732a697c9f77b90ddd463863bJordan Roseusing namespace clang;
25740d490593e0de8732a697c9f77b90ddd463863bJordan Roseusing namespace ento;
26740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
27740d490593e0de8732a697c9f77b90ddd463863bJordan RoseQualType CallEvent::getResultType() const {
285699f62df144545702b91e91836a63db4e5f2627Jordan Rose  const Expr *E = getOriginExpr();
295699f62df144545702b91e91836a63db4e5f2627Jordan Rose  assert(E && "Calls without origin expressions do not have results");
305699f62df144545702b91e91836a63db4e5f2627Jordan Rose  QualType ResultTy = E->getType();
31740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
325699f62df144545702b91e91836a63db4e5f2627Jordan Rose  ASTContext &Ctx = getState()->getStateManager().getContext();
335699f62df144545702b91e91836a63db4e5f2627Jordan Rose
345699f62df144545702b91e91836a63db4e5f2627Jordan Rose  // A function that returns a reference to 'int' will have a result type
355699f62df144545702b91e91836a63db4e5f2627Jordan Rose  // of simply 'int'. Check the origin expr's value kind to recover the
365699f62df144545702b91e91836a63db4e5f2627Jordan Rose  // proper type.
375699f62df144545702b91e91836a63db4e5f2627Jordan Rose  switch (E->getValueKind()) {
385699f62df144545702b91e91836a63db4e5f2627Jordan Rose  case VK_LValue:
395699f62df144545702b91e91836a63db4e5f2627Jordan Rose    ResultTy = Ctx.getLValueReferenceType(ResultTy);
405699f62df144545702b91e91836a63db4e5f2627Jordan Rose    break;
415699f62df144545702b91e91836a63db4e5f2627Jordan Rose  case VK_XValue:
425699f62df144545702b91e91836a63db4e5f2627Jordan Rose    ResultTy = Ctx.getRValueReferenceType(ResultTy);
435699f62df144545702b91e91836a63db4e5f2627Jordan Rose    break;
445699f62df144545702b91e91836a63db4e5f2627Jordan Rose  case VK_RValue:
455699f62df144545702b91e91836a63db4e5f2627Jordan Rose    // No adjustment is necessary.
465699f62df144545702b91e91836a63db4e5f2627Jordan Rose    break;
475699f62df144545702b91e91836a63db4e5f2627Jordan Rose  }
48740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
49740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  return ResultTy;
50740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
51740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
52740d490593e0de8732a697c9f77b90ddd463863bJordan Rosestatic bool isCallbackArg(SVal V, QualType T) {
53740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // If the parameter is 0, it's harmless.
54740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (V.isZeroConstant())
55740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
56740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
57740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // If a parameter is a block or a callback, assume it can modify pointer.
58740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (T->isBlockPointerType() ||
59740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      T->isFunctionPointerType() ||
60740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      T->isObjCSelType())
61740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return true;
62740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
63740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // Check if a callback is passed inside a struct (for both, struct passed by
64740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // reference and by value). Dig just one level into the struct for now.
65740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
664e45dba1c0234eec7b7c348dbbf568c5ac9fc471Jordan Rose  if (T->isAnyPointerType() || T->isReferenceType())
67740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    T = T->getPointeeType();
68740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
69740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (const RecordType *RT = T->getAsStructureType()) {
70740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    const RecordDecl *RD = RT->getDecl();
71740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    for (RecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
72740d490593e0de8732a697c9f77b90ddd463863bJordan Rose         I != E; ++I) {
73740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      QualType FieldT = I->getType();
74740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      if (FieldT->isBlockPointerType() || FieldT->isFunctionPointerType())
75740d490593e0de8732a697c9f77b90ddd463863bJordan Rose        return true;
76740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    }
77740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
78740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
79740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  return false;
80740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
81740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
82740d490593e0de8732a697c9f77b90ddd463863bJordan Rosebool CallEvent::hasNonZeroCallbackArg() const {
83740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  unsigned NumOfArgs = getNumArgs();
84740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
85740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // If calling using a function pointer, assume the function does not
86740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // have a callback. TODO: We could check the types of the arguments here.
87740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!getDecl())
88740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
89740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
90740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  unsigned Idx = 0;
91740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  for (CallEvent::param_type_iterator I = param_type_begin(),
92740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                                       E = param_type_end();
93740d490593e0de8732a697c9f77b90ddd463863bJordan Rose       I != E && Idx < NumOfArgs; ++I, ++Idx) {
94740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (NumOfArgs <= Idx)
95740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      break;
96740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
97740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (isCallbackArg(getArgSVal(Idx), *I))
98740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      return true;
99740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
100740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
101740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  return false;
102740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
103740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
1042f3017f9cbd3774f690c979410bfec38423d03afJordan Rosebool CallEvent::isGlobalCFunction(StringRef FunctionName) const {
1052f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(getDecl());
1062f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  if (!FD)
1072f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    return false;
1082f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
1092f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  return CheckerContext::isCLibraryFunction(FD, FunctionName);
1102f3017f9cbd3774f690c979410bfec38423d03afJordan Rose}
1112f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
112740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// \brief Returns true if a type is a pointer-to-const or reference-to-const
113740d490593e0de8732a697c9f77b90ddd463863bJordan Rose/// with no further indirection.
114740d490593e0de8732a697c9f77b90ddd463863bJordan Rosestatic bool isPointerToConst(QualType Ty) {
115740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  QualType PointeeTy = Ty->getPointeeType();
116740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (PointeeTy == QualType())
117740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
118740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!PointeeTy.isConstQualified())
119740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
120740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (PointeeTy->isAnyPointerType())
121740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return false;
122740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  return true;
123740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
124740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
125740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// Try to retrieve the function declaration and find the function parameter
126740d490593e0de8732a697c9f77b90ddd463863bJordan Rose// types which are pointers/references to a non-pointer const.
12785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose// We will not invalidate the corresponding argument regions.
128f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rosestatic void findPtrToConstParams(llvm::SmallSet<unsigned, 4> &PreserveArgs,
129740d490593e0de8732a697c9f77b90ddd463863bJordan Rose                                 const CallEvent &Call) {
130740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  unsigned Idx = 0;
131740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  for (CallEvent::param_type_iterator I = Call.param_type_begin(),
13285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose                                      E = Call.param_type_end();
133740d490593e0de8732a697c9f77b90ddd463863bJordan Rose       I != E; ++I, ++Idx) {
134740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    if (isPointerToConst(*I))
135740d490593e0de8732a697c9f77b90ddd463863bJordan Rose      PreserveArgs.insert(Idx);
136740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
137740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
138740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
139740d490593e0de8732a697c9f77b90ddd463863bJordan RoseProgramStateRef CallEvent::invalidateRegions(unsigned BlockCount,
140f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rose                                             ProgramStateRef Orig) const {
141b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  ProgramStateRef Result = (Orig ? Orig : getState());
142740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
143658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  SmallVector<SVal, 8> ConstValues;
144658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  SmallVector<SVal, 8> ValuesToInvalidate;
145658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks
146658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  getExtraInvalidatedValues(ValuesToInvalidate);
147740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
148740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // Indexes of arguments whose values will be preserved by the call.
149f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rose  llvm::SmallSet<unsigned, 4> PreserveArgs;
15085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (!argumentsMayEscape())
15185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    findPtrToConstParams(PreserveArgs, *this);
152740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
153740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  for (unsigned Idx = 0, Count = getNumArgs(); Idx != Count; ++Idx) {
154f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rose    // Mark this region for invalidation.  We batch invalidate regions
155f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rose    // below for efficiency.
156f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rose    if (PreserveArgs.count(Idx))
157658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks      ConstValues.push_back(getArgSVal(Idx));
158f8ddc098981d4d85cad4e72fc6dfcfe83b842b66Jordan Rose    else
159658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks      ValuesToInvalidate.push_back(getArgSVal(Idx));
160740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  }
161740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
162740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // Invalidate designated regions using the batch invalidation API.
163740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // NOTE: Even if RegionsToInvalidate is empty, we may still invalidate
164740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  //  global variables.
165658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  return Result->invalidateRegions(ValuesToInvalidate, getOriginExpr(),
166b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose                                   BlockCount, getLocationContext(),
1671655bcd052a67a3050fc55df8ecce57342352e68Anna Zaks                                   /*CausedByPointerEscape*/ true,
168658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks                                   /*Symbols=*/0, this, ConstValues);
169740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
170740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
17128038f33aa2db4833881fea757a1f0daf85ac02bJordan RoseProgramPoint CallEvent::getProgramPoint(bool IsPreVisit,
17228038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose                                        const ProgramPointTag *Tag) const {
17328038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  if (const Expr *E = getOriginExpr()) {
17428038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose    if (IsPreVisit)
175b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose      return PreStmt(E, getLocationContext(), Tag);
176b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return PostStmt(E, getLocationContext(), Tag);
17728038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  }
17828038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
17928038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  const Decl *D = getDecl();
18028038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  assert(D && "Cannot get a program point without a statement or decl");
18128038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
18228038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  SourceLocation Loc = getSourceRange().getBegin();
18328038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose  if (IsPreVisit)
184b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return PreImplicitCall(D, Loc, getLocationContext(), Tag);
185b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  return PostImplicitCall(D, Loc, getLocationContext(), Tag);
18628038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose}
18728038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
1887c99aa385178c630e29f671299cdd9c104f1c885Jordan RoseSVal CallEvent::getArgSVal(unsigned Index) const {
1897c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  const Expr *ArgE = getArgExpr(Index);
1907c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  if (!ArgE)
1917c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return UnknownVal();
1927c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  return getSVal(ArgE);
1937c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose}
1947c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
1957c99aa385178c630e29f671299cdd9c104f1c885Jordan RoseSourceRange CallEvent::getArgSourceRange(unsigned Index) const {
1967c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  const Expr *ArgE = getArgExpr(Index);
1977c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  if (!ArgE)
1987c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return SourceRange();
1997c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  return ArgE->getSourceRange();
2007c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose}
2017c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
2022f3017f9cbd3774f690c979410bfec38423d03afJordan RoseSVal CallEvent::getReturnValue() const {
2032f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  const Expr *E = getOriginExpr();
2042f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  if (!E)
2052f3017f9cbd3774f690c979410bfec38423d03afJordan Rose    return UndefinedVal();
2062f3017f9cbd3774f690c979410bfec38423d03afJordan Rose  return getSVal(E);
2072f3017f9cbd3774f690c979410bfec38423d03afJordan Rose}
2082f3017f9cbd3774f690c979410bfec38423d03afJordan Rose
20942c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramervoid CallEvent::dump() const {
21042c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramer  dump(llvm::errs());
21142c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramer}
21242c72c258e08ca79c9267346b4badcddd8fcd001Benjamin Kramer
2137c99aa385178c630e29f671299cdd9c104f1c885Jordan Rosevoid CallEvent::dump(raw_ostream &Out) const {
2147c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  ASTContext &Ctx = getState()->getStateManager().getContext();
2157c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  if (const Expr *E = getOriginExpr()) {
216d1420c6fa788669e49f21e184927c7833881e399Richard Smith    E->printPretty(Out, 0, Ctx.getPrintingPolicy());
2177c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    Out << "\n";
2187c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return;
2197c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
2207c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
2217c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  if (const Decl *D = getDecl()) {
2227c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    Out << "Call to ";
2237c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    D->print(Out, Ctx.getPrintingPolicy());
2247c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose    return;
2257c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  }
2267c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
2277c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  // FIXME: a string representation of the kind would be nice.
2287c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  Out << "Unknown call (type " << getKind() << ")";
2297c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose}
2307c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose
23128038f33aa2db4833881fea757a1f0daf85ac02bJordan Rose
2326062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rosebool CallEvent::isCallStmt(const Stmt *S) {
2337c99aa385178c630e29f671299cdd9c104f1c885Jordan Rose  return isa<CallExpr>(S) || isa<ObjCMessageExpr>(S)
2346062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose                          || isa<CXXConstructExpr>(S)
2356062334cc388bce69fb3978c4ecb26c6485a5c2bJordan Rose                          || isa<CXXNewExpr>(S);
23685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose}
23716e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks
23816e6a7cb41319459ded69b4d47f405c1035dd347Anna ZaksQualType CallEvent::getDeclaredResultType(const Decl *D) {
23916e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  assert(D);
24016e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D))
24116e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks    return FD->getResultType();
242898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  if (const ObjCMethodDecl* MD = dyn_cast<ObjCMethodDecl>(D))
24316e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks    return MD->getResultType();
244898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
245898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    // Blocks are difficult because the return type may not be stored in the
246898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    // BlockDecl itself. The AST should probably be enhanced, but for now we
247898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    // just do what we can.
248b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose    // If the block is declared without an explicit argument list, the
249b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose    // signature-as-written just includes the return type, not the entire
250b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose    // function type.
251eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose    // FIXME: All blocks should have signatures-as-written, even if the return
252b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose    // type is inferred. (That's signified with a dependent result type.)
253eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose    if (const TypeSourceInfo *TSI = BD->getSignatureAsWritten()) {
254b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose      QualType Ty = TSI->getType();
255b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose      if (const FunctionType *FT = Ty->getAs<FunctionType>())
256b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose        Ty = FT->getResultType();
257b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose      if (!Ty->isDependentType())
258b347c76054a0a4b8e6d1fce44314f6daf3294c69Jordan Rose        return Ty;
259eb41640fb417e25eb3218c2662a0dd512cdab04aJordan Rose    }
260898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose
261898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose    return QualType();
262898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose  }
263898be7b4a7b0a527d9bd2569eebc41a198e6e528Jordan Rose
26416e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks  return QualType();
26516e6a7cb41319459ded69b4d47f405c1035dd347Anna Zaks}
26685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
267ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosestatic void addParameterValuesToBindings(const StackFrameContext *CalleeCtx,
268ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                         CallEvent::BindingsTy &Bindings,
269ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                         SValBuilder &SVB,
270ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                         const CallEvent &Call,
271ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                         CallEvent::param_iterator I,
272ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                         CallEvent::param_iterator E) {
273ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  MemRegionManager &MRMgr = SVB.getRegionManager();
27485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
27537926da411d5a0047240b3ffd4dad0c4838aac57Pavel Labath  // If the function has fewer parameters than the call has arguments, we simply
27637926da411d5a0047240b3ffd4dad0c4838aac57Pavel Labath  // do not bind any values to them.
27737926da411d5a0047240b3ffd4dad0c4838aac57Pavel Labath  unsigned NumArgs = Call.getNumArgs();
278ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  unsigned Idx = 0;
27937926da411d5a0047240b3ffd4dad0c4838aac57Pavel Labath  for (; I != E && Idx < NumArgs; ++I, ++Idx) {
280ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    const ParmVarDecl *ParamDecl = *I;
281ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    assert(ParamDecl && "Formal parameter has no decl?");
282ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
283ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    SVal ArgVal = Call.getArgSVal(Idx);
284ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    if (!ArgVal.isUnknown()) {
285ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose      Loc ParamLoc = SVB.makeLoc(MRMgr.getVarRegion(ParamDecl, CalleeCtx));
286ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose      Bindings.push_back(std::make_pair(ParamLoc, ArgVal));
287ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    }
288ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  }
289ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
290ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  // FIXME: Variadic arguments are not handled at all right now.
291ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose}
292ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
293ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
294ef15831780b705475e7b237ac16418e9b53cb7a6Jordan RoseCallEvent::param_iterator AnyFunctionCall::param_begin() const {
295ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const FunctionDecl *D = getDecl();
296740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!D)
297740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return 0;
298740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
299ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  return D->param_begin();
300740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
301740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
302ef15831780b705475e7b237ac16418e9b53cb7a6Jordan RoseCallEvent::param_iterator AnyFunctionCall::param_end() const {
303ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const FunctionDecl *D = getDecl();
304740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!D)
305740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return 0;
306740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
307ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  return D->param_end();
308ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose}
309ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
310ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosevoid AnyFunctionCall::getInitialStackFrameContents(
311ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                        const StackFrameContext *CalleeCtx,
312ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                        BindingsTy &Bindings) const {
313ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const FunctionDecl *D = cast<FunctionDecl>(CalleeCtx->getDecl());
314ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
315ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
316ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                               D->param_begin(), D->param_end());
317740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
318740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
31985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rosebool AnyFunctionCall::argumentsMayEscape() const {
320b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  if (hasNonZeroCallbackArg())
32185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
32285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
32385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  const FunctionDecl *D = getDecl();
32485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (!D)
32585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
32685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
32785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  const IdentifierInfo *II = D->getIdentifier();
32885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (!II)
3293719ed248b7b7e239b1b435dd569b007aaea9d26Anna Zaks    return false;
33085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
33185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // This set of "escaping" APIs is
33285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
33385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // - 'int pthread_setspecific(ptheread_key k, const void *)' stores a
33485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   value into thread local storage. The value can later be retrieved with
33585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   'void *ptheread_getspecific(pthread_key)'. So even thought the
33685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   parameter is 'const void *', the region escapes through the call.
33785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (II->isStr("pthread_setspecific"))
33885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
33985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
34085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // - xpc_connection_set_context stores a value which can be retrieved later
34185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   with xpc_connection_get_context.
34285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (II->isStr("xpc_connection_set_context"))
34385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
34485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
34585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // - funopen - sets a buffer for future IO calls.
34685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (II->isStr("funopen"))
34785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
34885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
34985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  StringRef FName = II->getName();
35085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
35185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // - CoreFoundation functions that end with "NoCopy" can free a passed-in
35285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   buffer even if it is const.
35385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (FName.endswith("NoCopy"))
35485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
35585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
35685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // - NSXXInsertXX, for example NSMapInsertIfAbsent, since they can
35785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   be deallocated by NSMapRemove.
35885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (FName.startswith("NS") && (FName.find("Insert") != StringRef::npos))
35985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return true;
36085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
36185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  // - Many CF containers allow objects to escape through custom
36285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  //   allocators/deallocators upon container construction. (PR12101)
36385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  if (FName.startswith("CF") || FName.startswith("CG")) {
36485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose    return StrInStrNoCase(FName, "InsertValue")  != StringRef::npos ||
36585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose           StrInStrNoCase(FName, "AddValue")     != StringRef::npos ||
36685d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose           StrInStrNoCase(FName, "SetValue")     != StringRef::npos ||
36785d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose           StrInStrNoCase(FName, "WithData")     != StringRef::npos ||
36885d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose           StrInStrNoCase(FName, "AppendValue")  != StringRef::npos ||
36985d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose           StrInStrNoCase(FName, "SetAttribute") != StringRef::npos;
37085d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  }
37185d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
37285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose  return false;
37385d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose}
37485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
37585d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
376740d490593e0de8732a697c9f77b90ddd463863bJordan Roseconst FunctionDecl *SimpleCall::getDecl() const {
377b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  const FunctionDecl *D = getOriginExpr()->getDirectCallee();
378740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (D)
379740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return D;
380740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
381b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  return getSVal(getOriginExpr()->getCallee()).getAsFunctionDecl();
382740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
383740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
38485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
385645baeed6800f952e9ad1d5666e01080385531a2Jordan Roseconst FunctionDecl *CXXInstanceCall::getDecl() const {
386645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const CallExpr *CE = cast_or_null<CallExpr>(getOriginExpr());
387645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  if (!CE)
388645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return AnyFunctionCall::getDecl();
389645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
390645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  const FunctionDecl *D = CE->getDirectCallee();
391645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  if (D)
392645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose    return D;
393645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
394645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose  return getSVal(CE->getCallee()).getAsFunctionDecl();
395645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose}
396645baeed6800f952e9ad1d5666e01080385531a2Jordan Rose
397658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaksvoid CXXInstanceCall::getExtraInvalidatedValues(ValueList &Values) const {
398658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  Values.push_back(getCXXThisVal());
399c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose}
400c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
4016ebea89be233eaba5e29de8cf3524ad150c860bbJordan RoseSVal CXXInstanceCall::getCXXThisVal() const {
4026ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  const Expr *Base = getCXXThisExpr();
4036ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  // FIXME: This doesn't handle an overloaded ->* operator.
4046ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  if (!Base)
4056ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose    return UnknownVal();
4066ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
4076ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  SVal ThisVal = getSVal(Base);
4085251abea41b446c26e3239c8dd6c7edea6fc335dDavid Blaikie  assert(ThisVal.isUnknownOrUndef() || ThisVal.getAs<Loc>());
4096ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose  return ThisVal;
4106ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose}
4116ebea89be233eaba5e29de8cf3524ad150c860bbJordan Rose
412c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
413ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted KremenekRuntimeDefinition CXXInstanceCall::getRuntimeDefinition() const {
4140ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // Do we have a decl at all?
4159584f67b6da17283a31dedf0a1cab2d83a3d121cJordan Rose  const Decl *D = getDecl();
416c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  if (!D)
417e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks    return RuntimeDefinition();
418c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
4190ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // If the method is non-virtual, we know we can inline it.
420c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  const CXXMethodDecl *MD = cast<CXXMethodDecl>(D);
421c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose  if (!MD->isVirtual())
422ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek    return AnyFunctionCall::getRuntimeDefinition();
423c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
4240ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // Do we know the implicit 'this' object being called?
4250ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  const MemRegion *R = getCXXThisVal().getAsRegion();
4260ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  if (!R)
4270ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose    return RuntimeDefinition();
4280ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose
4290ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // Do we know anything about the type of 'this'?
4300ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  DynamicTypeInfo DynType = getState()->getDynamicTypeInfo(R);
4310ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  if (!DynType.isValid())
4320ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose    return RuntimeDefinition();
4330ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose
4340ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // Is the type a C++ class? (This is mostly a defensive check.)
4350ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  QualType RegionType = DynType.getType()->getPointeeType();
4364e45dba1c0234eec7b7c348dbbf568c5ac9fc471Jordan Rose  assert(!RegionType.isNull() && "DynamicTypeInfo should always be a pointer.");
4374e45dba1c0234eec7b7c348dbbf568c5ac9fc471Jordan Rose
4380ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  const CXXRecordDecl *RD = RegionType->getAsCXXRecordDecl();
439fc87350ce0b279c82b1c9d2647063f4acf48a978Jordan Rose  if (!RD || !RD->hasDefinition())
4400ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose    return RuntimeDefinition();
4410ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose
442fe3769dbb448edf8e5ece13b14017608558d4763Jordan Rose  // Find the decl for this method in that class.
443fe3769dbb448edf8e5ece13b14017608558d4763Jordan Rose  const CXXMethodDecl *Result = MD->getCorrespondingMethodInClass(RD, true);
4448f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose  if (!Result) {
4458f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose    // We might not even get the original statically-resolved method due to
4468f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose    // some particularly nasty casting (e.g. casts to sister classes).
4478f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose    // However, we should at least be able to search up and down our own class
4488f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose    // hierarchy, and some real bugs have been caught by checking this.
4498f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose    assert(!RD->isDerivedFrom(MD->getParent()) && "Couldn't find known method");
450d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose
451d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose    // FIXME: This is checking that our DynamicTypeInfo is at least as good as
452d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose    // the static type. However, because we currently don't update
453d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose    // DynamicTypeInfo when an object is cast, we can't actually be sure the
454d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose    // DynamicTypeInfo is up to date. This assert should be re-enabled once
455d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose    // this is fixed. <rdar://problem/12287087>
456d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose    //assert(!MD->getParent()->isDerivedFrom(RD) && "Bad DynamicTypeInfo");
457d66b3c56a5da1cbaf5ec12811ee7221231b6c301Jordan Rose
4588f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose    return RuntimeDefinition();
4598f0d0fef5f90b16600cdb802d5d7344417c34aadJordan Rose  }
4600ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose
4610ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // Does the decl that we found have an implementation?
4620ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  const FunctionDecl *Definition;
4630ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  if (!Result->hasBody(Definition))
4640ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose    return RuntimeDefinition();
465c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
4660ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // We found a definition. If we're not sure that this devirtualization is
4670ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // actually what will happen at runtime, make sure to provide the region so
4680ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  // that ExprEngine can decide what to do with it.
4690ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  if (DynType.canBeASubClass())
4700ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose    return RuntimeDefinition(Definition, R->StripCasts());
4710ad36baedc516005cb6ea97d96327517ebfe5138Jordan Rose  return RuntimeDefinition(Definition, /*DispatchRegion=*/0);
472c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose}
473c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
474ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosevoid CXXInstanceCall::getInitialStackFrameContents(
475ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            const StackFrameContext *CalleeCtx,
476ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                            BindingsTy &Bindings) const {
477ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  AnyFunctionCall::getInitialStackFrameContents(CalleeCtx, Bindings);
478ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
479b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose  // Handle the binding of 'this' in the new stack frame.
480ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  SVal ThisVal = getCXXThisVal();
481ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  if (!ThisVal.isUnknown()) {
482b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose    ProgramStateManager &StateMgr = getState()->getStateManager();
483b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose    SValBuilder &SVB = StateMgr.getSValBuilder();
4849f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose
485ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    const CXXMethodDecl *MD = cast<CXXMethodDecl>(CalleeCtx->getDecl());
486ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    Loc ThisLoc = SVB.getCXXThis(MD, CalleeCtx);
487b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose
4889f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose    // If we devirtualized to a different member function, we need to make sure
4899f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose    // we have the proper layering of CXXBaseObjectRegions.
4909f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose    if (MD->getCanonicalDecl() != getDecl()->getCanonicalDecl()) {
4918ec104b9fffb917924c495ce3dd25694e4e3087aJordan Rose      ASTContext &Ctx = SVB.getContext();
492b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose      const CXXRecordDecl *Class = MD->getParent();
4938ec104b9fffb917924c495ce3dd25694e4e3087aJordan Rose      QualType Ty = Ctx.getPointerType(Ctx.getRecordType(Class));
494b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose
4958ec104b9fffb917924c495ce3dd25694e4e3087aJordan Rose      // FIXME: CallEvent maybe shouldn't be directly accessing StoreManager.
4968ec104b9fffb917924c495ce3dd25694e4e3087aJordan Rose      bool Failed;
4978ec104b9fffb917924c495ce3dd25694e4e3087aJordan Rose      ThisVal = StateMgr.getStoreManager().evalDynamicCast(ThisVal, Ty, Failed);
4988ec104b9fffb917924c495ce3dd25694e4e3087aJordan Rose      assert(!Failed && "Calling an incorrectly devirtualized method");
499b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose    }
500b6d2bea04801cb66263de2f3fe99ef8e1dcd9f53Jordan Rose
5019f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose    if (!ThisVal.isUnknown())
5029f6441ad92c30028032eb3df6f4a7f2ebe393a68Jordan Rose      Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
503ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  }
504ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose}
505ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
506ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
507c36b30c92c78b95fd29fb5d9d6214d737b3bcb02Jordan Rose
5089da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Roseconst Expr *CXXMemberCall::getCXXThisExpr() const {
5099da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  return getOriginExpr()->getImplicitObjectArgument();
510e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose}
511e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
512ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted KremenekRuntimeDefinition CXXMemberCall::getRuntimeDefinition() const {
51300b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose  // C++11 [expr.call]p1: ...If the selected function is non-virtual, or if the
51400b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose  // id-expression in the class member access expression is a qualified-id,
51500b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose  // that function is called. Otherwise, its final overrider in the dynamic type
51600b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose  // of the object expression is called.
51700b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose  if (const MemberExpr *ME = dyn_cast<MemberExpr>(getOriginExpr()->getCallee()))
51800b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose    if (ME->hasQualifier())
519ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek      return AnyFunctionCall::getRuntimeDefinition();
52000b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose
521ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  return CXXInstanceCall::getRuntimeDefinition();
52200b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose}
52300b4f64ecb26b031c1f4888f39be6c706156356aJordan Rose
52485d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
5259da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Roseconst Expr *CXXMemberOperatorCall::getCXXThisExpr() const {
5269da59a67a27a4d3fc9d59552f07808a32f85e9d3Jordan Rose  return getOriginExpr()->getArg(0);
527e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose}
528e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
529fdaa33818cf9bad8d092136e73bd2e489cb821baJordan Rose
530740d490593e0de8732a697c9f77b90ddd463863bJordan Roseconst BlockDataRegion *BlockCall::getBlockRegion() const {
531740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const Expr *Callee = getOriginExpr()->getCallee();
532740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  const MemRegion *DataReg = getSVal(Callee).getAsRegion();
533740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
53469f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  return dyn_cast_or_null<BlockDataRegion>(DataReg);
535740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
536740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
537ef15831780b705475e7b237ac16418e9b53cb7a6Jordan RoseCallEvent::param_iterator BlockCall::param_begin() const {
53869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  const BlockDecl *D = getBlockDecl();
53969f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  if (!D)
54069f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    return 0;
54169f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  return D->param_begin();
542740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
543740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
544ef15831780b705475e7b237ac16418e9b53cb7a6Jordan RoseCallEvent::param_iterator BlockCall::param_end() const {
54569f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  const BlockDecl *D = getBlockDecl();
54669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  if (!D)
54769f87c956b3ac2b80124fd9604af012e1061473aJordan Rose    return 0;
54869f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  return D->param_end();
549740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
550740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
551658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaksvoid BlockCall::getExtraInvalidatedValues(ValueList &Values) const {
55269f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  // FIXME: This also needs to invalidate captured globals.
55369f87c956b3ac2b80124fd9604af012e1061473aJordan Rose  if (const MemRegion *R = getBlockRegion())
554658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks    Values.push_back(loc::MemRegionVal(R));
555740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
556740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
557ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosevoid BlockCall::getInitialStackFrameContents(const StackFrameContext *CalleeCtx,
558ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                             BindingsTy &Bindings) const {
559ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const BlockDecl *D = cast<BlockDecl>(CalleeCtx->getDecl());
560ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
561ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
562ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                               D->param_begin(), D->param_end());
563ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose}
564ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
565ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
566e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan RoseSVal CXXConstructorCall::getCXXThisVal() const {
567b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  if (Data)
568b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose    return loc::MemRegionVal(static_cast<const MemRegion *>(Data));
569e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  return UnknownVal();
570e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose}
571e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
572658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaksvoid CXXConstructorCall::getExtraInvalidatedValues(ValueList &Values) const {
573b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  if (Data)
574658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks    Values.push_back(loc::MemRegionVal(static_cast<const MemRegion *>(Data)));
575740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
576740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
577ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosevoid CXXConstructorCall::getInitialStackFrameContents(
578ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                             const StackFrameContext *CalleeCtx,
579ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                             BindingsTy &Bindings) const {
580ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  AnyFunctionCall::getInitialStackFrameContents(CalleeCtx, Bindings);
581ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
582ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  SVal ThisVal = getCXXThisVal();
583ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  if (!ThisVal.isUnknown()) {
584ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
585ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    const CXXMethodDecl *MD = cast<CXXMethodDecl>(CalleeCtx->getDecl());
586ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    Loc ThisLoc = SVB.getCXXThis(MD, CalleeCtx);
587ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    Bindings.push_back(std::make_pair(ThisLoc, ThisVal));
588ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  }
589ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose}
590ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
591ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
59285d7e01cf639b257d70f8a129709a2d7594d7b22Jordan Rose
593e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan RoseSVal CXXDestructorCall::getCXXThisVal() const {
594b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose  if (Data)
595200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose    return loc::MemRegionVal(DtorDataTy::getFromOpaqueValue(Data).getPointer());
596e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose  return UnknownVal();
597e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose}
598e54cfc7b9990acffd0a8a4ba381717b4bb9f3011Jordan Rose
599ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted KremenekRuntimeDefinition CXXDestructorCall::getRuntimeDefinition() const {
600200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  // Base destructors are always called non-virtually.
601200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  // Skip CXXInstanceCall's devirtualization logic in this case.
602200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose  if (isBaseDestructor())
603ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek    return AnyFunctionCall::getRuntimeDefinition();
604200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
605ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted Kremenek  return CXXInstanceCall::getRuntimeDefinition();
606200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose}
607200fa2e70d52ae6d620e81cd45536071fdde70c0Jordan Rose
608ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
609ef15831780b705475e7b237ac16418e9b53cb7a6Jordan RoseCallEvent::param_iterator ObjCMethodCall::param_begin() const {
610ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const ObjCMethodDecl *D = getDecl();
611740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!D)
612740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return 0;
613740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
614ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  return D->param_begin();
615740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
616740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
617ef15831780b705475e7b237ac16418e9b53cb7a6Jordan RoseCallEvent::param_iterator ObjCMethodCall::param_end() const {
618ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const ObjCMethodDecl *D = getDecl();
619740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!D)
620740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return 0;
621740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
622ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  return D->param_end();
623740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
624740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
625740d490593e0de8732a697c9f77b90ddd463863bJordan Rosevoid
626658a28479dd775f6ff2c07fa5699a7ea01e04127Anna ZaksObjCMethodCall::getExtraInvalidatedValues(ValueList &Values) const {
627658a28479dd775f6ff2c07fa5699a7ea01e04127Anna Zaks  Values.push_back(getReceiverSVal());
628740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
629740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
6305a90193ad825656d4a03099cd5e9c928d1782b5eAnna ZaksSVal ObjCMethodCall::getSelfSVal() const {
6315a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  const LocationContext *LCtx = getLocationContext();
6325a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  const ImplicitParamDecl *SelfDecl = LCtx->getSelfDecl();
6335a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  if (!SelfDecl)
6345a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks    return SVal();
6355a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  return getState()->getSVal(getState()->getRegion(SelfDecl, LCtx));
6365a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks}
6375a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
638cde8cdbd6a662c636164465ad309b5f17ff01064Jordan RoseSVal ObjCMethodCall::getReceiverSVal() const {
639740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // FIXME: Is this the best way to handle class receivers?
640740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  if (!isInstanceMessage())
641740d490593e0de8732a697c9f77b90ddd463863bJordan Rose    return UnknownVal();
642740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
643c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks  if (const Expr *RecE = getOriginExpr()->getInstanceReceiver())
644c7ecc43c33a21b82c49664910b19fcc1f555aa51Anna Zaks    return getSVal(RecE);
645740d490593e0de8732a697c9f77b90ddd463863bJordan Rose
646740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // An instance message with no expression means we are sending to super.
647740d490593e0de8732a697c9f77b90ddd463863bJordan Rose  // In this case the object reference is the same as 'self'.
6485a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  assert(getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperInstance);
6495a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  SVal SelfVal = getSelfSVal();
6505a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  assert(SelfVal.isValid() && "Calling super but not in ObjC method");
6515a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  return SelfVal;
6525a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks}
6535a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
6545a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaksbool ObjCMethodCall::isReceiverSelfOrSuper() const {
6555a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  if (getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperInstance ||
6565a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks      getOriginExpr()->getReceiverKind() == ObjCMessageExpr::SuperClass)
6575a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks      return true;
6585a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
6595a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  if (!isInstanceMessage())
6605a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks    return false;
6615a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
6625a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  SVal RecVal = getSVal(getOriginExpr()->getInstanceReceiver());
6635a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks
6645a90193ad825656d4a03099cd5e9c928d1782b5eAnna Zaks  return (RecVal == getSelfSVal());
665b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose}
666b7a23e05d1d8f07f2a6edce5c88c728fe894c2c7Jordan Rose
6678919e688dc610d1f632a4d43f7f1489f67255476Jordan RoseSourceRange ObjCMethodCall::getSourceRange() const {
6688919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  switch (getMessageKind()) {
6698919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  case OCM_Message:
6708919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getOriginExpr()->getSourceRange();
6718919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  case OCM_PropertyAccess:
6728919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  case OCM_Subscript:
6738919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return getContainingPseudoObjectExpr()->getSourceRange();
6748919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
6757c30427afb4c2171ee4d336477f5e4d7c277ccb4Richard Smith  llvm_unreachable("unknown message kind");
6768919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose}
6778919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6788919e688dc610d1f632a4d43f7f1489f67255476Jordan Rosetypedef llvm::PointerIntPair<const PseudoObjectExpr *, 2> ObjCMessageDataTy;
6798919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6808919e688dc610d1f632a4d43f7f1489f67255476Jordan Roseconst PseudoObjectExpr *ObjCMethodCall::getContainingPseudoObjectExpr() const {
6818919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  assert(Data != 0 && "Lazy lookup not yet performed.");
6828919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  assert(getMessageKind() != OCM_Message && "Explicit message send.");
6838919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  return ObjCMessageDataTy::getFromOpaqueValue(Data).getPointer();
6848919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose}
6858919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6868919e688dc610d1f632a4d43f7f1489f67255476Jordan RoseObjCMessageKind ObjCMethodCall::getMessageKind() const {
6878919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  if (Data == 0) {
6888919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    ParentMap &PM = getLocationContext()->getParentMap();
6898919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    const Stmt *S = PM.getParent(getOriginExpr());
6908919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    if (const PseudoObjectExpr *POE = dyn_cast_or_null<PseudoObjectExpr>(S)) {
6918919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      const Expr *Syntactic = POE->getSyntacticForm();
6928919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6938919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      // This handles the funny case of assigning to the result of a getter.
6948919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      // This can happen if the getter returns a non-const reference.
6958919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(Syntactic))
6968919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        Syntactic = BO->getLHS();
6978919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
6988919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      ObjCMessageKind K;
6998919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      switch (Syntactic->getStmtClass()) {
7008919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      case Stmt::ObjCPropertyRefExprClass:
7018919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        K = OCM_PropertyAccess;
7028919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        break;
7038919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      case Stmt::ObjCSubscriptRefExprClass:
7048919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        K = OCM_Subscript;
7058919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        break;
7068919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      default:
7078919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        // FIXME: Can this ever happen?
7088919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        K = OCM_Message;
7098919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        break;
7108919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      }
7118919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7128919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      if (K != OCM_Message) {
7138919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        const_cast<ObjCMethodCall *>(this)->Data
7148919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose          = ObjCMessageDataTy(POE, K).getOpaqueValue();
7158919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        assert(getMessageKind() == K);
7168919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose        return K;
7178919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      }
7188919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    }
7198919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7208919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    const_cast<ObjCMethodCall *>(this)->Data
7218919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose      = ObjCMessageDataTy(0, 1).getOpaqueValue();
7228919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    assert(getMessageKind() == OCM_Message);
7238919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return OCM_Message;
7248919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  }
7258919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose
7268919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  ObjCMessageDataTy Info = ObjCMessageDataTy::getFromOpaqueValue(Data);
7278919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  if (!Info.getPointer())
7288919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose    return OCM_Message;
7298919e688dc610d1f632a4d43f7f1489f67255476Jordan Rose  return static_cast<ObjCMessageKind>(Info.getInt());
730740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
7319dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks
7323f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7333f558af01643787d209a133215b0abec81b5fe30Anna Zaksbool ObjCMethodCall::canBeOverridenInSubclass(ObjCInterfaceDecl *IDecl,
7343f558af01643787d209a133215b0abec81b5fe30Anna Zaks                                             Selector Sel) const {
7353f558af01643787d209a133215b0abec81b5fe30Anna Zaks  assert(IDecl);
7363f558af01643787d209a133215b0abec81b5fe30Anna Zaks  const SourceManager &SM =
7373f558af01643787d209a133215b0abec81b5fe30Anna Zaks    getState()->getStateManager().getContext().getSourceManager();
7383f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7393f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // If the class interface is declared inside the main file, assume it is not
7403f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // subcassed.
7413f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // TODO: It could actually be subclassed if the subclass is private as well.
7423f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // This is probably very rare.
7433f558af01643787d209a133215b0abec81b5fe30Anna Zaks  SourceLocation InterfLoc = IDecl->getEndOfDefinitionLoc();
7443f558af01643787d209a133215b0abec81b5fe30Anna Zaks  if (InterfLoc.isValid() && SM.isFromMainFile(InterfLoc))
7453f558af01643787d209a133215b0abec81b5fe30Anna Zaks    return false;
7463f558af01643787d209a133215b0abec81b5fe30Anna Zaks
74738aee3bb4ffe14c8323785ae2fafed6f627fb577Anna Zaks  // Assume that property accessors are not overridden.
74838aee3bb4ffe14c8323785ae2fafed6f627fb577Anna Zaks  if (getMessageKind() == OCM_PropertyAccess)
74938aee3bb4ffe14c8323785ae2fafed6f627fb577Anna Zaks    return false;
7503f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7513f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // We assume that if the method is public (declared outside of main file) or
7523f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // has a parent which publicly declares the method, the method could be
7533f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // overridden in a subclass.
7543f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7553f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // Find the first declaration in the class hierarchy that declares
7563f558af01643787d209a133215b0abec81b5fe30Anna Zaks  // the selector.
7573f558af01643787d209a133215b0abec81b5fe30Anna Zaks  ObjCMethodDecl *D = 0;
7583f558af01643787d209a133215b0abec81b5fe30Anna Zaks  while (true) {
7593f558af01643787d209a133215b0abec81b5fe30Anna Zaks    D = IDecl->lookupMethod(Sel, true);
7603f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7613f558af01643787d209a133215b0abec81b5fe30Anna Zaks    // Cannot find a public definition.
7623f558af01643787d209a133215b0abec81b5fe30Anna Zaks    if (!D)
7633f558af01643787d209a133215b0abec81b5fe30Anna Zaks      return false;
7643f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7653f558af01643787d209a133215b0abec81b5fe30Anna Zaks    // If outside the main file,
7663f558af01643787d209a133215b0abec81b5fe30Anna Zaks    if (D->getLocation().isValid() && !SM.isFromMainFile(D->getLocation()))
7673f558af01643787d209a133215b0abec81b5fe30Anna Zaks      return true;
7683f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7693f558af01643787d209a133215b0abec81b5fe30Anna Zaks    if (D->isOverriding()) {
7703f558af01643787d209a133215b0abec81b5fe30Anna Zaks      // Search in the superclass on the next iteration.
7713f558af01643787d209a133215b0abec81b5fe30Anna Zaks      IDecl = D->getClassInterface();
7723f558af01643787d209a133215b0abec81b5fe30Anna Zaks      if (!IDecl)
7733f558af01643787d209a133215b0abec81b5fe30Anna Zaks        return false;
7743f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7753f558af01643787d209a133215b0abec81b5fe30Anna Zaks      IDecl = IDecl->getSuperClass();
7763f558af01643787d209a133215b0abec81b5fe30Anna Zaks      if (!IDecl)
7773f558af01643787d209a133215b0abec81b5fe30Anna Zaks        return false;
7783f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7793f558af01643787d209a133215b0abec81b5fe30Anna Zaks      continue;
7803f558af01643787d209a133215b0abec81b5fe30Anna Zaks    }
7813f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7823f558af01643787d209a133215b0abec81b5fe30Anna Zaks    return false;
7833f558af01643787d209a133215b0abec81b5fe30Anna Zaks  };
7843f558af01643787d209a133215b0abec81b5fe30Anna Zaks
7853f558af01643787d209a133215b0abec81b5fe30Anna Zaks  llvm_unreachable("The while loop should always terminate.");
7863f558af01643787d209a133215b0abec81b5fe30Anna Zaks}
7873f558af01643787d209a133215b0abec81b5fe30Anna Zaks
788ddc0c4814788dda4ef224cd4d22d07154a6ede49Ted KremenekRuntimeDefinition ObjCMethodCall::getRuntimeDefinition() const {
7892d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks  const ObjCMessageExpr *E = getOriginExpr();
7902d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks  assert(E);
791f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks  Selector Sel = E->getSelector();
7922d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks
7932d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks  if (E->isInstanceMessage()) {
794f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks
795f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    // Find the the receiver type.
796f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    const ObjCObjectPointerType *ReceiverT = 0;
79754918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks    bool CanBeSubClassed = false;
798f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    QualType SupersType = E->getSuperType();
799e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks    const MemRegion *Receiver = 0;
800e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks
801f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    if (!SupersType.isNull()) {
802e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks      // Super always means the type of immediate predecessor to the method
803e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks      // where the call occurs.
8048ed21ef726be89ef7151b5ff397631379bd8a537Anna Zaks      ReceiverT = cast<ObjCObjectPointerType>(SupersType);
805f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    } else {
806e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks      Receiver = getReceiverSVal().getAsRegion();
8074fe64ad383c056774087113561063429103ac9a6Jordan Rose      if (!Receiver)
808e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks        return RuntimeDefinition();
8094fe64ad383c056774087113561063429103ac9a6Jordan Rose
81054918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks      DynamicTypeInfo DTI = getState()->getDynamicTypeInfo(Receiver);
81154918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks      QualType DynType = DTI.getType();
81254918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks      CanBeSubClassed = DTI.canBeASubClass();
8138ed21ef726be89ef7151b5ff397631379bd8a537Anna Zaks      ReceiverT = dyn_cast<ObjCObjectPointerType>(DynType);
81454918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks
81554918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks      if (ReceiverT && CanBeSubClassed)
81654918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks        if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl())
81754918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks          if (!canBeOverridenInSubclass(IDecl, Sel))
81854918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks            CanBeSubClassed = false;
8199dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks    }
8209dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks
821f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    // Lookup the method implementation.
822f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks    if (ReceiverT)
8233f558af01643787d209a133215b0abec81b5fe30Anna Zaks      if (ObjCInterfaceDecl *IDecl = ReceiverT->getInterfaceDecl()) {
824bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // Repeatedly calling lookupPrivateMethod() is expensive, especially
825bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // when in many cases it returns null.  We cache the results so
826bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // that repeated queries on the same ObjCIntefaceDecl and Selector
827bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // don't incur the same cost.  On some test cases, we can see the
828bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // same query being issued thousands of times.
829bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        //
830bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // NOTE: This cache is essentially a "global" variable, but it
831bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // only gets lazily created when we get here.  The value of the
832bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // cache probably comes from it being global across ExprEngines,
833bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // where the same queries may get issued.  If we are worried about
834bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // concurrency, or possibly loading/unloading ASTs, etc., we may
835bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // need to revisit this someday.  In terms of memory, this table
836bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // stays around until clang quits, which also may be bad if we
837bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // need to release memory.
838bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        typedef std::pair<const ObjCInterfaceDecl*, Selector>
839bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek                PrivateMethodKey;
840bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        typedef llvm::DenseMap<PrivateMethodKey,
841dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie                               Optional<const ObjCMethodDecl *> >
842bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek                PrivateMethodCache;
843bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek
844bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        static PrivateMethodCache PMC;
845dc84cd5efdd3430efb22546b4ac656aa0540b210David Blaikie        Optional<const ObjCMethodDecl *> &Val = PMC[std::make_pair(IDecl, Sel)];
846bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek
847bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        // Query lookupPrivateMethod() if the cache does not hit.
848bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        if (!Val.hasValue())
849bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek          Val = IDecl->lookupPrivateMethod(Sel);
850bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek
851bf25fb1e2eaea0eadb90d1a9ce91e7d510c8972aTed Kremenek        const ObjCMethodDecl *MD = Val.getValue();
85254918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks        if (CanBeSubClassed)
85354918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks          return RuntimeDefinition(MD, Receiver);
8543f558af01643787d209a133215b0abec81b5fe30Anna Zaks        else
85554918ba02ba900c0e0bb4fd3d749b6b1ac4e50a9Anna Zaks          return RuntimeDefinition(MD, 0);
8563f558af01643787d209a133215b0abec81b5fe30Anna Zaks      }
857f0324d33967f28758f7243c7bb1a469c5a0394b6Anna Zaks
8582d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks  } else {
8592d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks    // This is a class method.
8602d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks    // If we have type info for the receiver class, we are calling via
8612d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks    // class name.
8622d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks    if (ObjCInterfaceDecl *IDecl = E->getReceiverInterface()) {
8632d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks      // Find/Return the method implementation.
8645960f4aeac9760198c80e05d70d8dadb1db0ff0eAnna Zaks      return RuntimeDefinition(IDecl->lookupPrivateClassMethod(Sel));
8652d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks    }
8669dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks  }
8672d18419a7c8f9a2975d4ed74a202de6467308ad1Anna Zaks
868e90d3f847dcce76237078b67db8895eb7a24189eAnna Zaks  return RuntimeDefinition();
8699dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks}
8709dc5167e4017ef4c8b327abb6f72225eec2e0f19Anna Zaks
871ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rosevoid ObjCMethodCall::getInitialStackFrameContents(
872ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                             const StackFrameContext *CalleeCtx,
873ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                                             BindingsTy &Bindings) const {
874ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  const ObjCMethodDecl *D = cast<ObjCMethodDecl>(CalleeCtx->getDecl());
875ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  SValBuilder &SVB = getState()->getStateManager().getSValBuilder();
876ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  addParameterValuesToBindings(CalleeCtx, Bindings, SVB, *this,
877ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose                               D->param_begin(), D->param_end());
878ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
879ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  SVal SelfVal = getReceiverSVal();
880ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  if (!SelfVal.isUnknown()) {
881ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    const VarDecl *SelfD = CalleeCtx->getAnalysisDeclContext()->getSelfDecl();
882ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    MemRegionManager &MRMgr = SVB.getRegionManager();
883ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    Loc SelfLoc = SVB.makeLoc(MRMgr.getVarRegion(SelfD, CalleeCtx));
884ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose    Bindings.push_back(std::make_pair(SelfLoc, SelfVal));
885ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose  }
886ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose}
887ef15831780b705475e7b237ac16418e9b53cb7a6Jordan Rose
888645baeed6800f952e9ad1d5666e01080385531a2Jordan RoseCallEventRef<>
889d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan RoseCallEventManager::getSimpleCall(const CallExpr *CE, ProgramStateRef State,
890d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose                                const LocationContext *LCtx) {
891d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  if (const CXXMemberCallExpr *MCE = dyn_cast<CXXMemberCallExpr>(CE))
892d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<CXXMemberCall>(MCE, State, LCtx);
893d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
894d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  if (const CXXOperatorCallExpr *OpCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
895d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    const FunctionDecl *DirectCallee = OpCE->getDirectCallee();
896d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(DirectCallee))
897d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose      if (MD->isInstance())
898d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose        return create<CXXMemberOperatorCall>(OpCE, State, LCtx);
899d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
900d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  } else if (CE->getCallee()->getType()->isBlockPointerType()) {
901d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose    return create<BlockCall>(CE, State, LCtx);
902d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  }
903d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose
904d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  // Otherwise, it's a normal function call, static member function call, or
905d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  // something we can't reason about.
906d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose  return create<FunctionCall>(CE, State, LCtx);
907d563d3fb73879df7147b8a5302c3bf0e1402ba18Jordan Rose}
90857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
90957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
91057c033621dacd8720ac9ff65a09025f14f70e22fJordan RoseCallEventRef<>
91157c033621dacd8720ac9ff65a09025f14f70e22fJordan RoseCallEventManager::getCaller(const StackFrameContext *CalleeCtx,
91257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose                            ProgramStateRef State) {
91357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  const LocationContext *ParentCtx = CalleeCtx->getParent();
91457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  const LocationContext *CallerCtx = ParentCtx->getCurrentStackFrame();
91557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  assert(CallerCtx && "This should not be used for top-level stack frames");
91657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
91757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  const Stmt *CallSite = CalleeCtx->getCallSite();
91857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
91957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  if (CallSite) {
92057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    if (const CallExpr *CE = dyn_cast<CallExpr>(CallSite))
92157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return getSimpleCall(CE, State, CallerCtx);
92257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
92357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    switch (CallSite->getStmtClass()) {
924827eeb63614309bafac9d77a5a3a7ca81f1e4751Jordan Rose    case Stmt::CXXConstructExprClass:
925827eeb63614309bafac9d77a5a3a7ca81f1e4751Jordan Rose    case Stmt::CXXTemporaryObjectExprClass: {
92657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      SValBuilder &SVB = State->getStateManager().getSValBuilder();
92757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      const CXXMethodDecl *Ctor = cast<CXXMethodDecl>(CalleeCtx->getDecl());
92857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      Loc ThisPtr = SVB.getCXXThis(Ctor, CalleeCtx);
92957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      SVal ThisVal = State->getSVal(ThisPtr);
93057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
93157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return getCXXConstructorCall(cast<CXXConstructExpr>(CallSite),
93257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose                                   ThisVal.getAsRegion(), State, CallerCtx);
93357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    }
93457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    case Stmt::CXXNewExprClass:
93557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return getCXXAllocatorCall(cast<CXXNewExpr>(CallSite), State, CallerCtx);
93657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    case Stmt::ObjCMessageExprClass:
93757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      return getObjCMethodCall(cast<ObjCMessageExpr>(CallSite),
93857c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose                               State, CallerCtx);
93957c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    default:
94057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose      llvm_unreachable("This is not an inlineable statement.");
94157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    }
94257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  }
94357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
94457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // Fall back to the CFG. The only thing we haven't handled yet is
94557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  // destructors, though this could change in the future.
94657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  const CFGBlock *B = CalleeCtx->getCallSiteBlock();
94757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  CFGElement E = (*B)[CalleeCtx->getIndex()];
948fdf6a279c9a75c778eba382d9a156697092982a1David Blaikie  assert(E.getAs<CFGImplicitDtor>() &&
949fdf6a279c9a75c778eba382d9a156697092982a1David Blaikie         "All other CFG elements should have exprs");
950fdf6a279c9a75c778eba382d9a156697092982a1David Blaikie  assert(!E.getAs<CFGTemporaryDtor>() && "We don't handle temporaries yet");
95157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
95257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  SValBuilder &SVB = State->getStateManager().getSValBuilder();
95357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  const CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(CalleeCtx->getDecl());
95457c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  Loc ThisPtr = SVB.getCXXThis(Dtor, CalleeCtx);
95557c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  SVal ThisVal = State->getSVal(ThisPtr);
95657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
95757c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  const Stmt *Trigger;
958b07805485c603be3d8011f72611465324c9e664bDavid Blaikie  if (Optional<CFGAutomaticObjDtor> AutoDtor = E.getAs<CFGAutomaticObjDtor>())
959b07805485c603be3d8011f72611465324c9e664bDavid Blaikie    Trigger = AutoDtor->getTriggerStmt();
96057c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  else
96157c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose    Trigger = Dtor->getBody();
96257c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose
96357c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose  return getCXXDestructorCall(Dtor, Trigger, ThisVal.getAsRegion(),
964b07805485c603be3d8011f72611465324c9e664bDavid Blaikie                              E.getAs<CFGBaseDtor>().hasValue(), State,
965b07805485c603be3d8011f72611465324c9e664bDavid Blaikie                              CallerCtx);
96657c033621dacd8720ac9ff65a09025f14f70e22fJordan Rose}
967