15b955920c1d8f2cd35aae3c85b656578286a8bc1Anders Carlsson//===--- CGExprCXX.cpp - Emit LLVM Code for C++ expressions ---------------===//
216d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//
316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//                     The LLVM Compiler Infrastructure
416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//
516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson// This file is distributed under the University of Illinois Open Source
616d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson// License. See LICENSE.TXT for details.
716d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//
816d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//===----------------------------------------------------------------------===//
916d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//
1016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson// This contains code dealing with code generation of C++ expressions
1116d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//
1216d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson//===----------------------------------------------------------------------===//
1316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson#include "CodeGenFunction.h"
156c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne#include "CGCUDARuntime.h"
164c40d98ab7acf5f27fa89b17bd8fc0ef7683df37John McCall#include "CGCXXABI.h"
17c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel#include "CGDebugInfo.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "CGObjCRuntime.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Frontend/CodeGenOptions.h"
203b844ba7d5be205a9b4f5f0b0d1b7978977f4b8cChandler Carruth#include "llvm/IR/Intrinsics.h"
21ad3692bbe1874abafae1757a2b9d3bfa2249dc43Anders Carlsson#include "llvm/Support/CallSite.h"
22ad3692bbe1874abafae1757a2b9d3bfa2249dc43Anders Carlsson
2316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlssonusing namespace clang;
2416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlssonusing namespace CodeGen;
2516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
263b5ad2283c999f6edf7d42332a655447b7386b2eAnders CarlssonRValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD,
274def70d3040e73707c738f7c366737a986135edfRichard Smith                                          SourceLocation CallLoc,
283b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                          llvm::Value *Callee,
293b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                          ReturnValueSlot ReturnValue,
303b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                          llvm::Value *This,
3159660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov                                          llvm::Value *ImplicitParam,
3259660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov                                          QualType ImplicitParamTy,
333b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                          CallExpr::const_arg_iterator ArgBeg,
343b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                          CallExpr::const_arg_iterator ArgEnd) {
353b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  assert(MD->isInstance() &&
363b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson         "Trying to emit a member call expr on a static method!");
373b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
382c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith  // C++11 [class.mfct.non-static]p2:
392c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith  //   If a non-static member function of a class X is called for an object that
402c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith  //   is not of type X, or of a type derived from X, the behavior is undefined.
418e1cee6f23e2552b96b81e5ef419ab3f69c5b5c2Richard Smith  EmitTypeCheck(isa<CXXConstructorDecl>(MD) ? TCK_ConstructorCall
428e1cee6f23e2552b96b81e5ef419ab3f69c5b5c2Richard Smith                                            : TCK_MemberCall,
438e1cee6f23e2552b96b81e5ef419ab3f69c5b5c2Richard Smith                CallLoc, This, getContext().getRecordType(MD->getParent()));
442c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith
453b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  CallArgList Args;
463b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
473b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // Push the this ptr.
4804c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman  Args.add(RValue::get(This), MD->getThisType(getContext()));
493b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
5059660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov  // If there is an implicit parameter (e.g. VTT), emit it.
5159660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov  if (ImplicitParam) {
5259660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov    Args.add(RValue::get(ImplicitParam), ImplicitParamTy);
53c997d4278d329e18891aac9698fb991b2d4622ebAnders Carlsson  }
54de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall
55de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall  const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
56de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall  RequiredArgs required = RequiredArgs::forPrototypePlus(FPT, Args.size());
57c997d4278d329e18891aac9698fb991b2d4622ebAnders Carlsson
58de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall  // And the rest of the call args.
593b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
603b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
610f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall  return EmitCall(CGM.getTypes().arrangeCXXMethodCall(Args, FPT, required),
62264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                  Callee, ReturnValue, Args, MD);
633b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson}
643b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
65cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson// FIXME: Ideally Expr::IgnoreParenNoopCasts should do this, but it doesn't do
66cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson// quite what we want.
67cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlssonstatic const Expr *skipNoOpCastsAndParens(const Expr *E) {
68cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson  while (true) {
69cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    if (const ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
70cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson      E = PE->getSubExpr();
71cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson      continue;
72cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    }
73cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson
74cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    if (const CastExpr *CE = dyn_cast<CastExpr>(E)) {
75cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson      if (CE->getCastKind() == CK_NoOp) {
76cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson        E = CE->getSubExpr();
77cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson        continue;
78cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson      }
79cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    }
80cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
81cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson      if (UO->getOpcode() == UO_Extension) {
82cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson        E = UO->getSubExpr();
83cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson        continue;
84cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson      }
85cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    }
86cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson    return E;
87cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson  }
88cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson}
89cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson
903b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson/// canDevirtualizeMemberFunctionCalls - Checks whether virtual calls on given
913b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson/// expr can be devirtualized.
927ac0ff2a8791280102a557761dbb931deb21a1dcFariborz Jahanianstatic bool canDevirtualizeMemberFunctionCalls(ASTContext &Context,
937ac0ff2a8791280102a557761dbb931deb21a1dcFariborz Jahanian                                               const Expr *Base,
94bd2bfae2a6e5dc264e1f13183ad2ac11095766bbAnders Carlsson                                               const CXXMethodDecl *MD) {
95bd2bfae2a6e5dc264e1f13183ad2ac11095766bbAnders Carlsson
961679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // When building with -fapple-kext, all calls must go through the vtable since
971679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // the kernel linker can do runtime patching of vtables.
984e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (Context.getLangOpts().AppleKext)
997ac0ff2a8791280102a557761dbb931deb21a1dcFariborz Jahanian    return false;
1007ac0ff2a8791280102a557761dbb931deb21a1dcFariborz Jahanian
1011679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // If the most derived class is marked final, we know that no subclass can
1021679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // override this member function and so we can devirtualize it. For example:
1031679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  //
1041679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // struct A { virtual void f(); }
1051679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // struct B final : A { };
1061679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  //
1071679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // void f(B *b) {
1081679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  //   b->f();
1091679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  // }
1101679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  //
1118d852e35adb46e0799538dfc9c80d44f27cd3597Rafael Espindola  const CXXRecordDecl *MostDerivedClassDecl = Base->getBestDynamicClassType();
1121679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson  if (MostDerivedClassDecl->hasAttr<FinalAttr>())
1131679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson    return true;
1141679f5a84ae1e578b0de347c89eaf31e0465f33cAnders Carlsson
115f89e0424b8903438179f4a2f16dddd5e5bdc814eAnders Carlsson  // If the member function is marked 'final', we know that it can't be
116d66f42856539bf1c764c13fba41758228fc4cb9bAnders Carlsson  // overridden and can therefore devirtualize it.
117cb88a1f968c3d4eb451dafb421a8d9578edcbf1aAnders Carlsson  if (MD->hasAttr<FinalAttr>())
118bd2bfae2a6e5dc264e1f13183ad2ac11095766bbAnders Carlsson    return true;
119d66f42856539bf1c764c13fba41758228fc4cb9bAnders Carlsson
120f89e0424b8903438179f4a2f16dddd5e5bdc814eAnders Carlsson  // Similarly, if the class itself is marked 'final' it can't be overridden
121f89e0424b8903438179f4a2f16dddd5e5bdc814eAnders Carlsson  // and we can therefore devirtualize the member function call.
122cb88a1f968c3d4eb451dafb421a8d9578edcbf1aAnders Carlsson  if (MD->getParent()->hasAttr<FinalAttr>())
123d66f42856539bf1c764c13fba41758228fc4cb9bAnders Carlsson    return true;
124d66f42856539bf1c764c13fba41758228fc4cb9bAnders Carlsson
125cd0b32e73a66a20a8dab7a7f0ce963dc669f7c0aAnders Carlsson  Base = skipNoOpCastsAndParens(Base);
1263b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
1273b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
1283b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson      // This is a record decl. We know the type and can devirtualize it.
1293b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson      return VD->getType()->isRecordType();
1303b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    }
1313b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
1323b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    return false;
1333b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  }
134ac45293276030400195133225d54ddcb3644ea20Richard Smith
135ac45293276030400195133225d54ddcb3644ea20Richard Smith  // We can devirtualize calls on an object accessed by a class member access
136ac45293276030400195133225d54ddcb3644ea20Richard Smith  // expression, since by C++11 [basic.life]p6 we know that it can't refer to
137ac45293276030400195133225d54ddcb3644ea20Richard Smith  // a derived class object constructed in the same location.
138ac45293276030400195133225d54ddcb3644ea20Richard Smith  if (const MemberExpr *ME = dyn_cast<MemberExpr>(Base))
139ac45293276030400195133225d54ddcb3644ea20Richard Smith    if (const ValueDecl *VD = dyn_cast<ValueDecl>(ME->getMemberDecl()))
140ac45293276030400195133225d54ddcb3644ea20Richard Smith      return VD->getType()->isRecordType();
141ac45293276030400195133225d54ddcb3644ea20Richard Smith
1423b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // We can always devirtualize calls on temporary object expressions.
1436997aae42800d95a1189a6186af438feb19ecc54Eli Friedman  if (isa<CXXConstructExpr>(Base))
1443b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    return true;
1453b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
1463b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // And calls on bound temporaries.
1473b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  if (isa<CXXBindTemporaryExpr>(Base))
1483b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    return true;
1493b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
1503b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // Check if this is a call expr that returns a record type.
1513b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  if (const CallExpr *CE = dyn_cast<CallExpr>(Base))
1523b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    return CE->getCallReturnType()->isRecordType();
153bd2bfae2a6e5dc264e1f13183ad2ac11095766bbAnders Carlsson
1543b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // We can't devirtualize the call.
1553b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  return false;
1563b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson}
1573b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
158ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindolastatic CXXRecordDecl *getCXXRecord(const Expr *E) {
159ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  QualType T = E->getType();
160ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  if (const PointerType *PTy = T->getAs<PointerType>())
161ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    T = PTy->getPointeeType();
162ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  const RecordType *Ty = T->castAs<RecordType>();
163ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  return cast<CXXRecordDecl>(Ty->getDecl());
164ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola}
165ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola
166dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet// Note: This function also emit constructor calls to support a MSVC
167dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet// extensions allowing explicit constructor function call.
1683b5ad2283c999f6edf7d42332a655447b7386b2eAnders CarlssonRValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE,
1693b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                              ReturnValueSlot ReturnValue) {
170379b5155b4566f63679e1da6b0ceb5fdfa2aec6dJohn McCall  const Expr *callee = CE->getCallee()->IgnoreParens();
171379b5155b4566f63679e1da6b0ceb5fdfa2aec6dJohn McCall
172379b5155b4566f63679e1da6b0ceb5fdfa2aec6dJohn McCall  if (isa<BinaryOperator>(callee))
1733b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    return EmitCXXMemberPointerCallExpr(CE, ReturnValue);
174379b5155b4566f63679e1da6b0ceb5fdfa2aec6dJohn McCall
175379b5155b4566f63679e1da6b0ceb5fdfa2aec6dJohn McCall  const MemberExpr *ME = cast<MemberExpr>(callee);
1763b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
1773b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
178c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel  CGDebugInfo *DI = getDebugInfo();
1794cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor  if (DI &&
1804cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor      CGM.getCodeGenOpts().getDebugInfo() == CodeGenOptions::LimitedDebugInfo &&
1814cdad3151bfb2075c6bdbfe89fbb08f31a90a45bDouglas Gregor      !isa<CallExpr>(ME->getBase())) {
182c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel    QualType PQTy = ME->getBase()->IgnoreParenImpCasts()->getType();
183c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel    if (const PointerType * PTy = dyn_cast<PointerType>(PQTy)) {
184c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel      DI->getOrCreateRecordType(PTy->getPointeeType(),
185c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel                                MD->getParent()->getLocation());
186c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel    }
187c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel  }
188c69e1cf04323f2e786d40e8a5ba84e77ee1c6827Devang Patel
1893b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  if (MD->isStatic()) {
1903b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    // The method is static, emit it as we would a regular call.
1913b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    llvm::Value *Callee = CGM.GetAddrOfFunction(MD);
1923b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    return EmitCall(getContext().getPointerType(MD->getType()), Callee,
1933b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                    ReturnValue, CE->arg_begin(), CE->arg_end());
1943b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  }
1953b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
196fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall  // Compute the object pointer.
197632fbaa22fbed7c090eb83775731bfff786c2198Rafael Espindola  const Expr *Base = ME->getBase();
198632fbaa22fbed7c090eb83775731bfff786c2198Rafael Espindola  bool CanUseVirtualCall = MD->isVirtual() && !ME->hasQualifier();
199632fbaa22fbed7c090eb83775731bfff786c2198Rafael Espindola
200ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  const CXXMethodDecl *DevirtualizedMethod = NULL;
201ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  if (CanUseVirtualCall &&
202ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      canDevirtualizeMemberFunctionCalls(getContext(), Base, MD)) {
203ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
204ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    DevirtualizedMethod = MD->getCorrespondingMethodInClass(BestDynamicDecl);
205ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    assert(DevirtualizedMethod);
206ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    const CXXRecordDecl *DevirtualizedClass = DevirtualizedMethod->getParent();
207ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    const Expr *Inner = Base->ignoreParenBaseCasts();
208ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    if (getCXXRecord(Inner) == DevirtualizedClass)
209ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      // If the class of the Inner expression is where the dynamic method
210ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      // is defined, build the this pointer from it.
211ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      Base = Inner;
212ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    else if (getCXXRecord(Base) != DevirtualizedClass) {
213ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      // If the method is defined in a class that is not the best dynamic
214ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      // one or the one of the full expression, we would have to build
215ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      // a derived-to-base cast to compute the correct this pointer, but
216ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      // we don't have support for that yet, so do a virtual call.
217ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      DevirtualizedMethod = NULL;
218ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    }
21980bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola    // If the return types are not the same, this might be a case where more
22080bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola    // code needs to run to compensate for it. For example, the derived
22180bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola    // method might return a type that inherits form from the return
22280bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola    // type of MD and has a prefix.
22380bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola    // For now we just avoid devirtualizing these covariant cases.
22480bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola    if (DevirtualizedMethod &&
22580bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola        DevirtualizedMethod->getResultType().getCanonicalType() !=
22680bc96e6aa9bc8331473385150cff5e0db305da6Rafael Espindola        MD->getResultType().getCanonicalType())
2274a889e47bd5a8d08a705a87962a35a504728d7f6Rafael Espindola      DevirtualizedMethod = NULL;
228ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  }
229632fbaa22fbed7c090eb83775731bfff786c2198Rafael Espindola
2303b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  llvm::Value *This;
2313b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  if (ME->isArrow())
232ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    This = EmitScalarExpr(Base);
2330e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  else
234ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    This = EmitLValue(Base).getAddress();
235632fbaa22fbed7c090eb83775731bfff786c2198Rafael Espindola
2363b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
237fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall  if (MD->isTrivial()) {
238fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall    if (isa<CXXDestructorDecl>(MD)) return RValue::get(0);
239dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    if (isa<CXXConstructorDecl>(MD) &&
240dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet        cast<CXXConstructorDecl>(MD)->isDefaultConstructor())
241dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet      return RValue::get(0);
242dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
24385ea7aa961deac1d754f610af8062ae3f8b4e2a5Sebastian Redl    if (MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) {
24485ea7aa961deac1d754f610af8062ae3f8b4e2a5Sebastian Redl      // We don't like to generate the trivial copy/move assignment operator
24585ea7aa961deac1d754f610af8062ae3f8b4e2a5Sebastian Redl      // when it isn't necessary; just produce the proper effect here.
246dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet      llvm::Value *RHS = EmitLValue(*CE->arg_begin()).getAddress();
2476cacae8bf9597b8124cd40aedc189c04484e1990Benjamin Kramer      EmitAggregateAssign(This, RHS, CE->getType());
248dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet      return RValue::get(This);
249dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    }
250dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet
251dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    if (isa<CXXConstructorDecl>(MD) &&
25285ea7aa961deac1d754f610af8062ae3f8b4e2a5Sebastian Redl        cast<CXXConstructorDecl>(MD)->isCopyOrMoveConstructor()) {
25385ea7aa961deac1d754f610af8062ae3f8b4e2a5Sebastian Redl      // Trivial move and copy ctor are the same.
254dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet      llvm::Value *RHS = EmitLValue(*CE->arg_begin()).getAddress();
255dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet      EmitSynthesizedCXXCopyCtorCall(cast<CXXConstructorDecl>(MD), This, RHS,
256dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet                                     CE->arg_begin(), CE->arg_end());
257dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet      return RValue::get(This);
258dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    }
259dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    llvm_unreachable("unknown trivial member function");
2603b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  }
2613b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
262fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall  // Compute the function type we're calling.
263465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman  const CXXMethodDecl *CalleeDecl = DevirtualizedMethod ? DevirtualizedMethod : MD;
264dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  const CGFunctionInfo *FInfo = 0;
265465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman  if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(CalleeDecl))
266465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman    FInfo = &CGM.getTypes().arrangeCXXDestructor(Dtor,
267de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall                                                 Dtor_Complete);
268465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman  else if (const CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(CalleeDecl))
269465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman    FInfo = &CGM.getTypes().arrangeCXXConstructorDeclaration(Ctor,
270465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman                                                             Ctor_Complete);
271dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  else
272465e89e094004a2ff53ba930ca0c4b41e51299baEli Friedman    FInfo = &CGM.getTypes().arrangeCXXMethodDeclaration(CalleeDecl);
273fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall
274de5d3c717684f3821b8db58037bc7140acf134aaJohn McCall  llvm::Type *Ty = CGM.getTypes().GetFunctionType(*FInfo);
275fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall
2763b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // C++ [class.virtual]p12:
2773b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  //   Explicit qualification with the scope operator (5.1) suppresses the
2783b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  //   virtual call mechanism.
2793b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  //
2803b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // We also don't emit a virtual call if the base expression has a record type
2813b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // because then we know what the type is.
282ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola  bool UseVirtualCall = CanUseVirtualCall && !DevirtualizedMethod;
2830b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola
2843b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  llvm::Value *Callee;
285fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall  if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(MD)) {
286fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall    if (UseVirtualCall) {
2870f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov      assert(CE->arg_begin() == CE->arg_end() &&
2880f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov             "Virtual destructor shouldn't have explicit parameters");
2890f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov      return CGM.getCXXABI().EmitVirtualDestructorCall(*this, Dtor,
2900f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov                                                       Dtor_Complete,
2910f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov                                                       CE->getExprLoc(),
2920f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov                                                       ReturnValue, This);
2933b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    } else {
2947edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith      if (getLangOpts().AppleKext &&
295ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian          MD->isVirtual() &&
296ccd5259d33cbbdd6f5fbf7ccab4cb4a2702309eaFariborz Jahanian          ME->hasQualifier())
297771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian        Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), Ty);
298ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      else if (!DevirtualizedMethod)
29912582bdc2e1fca260eb2437d87dab5302c37bab2Rafael Espindola        Callee = CGM.GetAddrOfFunction(GlobalDecl(Dtor, Dtor_Complete), Ty);
3000b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      else {
301ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola        const CXXDestructorDecl *DDtor =
302ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola          cast<CXXDestructorDecl>(DevirtualizedMethod);
3030b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola        Callee = CGM.GetAddrOfFunction(GlobalDecl(DDtor, Dtor_Complete), Ty);
3040b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola      }
3053b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    }
306dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet  } else if (const CXXConstructorDecl *Ctor =
307dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet               dyn_cast<CXXConstructorDecl>(MD)) {
308dbee3411a22b0dbb03267f5445f7b796104991bbFrancois Pichet    Callee = CGM.GetAddrOfFunction(GlobalDecl(Ctor, Ctor_Complete), Ty);
309fc4002872864e3c29c896000519ae989b6fdb7ddJohn McCall  } else if (UseVirtualCall) {
3102726267f094a0c1f5ac5b501ec5a9898c58876bfFariborz Jahanian      Callee = BuildVirtualCall(MD, This, Ty);
3113b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  } else {
3127edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith    if (getLangOpts().AppleKext &&
313a50e33eb0ff7b73d44aebce88de3732583a7e960Fariborz Jahanian        MD->isVirtual() &&
3147ac0ff2a8791280102a557761dbb931deb21a1dcFariborz Jahanian        ME->hasQualifier())
315771c678c04f5f685b4f188ec6c2fd88ad0f7457fFariborz Jahanian      Callee = BuildAppleKextVirtualCall(MD, ME->getQualifier(), Ty);
316ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola    else if (!DevirtualizedMethod)
31712582bdc2e1fca260eb2437d87dab5302c37bab2Rafael Espindola      Callee = CGM.GetAddrOfFunction(MD, Ty);
3180b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    else {
319ea01d7661751e062bb670cc1a0bdfee5789cb96fRafael Espindola      Callee = CGM.GetAddrOfFunction(DevirtualizedMethod, Ty);
3200b4fe503ef00d9f8ea330850d3e3b303e9c7c876Rafael Espindola    }
3213b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  }
3223b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3234def70d3040e73707c738f7c366737a986135edfRichard Smith  return EmitCXXMemberCall(MD, CE->getExprLoc(), Callee, ReturnValue, This,
32459660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov                           /*ImplicitParam=*/0, QualType(),
32559660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov                           CE->arg_begin(), CE->arg_end());
3263b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson}
3273b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3283b5ad2283c999f6edf7d42332a655447b7386b2eAnders CarlssonRValue
3293b5ad2283c999f6edf7d42332a655447b7386b2eAnders CarlssonCodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
3303b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                              ReturnValueSlot ReturnValue) {
3313b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const BinaryOperator *BO =
3323b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson      cast<BinaryOperator>(E->getCallee()->IgnoreParens());
3333b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const Expr *BaseExpr = BO->getLHS();
3343b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const Expr *MemFnExpr = BO->getRHS();
3353b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3363b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const MemberPointerType *MPT =
337864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    MemFnExpr->getType()->castAs<MemberPointerType>();
33893d557bc1867b7d7b102f87290194b4be7932c92John McCall
3393b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const FunctionProtoType *FPT =
340864c041e118155c2b1ce0ba36942a3da5a4a055eJohn McCall    MPT->getPointeeType()->castAs<FunctionProtoType>();
3413b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const CXXRecordDecl *RD =
3423b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
3433b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3443b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // Get the member function pointer.
345d608cdb7c044365cf4e8764ade1e11e99c176078John McCall  llvm::Value *MemFnPtr = EmitScalarExpr(MemFnExpr);
3463b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3473b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // Emit the 'this' pointer.
3483b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  llvm::Value *This;
3493b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3502de56d1d0c3a504ad1529de2677628bdfbb95cd4John McCall  if (BO->getOpcode() == BO_PtrMemI)
3513b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    This = EmitScalarExpr(BaseExpr);
3523b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  else
3533b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    This = EmitLValue(BaseExpr).getAddress();
3543b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3554def70d3040e73707c738f7c366737a986135edfRichard Smith  EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This,
3564def70d3040e73707c738f7c366737a986135edfRichard Smith                QualType(MPT->getClass(), 0));
3572c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith
35893d557bc1867b7d7b102f87290194b4be7932c92John McCall  // Ask the ABI to load the callee.  Note that This is modified.
35993d557bc1867b7d7b102f87290194b4be7932c92John McCall  llvm::Value *Callee =
360d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall    CGM.getCXXABI().EmitLoadOfMemberFunctionPointer(*this, This, MemFnPtr, MPT);
3613b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3623b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  CallArgList Args;
3633b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3643b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  QualType ThisType =
3653b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    getContext().getPointerType(getContext().getTagDeclType(RD));
3663b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3673b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // Push the this ptr.
36804c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman  Args.add(RValue::get(This), ThisType);
3690f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall
3700f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall  RequiredArgs required = RequiredArgs::forPrototypePlus(FPT, 1);
3713b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3723b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  // And the rest of the call args
3733b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  EmitCallArgs(Args, FPT, E->arg_begin(), E->arg_end());
3740f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall  return EmitCall(CGM.getTypes().arrangeCXXMethodCall(Args, FPT, required), Callee,
3759c6082fe89c61af697f017aa80937581cc2128d8Tilmann Scheller                  ReturnValue, Args);
3763b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson}
3773b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
3783b5ad2283c999f6edf7d42332a655447b7386b2eAnders CarlssonRValue
3793b5ad2283c999f6edf7d42332a655447b7386b2eAnders CarlssonCodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
3803b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                               const CXXMethodDecl *MD,
3813b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                                               ReturnValueSlot ReturnValue) {
3823b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  assert(MD->isInstance() &&
3833b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson         "Trying to emit a member call expr on a static method!");
3840e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  LValue LV = EmitLValue(E->getArg(0));
3850e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall  llvm::Value *This = LV.getAddress();
3860e800c9c20d1a658a91096c756c4a4a9e90264fcJohn McCall
387b2b5658a8e4ad566303ec98caceaa3485e7635f7Douglas Gregor  if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) &&
388b2b5658a8e4ad566303ec98caceaa3485e7635f7Douglas Gregor      MD->isTrivial()) {
389b2b5658a8e4ad566303ec98caceaa3485e7635f7Douglas Gregor    llvm::Value *Src = EmitLValue(E->getArg(1)).getAddress();
390b2b5658a8e4ad566303ec98caceaa3485e7635f7Douglas Gregor    QualType Ty = E->getType();
3916cacae8bf9597b8124cd40aedc189c04484e1990Benjamin Kramer    EmitAggregateAssign(This, Src, Ty);
392b2b5658a8e4ad566303ec98caceaa3485e7635f7Douglas Gregor    return RValue::get(This);
3933b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  }
3943b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
395a2447e0d1e28669cd637204a871f15b1215277fdAnders Carlsson  llvm::Value *Callee = EmitCXXOperatorMemberCallee(E, MD, This);
3964def70d3040e73707c738f7c366737a986135edfRichard Smith  return EmitCXXMemberCall(MD, E->getExprLoc(), Callee, ReturnValue, This,
39759660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov                           /*ImplicitParam=*/0, QualType(),
39859660c21178b6af518bd4b564e032d5c9cc218cbTimur Iskhodzhanov                           E->arg_begin() + 1, E->arg_end());
3993b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson}
4003b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
4016c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter CollingbourneRValue CodeGenFunction::EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E,
4026c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne                                               ReturnValueSlot ReturnValue) {
4036c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne  return CGM.getCUDARuntime().EmitCUDAKernelCallExpr(*this, E, ReturnValue);
4046c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne}
4056c0aa5ff6e6253db0f993053599e2a52b5b93b2dPeter Collingbourne
4062ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedmanstatic void EmitNullBaseClassInitialization(CodeGenFunction &CGF,
4072ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman                                            llvm::Value *DestPtr,
4082ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman                                            const CXXRecordDecl *Base) {
4092ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  if (Base->isEmpty())
4102ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    return;
4112ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4122ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  DestPtr = CGF.EmitCastToVoidPtr(DestPtr);
4132ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4142ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
4152ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  CharUnits Size = Layout.getNonVirtualSize();
4162ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  CharUnits Align = Layout.getNonVirtualAlign();
4172ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4182ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  llvm::Value *SizeVal = CGF.CGM.getSize(Size);
4192ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4202ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // If the type contains a pointer to data member we can't memset it to zero.
4212ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // Instead, create a null constant and copy it to the destination.
4222ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // TODO: there are other patterns besides zero that we can usefully memset,
4232ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // like -1, which happens to be the pattern used by member-pointers.
4242ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // TODO: isZeroInitializable can be over-conservative in the case where a
4252ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // virtual base contains a member pointer.
4262ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  if (!CGF.CGM.getTypes().isZeroInitializable(Base)) {
4272ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    llvm::Constant *NullConstant = CGF.CGM.EmitNullConstantForBase(Base);
4282ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4292ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    llvm::GlobalVariable *NullVariable =
4302ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman      new llvm::GlobalVariable(CGF.CGM.getModule(), NullConstant->getType(),
4312ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman                               /*isConstant=*/true,
4322ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman                               llvm::GlobalVariable::PrivateLinkage,
4332ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman                               NullConstant, Twine());
4342ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    NullVariable->setAlignment(Align.getQuantity());
4352ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    llvm::Value *SrcPtr = CGF.EmitCastToVoidPtr(NullVariable);
4362ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4372ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    // Get and call the appropriate llvm.memcpy overload.
4382ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    CGF.Builder.CreateMemCpy(DestPtr, SrcPtr, SizeVal, Align.getQuantity());
4392ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    return;
4402ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  }
4412ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4422ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // Otherwise, just memset the whole thing to zero.  This is legal
4432ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // because in LLVM, all default initializers (other than the ones we just
4442ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  // handled above) are guaranteed to have a bit pattern of all zeros.
4452ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  CGF.Builder.CreateMemSet(DestPtr, CGF.Builder.getInt8(0), SizeVal,
4462ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman                           Align.getQuantity());
4472ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman}
4482ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman
4493b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlssonvoid
450558d2abc7f9fd6801cc7677200992313ae90b5d8John McCallCodeGenFunction::EmitCXXConstructExpr(const CXXConstructExpr *E,
451558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall                                      AggValueSlot Dest) {
452558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  assert(!Dest.isIgnored() && "Must have a destination!");
4533b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  const CXXConstructorDecl *CD = E->getConstructor();
454759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor
455759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor  // If we require zero initialization before (or instead of) calling the
456759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor  // constructor, as can be the case with a non-user-provided default
457657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis  // constructor, emit the zero initialization now, unless destination is
458657baf19ca8a48a926bd3bc148b6ad1b17e53199Argyrios Kyrtzidis  // already zeroed.
4592ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  if (E->requiresZeroInitialization() && !Dest.isZeroed()) {
4602ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    switch (E->getConstructionKind()) {
4612ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    case CXXConstructExpr::CK_Delegating:
4622ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    case CXXConstructExpr::CK_Complete:
4632ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman      EmitNullInitialization(Dest.getAddr(), E->getType());
4642ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman      break;
4652ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    case CXXConstructExpr::CK_VirtualBase:
4662ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    case CXXConstructExpr::CK_NonVirtualBase:
4672ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman      EmitNullBaseClassInitialization(*this, Dest.getAddr(), CD->getParent());
4682ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman      break;
4692ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman    }
4702ed7cb649aa709b875c519f4a980a1e2b5712370Eli Friedman  }
471759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor
472759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor  // If this is a call to a trivial default constructor, do nothing.
473759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor  if (CD->isTrivial() && CD->isDefaultConstructor())
474759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor    return;
475759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor
476fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // Elide the constructor if we're constructing from a temporary.
477fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // The temporary check is required because Sema sets this on NRVO
478fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall  // returns.
4797edf9e38b91917b661277601c0e448eef0eb2b56Richard Smith  if (getLangOpts().ElideConstructors && E->isElidable()) {
480fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall    assert(getContext().hasSameUnqualifiedType(E->getType(),
481fc1e6c79bbfe0e9a58bb792996d51f42e36e3d6aJohn McCall                                               E->getArg(0)->getType()));
482558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    if (E->getArg(0)->isTemporaryObject(getContext(), CD->getParent())) {
483558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall      EmitAggExpr(E->getArg(0), Dest);
4843c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor      return;
4853c9034cb7ff1d6c1e4ecd1b44c98f553df013c7cDouglas Gregor    }
4863b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson  }
487759e41baf6a95c3a265970b6bf1c97c233fd28b0Douglas Gregor
488c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  if (const ConstantArrayType *arrayType
489c3c0766277cd64bf117450a1519c9cf762d994d4John McCall        = getContext().getAsConstantArrayType(E->getType())) {
490c3c0766277cd64bf117450a1519c9cf762d994d4John McCall    EmitCXXAggrConstructorCall(CD, arrayType, Dest.getAddr(),
4913b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                               E->arg_begin(), E->arg_end());
492c3c0766277cd64bf117450a1519c9cf762d994d4John McCall  } else {
4936bd2f6ad857949d4dfb6e75e0760c61950b917cfCameron Esfahani    CXXCtorType Type = Ctor_Complete;
494d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt    bool ForVirtualBase = false;
495378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor    bool Delegating = false;
496378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor
497d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt    switch (E->getConstructionKind()) {
498d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt     case CXXConstructExpr::CK_Delegating:
499059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt      // We should be emitting a constructor; GlobalDecl will assert this
500059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt      Type = CurGD.getCtorType();
501378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor      Delegating = true;
502d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt      break;
503059ce0d92eb5a7da900ae735dc0a2ea3d64f4b0bSean Hunt
504d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt     case CXXConstructExpr::CK_Complete:
505d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt      Type = Ctor_Complete;
506d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt      break;
507d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt
508d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt     case CXXConstructExpr::CK_VirtualBase:
509d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt      ForVirtualBase = true;
510d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt      // fall-through
511d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt
512d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt     case CXXConstructExpr::CK_NonVirtualBase:
513d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt      Type = Ctor_Base;
514d49bd5515b89bedc57c3d1d3be457e4340dbdb1dSean Hunt    }
515155ed4a23366f4514befb1c9f5f89d16f8b8b6dbAnders Carlsson
5163b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson    // Call the constructor.
517378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor    EmitCXXConstructorCall(CD, Type, ForVirtualBase, Delegating, Dest.getAddr(),
5183b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson                           E->arg_begin(), E->arg_end());
519155ed4a23366f4514befb1c9f5f89d16f8b8b6dbAnders Carlsson  }
5203b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson}
5213b5ad2283c999f6edf7d42332a655447b7386b2eAnders Carlsson
52234999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanianvoid
52334999876e215b22febc240b1a6dc054215d12f9cFariborz JahanianCodeGenFunction::EmitSynthesizedCXXCopyCtor(llvm::Value *Dest,
52434999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian                                            llvm::Value *Src,
525830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian                                            const Expr *Exp) {
5264765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall  if (const ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(Exp))
52734999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian    Exp = E->getSubExpr();
52834999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  assert(isa<CXXConstructExpr>(Exp) &&
52934999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian         "EmitSynthesizedCXXCopyCtor - unknown copy ctor expr");
53034999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  const CXXConstructExpr* E = cast<CXXConstructExpr>(Exp);
53134999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  const CXXConstructorDecl *CD = E->getConstructor();
53234999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  RunCleanupsScope Scope(*this);
53334999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian
53434999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  // If we require zero initialization before (or instead of) calling the
53534999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  // constructor, as can be the case with a non-user-provided default
53634999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  // constructor, emit the zero initialization now.
53734999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  // FIXME. Do I still need this for a copy ctor synthesis?
53834999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  if (E->requiresZeroInitialization())
53934999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian    EmitNullInitialization(Dest, E->getType());
54034999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian
541858a546d8fe73b07f2296313bef2e30445ea164bChandler Carruth  assert(!getContext().getAsConstantArrayType(E->getType())
542858a546d8fe73b07f2296313bef2e30445ea164bChandler Carruth         && "EmitSynthesizedCXXCopyCtor - Copied-in Array");
54334999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian  EmitSynthesizedCXXCopyCtorCall(CD, Dest, Src,
54434999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian                                 E->arg_begin(), E->arg_end());
54534999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian}
54634999876e215b22febc240b1a6dc054215d12f9cFariborz Jahanian
5471e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallstatic CharUnits CalculateCookiePadding(CodeGenFunction &CGF,
5481e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                                        const CXXNewExpr *E) {
549871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  if (!E->isArray())
550caf647c33ad74621c352c21d6c50d149ba49e89dKen Dyck    return CharUnits::Zero();
551871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson
552b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // No cookie is required if the operator new[] being used is the
553b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // reserved placement operator new[].
554b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  if (E->getOperatorNew()->isReservedGlobalPlacementOperator())
5555172ed92b42f0bc6a022542a08f7b18af821bcb3John McCall    return CharUnits::Zero();
5565172ed92b42f0bc6a022542a08f7b18af821bcb3John McCall
5576ec278d1a354517e20f13a877481453ee7940c78John McCall  return CGF.CGM.getCXXABI().GetArrayCookieSize(E);
558a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson}
559a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
5607d16627081caede9691a6f46b796da4073ac14adJohn McCallstatic llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
5617d16627081caede9691a6f46b796da4073ac14adJohn McCall                                        const CXXNewExpr *e,
5629203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                                        unsigned minElements,
5637d16627081caede9691a6f46b796da4073ac14adJohn McCall                                        llvm::Value *&numElements,
5647d16627081caede9691a6f46b796da4073ac14adJohn McCall                                        llvm::Value *&sizeWithoutCookie) {
5657d16627081caede9691a6f46b796da4073ac14adJohn McCall  QualType type = e->getAllocatedType();
5667d16627081caede9691a6f46b796da4073ac14adJohn McCall
5677d16627081caede9691a6f46b796da4073ac14adJohn McCall  if (!e->isArray()) {
5687d16627081caede9691a6f46b796da4073ac14adJohn McCall    CharUnits typeSize = CGF.getContext().getTypeSizeInChars(type);
5697d16627081caede9691a6f46b796da4073ac14adJohn McCall    sizeWithoutCookie
5707d16627081caede9691a6f46b796da4073ac14adJohn McCall      = llvm::ConstantInt::get(CGF.SizeTy, typeSize.getQuantity());
5717d16627081caede9691a6f46b796da4073ac14adJohn McCall    return sizeWithoutCookie;
57259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor  }
573a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
5747d16627081caede9691a6f46b796da4073ac14adJohn McCall  // The width of size_t.
5757d16627081caede9691a6f46b796da4073ac14adJohn McCall  unsigned sizeWidth = CGF.SizeTy->getBitWidth();
5767d16627081caede9691a6f46b796da4073ac14adJohn McCall
5771e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // Figure out the cookie size.
5787d16627081caede9691a6f46b796da4073ac14adJohn McCall  llvm::APInt cookieSize(sizeWidth,
5797d16627081caede9691a6f46b796da4073ac14adJohn McCall                         CalculateCookiePadding(CGF, e).getQuantity());
5801e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
581a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson  // Emit the array size expression.
582e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  // We multiply the size of all dimensions for NumElements.
583e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  // e.g for 'int[2][3]', ElemType is 'int' and NumElements is 6.
5847d16627081caede9691a6f46b796da4073ac14adJohn McCall  numElements = CGF.EmitScalarExpr(e->getArraySize());
5857d16627081caede9691a6f46b796da4073ac14adJohn McCall  assert(isa<llvm::IntegerType>(numElements->getType()));
5867d16627081caede9691a6f46b796da4073ac14adJohn McCall
5877d16627081caede9691a6f46b796da4073ac14adJohn McCall  // The number of elements can be have an arbitrary integer type;
5887d16627081caede9691a6f46b796da4073ac14adJohn McCall  // essentially, we need to multiply it by a constant factor, add a
5897d16627081caede9691a6f46b796da4073ac14adJohn McCall  // cookie size, and verify that the result is representable as a
5907d16627081caede9691a6f46b796da4073ac14adJohn McCall  // size_t.  That's just a gloss, though, and it's wrong in one
5917d16627081caede9691a6f46b796da4073ac14adJohn McCall  // important way: if the count is negative, it's an error even if
5927d16627081caede9691a6f46b796da4073ac14adJohn McCall  // the cookie size would bring the total size >= 0.
593575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor  bool isSigned
594575a1c9dc8dc5b4977194993e289f9eda7295c39Douglas Gregor    = e->getArraySize()->getType()->isSignedIntegerOrEnumerationType();
5952acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::IntegerType *numElementsType
5967d16627081caede9691a6f46b796da4073ac14adJohn McCall    = cast<llvm::IntegerType>(numElements->getType());
5977d16627081caede9691a6f46b796da4073ac14adJohn McCall  unsigned numElementsWidth = numElementsType->getBitWidth();
5987d16627081caede9691a6f46b796da4073ac14adJohn McCall
5997d16627081caede9691a6f46b796da4073ac14adJohn McCall  // Compute the constant factor.
6007d16627081caede9691a6f46b796da4073ac14adJohn McCall  llvm::APInt arraySizeMultiplier(sizeWidth, 1);
601e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  while (const ConstantArrayType *CAT
6027d16627081caede9691a6f46b796da4073ac14adJohn McCall             = CGF.getContext().getAsConstantArrayType(type)) {
6037d16627081caede9691a6f46b796da4073ac14adJohn McCall    type = CAT->getElementType();
6047d16627081caede9691a6f46b796da4073ac14adJohn McCall    arraySizeMultiplier *= CAT->getSize();
605e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis  }
606e7ab92e1d62f9c243bbd1f42f72a7b3c2666d33eArgyrios Kyrtzidis
6077d16627081caede9691a6f46b796da4073ac14adJohn McCall  CharUnits typeSize = CGF.getContext().getTypeSizeInChars(type);
6087d16627081caede9691a6f46b796da4073ac14adJohn McCall  llvm::APInt typeSizeMultiplier(sizeWidth, typeSize.getQuantity());
6097d16627081caede9691a6f46b796da4073ac14adJohn McCall  typeSizeMultiplier *= arraySizeMultiplier;
6107d16627081caede9691a6f46b796da4073ac14adJohn McCall
6117d16627081caede9691a6f46b796da4073ac14adJohn McCall  // This will be a size_t.
6127d16627081caede9691a6f46b796da4073ac14adJohn McCall  llvm::Value *size;
6136c552c1d5f47fbba00e6268d96a26ad026f2da2aChris Lattner
614806941eab5e1d62d7676e5cdc0e1d9e397ea78b4Chris Lattner  // If someone is doing 'new int[42]' there is no need to do a dynamic check.
615806941eab5e1d62d7676e5cdc0e1d9e397ea78b4Chris Lattner  // Don't bloat the -O0 code.
6167d16627081caede9691a6f46b796da4073ac14adJohn McCall  if (llvm::ConstantInt *numElementsC =
6177d16627081caede9691a6f46b796da4073ac14adJohn McCall        dyn_cast<llvm::ConstantInt>(numElements)) {
6187d16627081caede9691a6f46b796da4073ac14adJohn McCall    const llvm::APInt &count = numElementsC->getValue();
6197d16627081caede9691a6f46b796da4073ac14adJohn McCall
6207d16627081caede9691a6f46b796da4073ac14adJohn McCall    bool hasAnyOverflow = false;
6217d16627081caede9691a6f46b796da4073ac14adJohn McCall
6227d16627081caede9691a6f46b796da4073ac14adJohn McCall    // If 'count' was a negative number, it's an overflow.
6237d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (isSigned && count.isNegative())
6247d16627081caede9691a6f46b796da4073ac14adJohn McCall      hasAnyOverflow = true;
6257d16627081caede9691a6f46b796da4073ac14adJohn McCall
6267d16627081caede9691a6f46b796da4073ac14adJohn McCall    // We want to do all this arithmetic in size_t.  If numElements is
6277d16627081caede9691a6f46b796da4073ac14adJohn McCall    // wider than that, check whether it's already too big, and if so,
6287d16627081caede9691a6f46b796da4073ac14adJohn McCall    // overflow.
6297d16627081caede9691a6f46b796da4073ac14adJohn McCall    else if (numElementsWidth > sizeWidth &&
6307d16627081caede9691a6f46b796da4073ac14adJohn McCall             numElementsWidth - sizeWidth > count.countLeadingZeros())
6317d16627081caede9691a6f46b796da4073ac14adJohn McCall      hasAnyOverflow = true;
6327d16627081caede9691a6f46b796da4073ac14adJohn McCall
6337d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Okay, compute a count at the right width.
6347d16627081caede9691a6f46b796da4073ac14adJohn McCall    llvm::APInt adjustedCount = count.zextOrTrunc(sizeWidth);
6357d16627081caede9691a6f46b796da4073ac14adJohn McCall
6369203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // If there is a brace-initializer, we cannot allocate fewer elements than
6379203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // there are initializers. If we do, that's treated like an overflow.
6389203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    if (adjustedCount.ult(minElements))
6399203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      hasAnyOverflow = true;
6409203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl
6417d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Scale numElements by that.  This might overflow, but we don't
6427d16627081caede9691a6f46b796da4073ac14adJohn McCall    // care because it only overflows if allocationSize does, too, and
6437d16627081caede9691a6f46b796da4073ac14adJohn McCall    // if that overflows then we shouldn't use this.
6447d16627081caede9691a6f46b796da4073ac14adJohn McCall    numElements = llvm::ConstantInt::get(CGF.SizeTy,
6457d16627081caede9691a6f46b796da4073ac14adJohn McCall                                         adjustedCount * arraySizeMultiplier);
6467d16627081caede9691a6f46b796da4073ac14adJohn McCall
6477d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Compute the size before cookie, and track whether it overflowed.
6487d16627081caede9691a6f46b796da4073ac14adJohn McCall    bool overflow;
6497d16627081caede9691a6f46b796da4073ac14adJohn McCall    llvm::APInt allocationSize
6507d16627081caede9691a6f46b796da4073ac14adJohn McCall      = adjustedCount.umul_ov(typeSizeMultiplier, overflow);
6517d16627081caede9691a6f46b796da4073ac14adJohn McCall    hasAnyOverflow |= overflow;
6527d16627081caede9691a6f46b796da4073ac14adJohn McCall
6537d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Add in the cookie, and check whether it's overflowed.
6547d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (cookieSize != 0) {
6557d16627081caede9691a6f46b796da4073ac14adJohn McCall      // Save the current size without a cookie.  This shouldn't be
6567d16627081caede9691a6f46b796da4073ac14adJohn McCall      // used if there was overflow.
6577d16627081caede9691a6f46b796da4073ac14adJohn McCall      sizeWithoutCookie = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
6587d16627081caede9691a6f46b796da4073ac14adJohn McCall
6597d16627081caede9691a6f46b796da4073ac14adJohn McCall      allocationSize = allocationSize.uadd_ov(cookieSize, overflow);
6607d16627081caede9691a6f46b796da4073ac14adJohn McCall      hasAnyOverflow |= overflow;
6611e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    }
6627d16627081caede9691a6f46b796da4073ac14adJohn McCall
6637d16627081caede9691a6f46b796da4073ac14adJohn McCall    // On overflow, produce a -1 so operator new will fail.
6647d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (hasAnyOverflow) {
6657d16627081caede9691a6f46b796da4073ac14adJohn McCall      size = llvm::Constant::getAllOnesValue(CGF.SizeTy);
666806941eab5e1d62d7676e5cdc0e1d9e397ea78b4Chris Lattner    } else {
6677d16627081caede9691a6f46b796da4073ac14adJohn McCall      size = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
668806941eab5e1d62d7676e5cdc0e1d9e397ea78b4Chris Lattner    }
6691e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
6707d16627081caede9691a6f46b796da4073ac14adJohn McCall  // Otherwise, we might need to use the overflow intrinsics.
6717d16627081caede9691a6f46b796da4073ac14adJohn McCall  } else {
6729203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // There are up to five conditions we need to test for:
6737d16627081caede9691a6f46b796da4073ac14adJohn McCall    // 1) if isSigned, we need to check whether numElements is negative;
6747d16627081caede9691a6f46b796da4073ac14adJohn McCall    // 2) if numElementsWidth > sizeWidth, we need to check whether
6757d16627081caede9691a6f46b796da4073ac14adJohn McCall    //   numElements is larger than something representable in size_t;
6769203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // 3) if minElements > 0, we need to check whether numElements is smaller
6779203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    //    than that.
6789203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // 4) we need to compute
6797d16627081caede9691a6f46b796da4073ac14adJohn McCall    //      sizeWithoutCookie := numElements * typeSizeMultiplier
6807d16627081caede9691a6f46b796da4073ac14adJohn McCall    //    and check whether it overflows; and
6819203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // 5) if we need a cookie, we need to compute
6827d16627081caede9691a6f46b796da4073ac14adJohn McCall    //      size := sizeWithoutCookie + cookieSize
6837d16627081caede9691a6f46b796da4073ac14adJohn McCall    //    and check whether it overflows.
6847d16627081caede9691a6f46b796da4073ac14adJohn McCall
6857d16627081caede9691a6f46b796da4073ac14adJohn McCall    llvm::Value *hasOverflow = 0;
6867d16627081caede9691a6f46b796da4073ac14adJohn McCall
6877d16627081caede9691a6f46b796da4073ac14adJohn McCall    // If numElementsWidth > sizeWidth, then one way or another, we're
6887d16627081caede9691a6f46b796da4073ac14adJohn McCall    // going to have to do a comparison for (2), and this happens to
6897d16627081caede9691a6f46b796da4073ac14adJohn McCall    // take care of (1), too.
6907d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (numElementsWidth > sizeWidth) {
6917d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::APInt threshold(numElementsWidth, 1);
6927d16627081caede9691a6f46b796da4073ac14adJohn McCall      threshold <<= sizeWidth;
6937d16627081caede9691a6f46b796da4073ac14adJohn McCall
6947d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *thresholdV
6957d16627081caede9691a6f46b796da4073ac14adJohn McCall        = llvm::ConstantInt::get(numElementsType, threshold);
6967d16627081caede9691a6f46b796da4073ac14adJohn McCall
6977d16627081caede9691a6f46b796da4073ac14adJohn McCall      hasOverflow = CGF.Builder.CreateICmpUGE(numElements, thresholdV);
6987d16627081caede9691a6f46b796da4073ac14adJohn McCall      numElements = CGF.Builder.CreateTrunc(numElements, CGF.SizeTy);
6997d16627081caede9691a6f46b796da4073ac14adJohn McCall
7007d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Otherwise, if we're signed, we want to sext up to size_t.
7017d16627081caede9691a6f46b796da4073ac14adJohn McCall    } else if (isSigned) {
7027d16627081caede9691a6f46b796da4073ac14adJohn McCall      if (numElementsWidth < sizeWidth)
7037d16627081caede9691a6f46b796da4073ac14adJohn McCall        numElements = CGF.Builder.CreateSExt(numElements, CGF.SizeTy);
7047d16627081caede9691a6f46b796da4073ac14adJohn McCall
7057d16627081caede9691a6f46b796da4073ac14adJohn McCall      // If there's a non-1 type size multiplier, then we can do the
7067d16627081caede9691a6f46b796da4073ac14adJohn McCall      // signedness check at the same time as we do the multiply
7077d16627081caede9691a6f46b796da4073ac14adJohn McCall      // because a negative number times anything will cause an
7089203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      // unsigned overflow.  Otherwise, we have to do it here. But at least
7099203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      // in this case, we can subsume the >= minElements check.
7107d16627081caede9691a6f46b796da4073ac14adJohn McCall      if (typeSizeMultiplier == 1)
7117d16627081caede9691a6f46b796da4073ac14adJohn McCall        hasOverflow = CGF.Builder.CreateICmpSLT(numElements,
7129203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                              llvm::ConstantInt::get(CGF.SizeTy, minElements));
7137d16627081caede9691a6f46b796da4073ac14adJohn McCall
7147d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Otherwise, zext up to size_t if necessary.
7157d16627081caede9691a6f46b796da4073ac14adJohn McCall    } else if (numElementsWidth < sizeWidth) {
7167d16627081caede9691a6f46b796da4073ac14adJohn McCall      numElements = CGF.Builder.CreateZExt(numElements, CGF.SizeTy);
7177d16627081caede9691a6f46b796da4073ac14adJohn McCall    }
7181e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
7197d16627081caede9691a6f46b796da4073ac14adJohn McCall    assert(numElements->getType() == CGF.SizeTy);
7201e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
7219203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    if (minElements) {
7229203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      // Don't allow allocation of fewer elements than we have initializers.
7239203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      if (!hasOverflow) {
7249203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl        hasOverflow = CGF.Builder.CreateICmpULT(numElements,
7259203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                              llvm::ConstantInt::get(CGF.SizeTy, minElements));
7269203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      } else if (numElementsWidth > sizeWidth) {
7279203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl        // The other existing overflow subsumes this check.
7289203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl        // We do an unsigned comparison, since any signed value < -1 is
7299203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl        // taken care of either above or below.
7309203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl        hasOverflow = CGF.Builder.CreateOr(hasOverflow,
7319203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                          CGF.Builder.CreateICmpULT(numElements,
7329203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                              llvm::ConstantInt::get(CGF.SizeTy, minElements)));
7339203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      }
7349203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    }
7359203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl
7367d16627081caede9691a6f46b796da4073ac14adJohn McCall    size = numElements;
7371e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
7387d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Multiply by the type size if necessary.  This multiplier
7397d16627081caede9691a6f46b796da4073ac14adJohn McCall    // includes all the factors for nested arrays.
7407d16627081caede9691a6f46b796da4073ac14adJohn McCall    //
7417d16627081caede9691a6f46b796da4073ac14adJohn McCall    // This step also causes numElements to be scaled up by the
7427d16627081caede9691a6f46b796da4073ac14adJohn McCall    // nested-array factor if necessary.  Overflow on this computation
7437d16627081caede9691a6f46b796da4073ac14adJohn McCall    // can be ignored because the result shouldn't be used if
7447d16627081caede9691a6f46b796da4073ac14adJohn McCall    // allocation fails.
7457d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (typeSizeMultiplier != 1) {
7467d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *umul_with_overflow
7478dd55a3c3b28d195717c87bbc60e765951d408feBenjamin Kramer        = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
7487d16627081caede9691a6f46b796da4073ac14adJohn McCall
7497d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *tsmV =
7507d16627081caede9691a6f46b796da4073ac14adJohn McCall        llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
7517d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *result =
7527d16627081caede9691a6f46b796da4073ac14adJohn McCall        CGF.Builder.CreateCall2(umul_with_overflow, size, tsmV);
7537d16627081caede9691a6f46b796da4073ac14adJohn McCall
7547d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
7557d16627081caede9691a6f46b796da4073ac14adJohn McCall      if (hasOverflow)
7567d16627081caede9691a6f46b796da4073ac14adJohn McCall        hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
7577d16627081caede9691a6f46b796da4073ac14adJohn McCall      else
7587d16627081caede9691a6f46b796da4073ac14adJohn McCall        hasOverflow = overflowed;
7597d16627081caede9691a6f46b796da4073ac14adJohn McCall
7607d16627081caede9691a6f46b796da4073ac14adJohn McCall      size = CGF.Builder.CreateExtractValue(result, 0);
7617d16627081caede9691a6f46b796da4073ac14adJohn McCall
7627d16627081caede9691a6f46b796da4073ac14adJohn McCall      // Also scale up numElements by the array size multiplier.
7637d16627081caede9691a6f46b796da4073ac14adJohn McCall      if (arraySizeMultiplier != 1) {
7647d16627081caede9691a6f46b796da4073ac14adJohn McCall        // If the base element type size is 1, then we can re-use the
7657d16627081caede9691a6f46b796da4073ac14adJohn McCall        // multiply we just did.
7667d16627081caede9691a6f46b796da4073ac14adJohn McCall        if (typeSize.isOne()) {
7677d16627081caede9691a6f46b796da4073ac14adJohn McCall          assert(arraySizeMultiplier == typeSizeMultiplier);
7687d16627081caede9691a6f46b796da4073ac14adJohn McCall          numElements = size;
7697d16627081caede9691a6f46b796da4073ac14adJohn McCall
7707d16627081caede9691a6f46b796da4073ac14adJohn McCall        // Otherwise we need a separate multiply.
7717d16627081caede9691a6f46b796da4073ac14adJohn McCall        } else {
7727d16627081caede9691a6f46b796da4073ac14adJohn McCall          llvm::Value *asmV =
7737d16627081caede9691a6f46b796da4073ac14adJohn McCall            llvm::ConstantInt::get(CGF.SizeTy, arraySizeMultiplier);
7747d16627081caede9691a6f46b796da4073ac14adJohn McCall          numElements = CGF.Builder.CreateMul(numElements, asmV);
7757d16627081caede9691a6f46b796da4073ac14adJohn McCall        }
7767d16627081caede9691a6f46b796da4073ac14adJohn McCall      }
7777d16627081caede9691a6f46b796da4073ac14adJohn McCall    } else {
7787d16627081caede9691a6f46b796da4073ac14adJohn McCall      // numElements doesn't need to be scaled.
7797d16627081caede9691a6f46b796da4073ac14adJohn McCall      assert(arraySizeMultiplier == 1);
7801e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    }
7817d16627081caede9691a6f46b796da4073ac14adJohn McCall
7827d16627081caede9691a6f46b796da4073ac14adJohn McCall    // Add in the cookie size if necessary.
7837d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (cookieSize != 0) {
7847d16627081caede9691a6f46b796da4073ac14adJohn McCall      sizeWithoutCookie = size;
7857d16627081caede9691a6f46b796da4073ac14adJohn McCall
7867d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *uadd_with_overflow
7878dd55a3c3b28d195717c87bbc60e765951d408feBenjamin Kramer        = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
7887d16627081caede9691a6f46b796da4073ac14adJohn McCall
7897d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
7907d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *result =
7917d16627081caede9691a6f46b796da4073ac14adJohn McCall        CGF.Builder.CreateCall2(uadd_with_overflow, size, cookieSizeV);
7927d16627081caede9691a6f46b796da4073ac14adJohn McCall
7937d16627081caede9691a6f46b796da4073ac14adJohn McCall      llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
7947d16627081caede9691a6f46b796da4073ac14adJohn McCall      if (hasOverflow)
7957d16627081caede9691a6f46b796da4073ac14adJohn McCall        hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
7967d16627081caede9691a6f46b796da4073ac14adJohn McCall      else
7977d16627081caede9691a6f46b796da4073ac14adJohn McCall        hasOverflow = overflowed;
7981e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
7997d16627081caede9691a6f46b796da4073ac14adJohn McCall      size = CGF.Builder.CreateExtractValue(result, 0);
8001e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    }
8011e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
8027d16627081caede9691a6f46b796da4073ac14adJohn McCall    // If we had any possibility of dynamic overflow, make a select to
8037d16627081caede9691a6f46b796da4073ac14adJohn McCall    // overwrite 'size' with an all-ones value, which should cause
8047d16627081caede9691a6f46b796da4073ac14adJohn McCall    // operator new to throw.
8057d16627081caede9691a6f46b796da4073ac14adJohn McCall    if (hasOverflow)
8067d16627081caede9691a6f46b796da4073ac14adJohn McCall      size = CGF.Builder.CreateSelect(hasOverflow,
8077d16627081caede9691a6f46b796da4073ac14adJohn McCall                                 llvm::Constant::getAllOnesValue(CGF.SizeTy),
8087d16627081caede9691a6f46b796da4073ac14adJohn McCall                                      size);
809806941eab5e1d62d7676e5cdc0e1d9e397ea78b4Chris Lattner  }
8101e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
8117d16627081caede9691a6f46b796da4073ac14adJohn McCall  if (cookieSize == 0)
8127d16627081caede9691a6f46b796da4073ac14adJohn McCall    sizeWithoutCookie = size;
8131e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  else
8147d16627081caede9691a6f46b796da4073ac14adJohn McCall    assert(sizeWithoutCookie && "didn't set sizeWithoutCookie?");
8151e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
8167d16627081caede9691a6f46b796da4073ac14adJohn McCall  return size;
817a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson}
818a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
8199203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redlstatic void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init,
8209203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                                    QualType AllocType, llvm::Value *NewPtr) {
82191a16fa3265686b90054715eea504d9b4a13438bDaniel Dunbar
822d7722d9d76a851e7897f4127626616d3b1b8e530Eli Friedman  CharUnits Alignment = CGF.getContext().getTypeAlignInChars(AllocType);
8239d232c884ea9872d6555df0fd7359699819bc1f1John McCall  switch (CGF.getEvaluationKind(AllocType)) {
8249d232c884ea9872d6555df0fd7359699819bc1f1John McCall  case TEK_Scalar:
825d7722d9d76a851e7897f4127626616d3b1b8e530Eli Friedman    CGF.EmitScalarInit(Init, 0, CGF.MakeAddrLValue(NewPtr, AllocType,
8266da2c716017d5c8530ec99779524491ebc5dadb8Eli Friedman                                                   Alignment),
827a07398ed98ea2b55ad7a505a3aab18aed93b149fJohn McCall                       false);
8289d232c884ea9872d6555df0fd7359699819bc1f1John McCall    return;
8299d232c884ea9872d6555df0fd7359699819bc1f1John McCall  case TEK_Complex:
8309d232c884ea9872d6555df0fd7359699819bc1f1John McCall    CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType,
8319d232c884ea9872d6555df0fd7359699819bc1f1John McCall                                                           Alignment),
8329d232c884ea9872d6555df0fd7359699819bc1f1John McCall                                  /*isInit*/ true);
8339d232c884ea9872d6555df0fd7359699819bc1f1John McCall    return;
8349d232c884ea9872d6555df0fd7359699819bc1f1John McCall  case TEK_Aggregate: {
835558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    AggValueSlot Slot
836f394078fde147dcf27e9b6a7965517388d64dcb6Eli Friedman      = AggValueSlot::forAddr(NewPtr, Alignment, AllocType.getQualifiers(),
8377c2349be2d11143a2e59a167fd43362a3bf4585eJohn McCall                              AggValueSlot::IsDestructed,
8384418439220a8f8e0b1deffdccce2354854c702f5John McCall                              AggValueSlot::DoesNotNeedGCBarriers,
839649b4a1a9b5e6f768ca0cb84bd97b00f51083e15Chad Rosier                              AggValueSlot::IsNotAliased);
840558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall    CGF.EmitAggExpr(Init, Slot);
841972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl
842972edf0534d8a50f87fac1d0ff34eb22f593df11Sebastian Redl    CGF.MaybeEmitStdInitializerListCleanup(NewPtr, Init);
8439d232c884ea9872d6555df0fd7359699819bc1f1John McCall    return;
8449d232c884ea9872d6555df0fd7359699819bc1f1John McCall  }
845558d2abc7f9fd6801cc7677200992313ae90b5d8John McCall  }
8469d232c884ea9872d6555df0fd7359699819bc1f1John McCall  llvm_unreachable("bad evaluation kind");
847ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz Jahanian}
848ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz Jahanian
849ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz Jahanianvoid
850ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz JahanianCodeGenFunction::EmitNewArrayInitializer(const CXXNewExpr *E,
851197056726ed6412501130c2ef2ff69009772aa65John McCall                                         QualType elementType,
852197056726ed6412501130c2ef2ff69009772aa65John McCall                                         llvm::Value *beginPtr,
853197056726ed6412501130c2ef2ff69009772aa65John McCall                                         llvm::Value *numElements) {
8542aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  if (!E->hasInitializer())
8552aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    return; // We have a POD type.
856197056726ed6412501130c2ef2ff69009772aa65John McCall
8579203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  llvm::Value *explicitPtr = beginPtr;
858197056726ed6412501130c2ef2ff69009772aa65John McCall  // Find the end of the array, hoisted out of the loop.
859197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::Value *endPtr =
860197056726ed6412501130c2ef2ff69009772aa65John McCall    Builder.CreateInBoundsGEP(beginPtr, numElements, "array.end");
861197056726ed6412501130c2ef2ff69009772aa65John McCall
8629203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  unsigned initializerElements = 0;
8639203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl
8649203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  const Expr *Init = E->getInitializer();
865577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  llvm::AllocaInst *endOfInit = 0;
866577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  QualType::DestructionKind dtorKind = elementType.isDestructedType();
867577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  EHScopeStack::stable_iterator cleanup;
868577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  llvm::Instruction *cleanupDominator = 0;
8699203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  // If the initializer is an initializer list, first do the explicit elements.
8709203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  if (const InitListExpr *ILE = dyn_cast<InitListExpr>(Init)) {
8719203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    initializerElements = ILE->getNumInits();
872577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier
873577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier    // Enter a partial-destruction cleanup if necessary.
874577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier    if (needsEHCleanup(dtorKind)) {
875577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // In principle we could tell the cleanup where we are more
876577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // directly, but the control flow can get so varied here that it
877577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // would actually be quite complex.  Therefore we go through an
878577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // alloca.
879577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      endOfInit = CreateTempAlloca(beginPtr->getType(), "array.endOfInit");
880577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      cleanupDominator = Builder.CreateStore(beginPtr, endOfInit);
881577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      pushIrregularPartialArrayCleanup(beginPtr, endOfInit, elementType,
882577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier                                       getDestroyer(dtorKind));
883577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      cleanup = EHStack.stable_begin();
884577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier    }
885577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier
8869203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i) {
887577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // Tell the cleanup that it needs to destroy up to this
888577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // element.  TODO: some of these stores can be trivially
889577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // observed to be unnecessary.
890577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      if (endOfInit) Builder.CreateStore(explicitPtr, endOfInit);
8919203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      StoreAnyExprIntoOneUnit(*this, ILE->getInit(i), elementType, explicitPtr);
8929203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      explicitPtr =Builder.CreateConstGEP1_32(explicitPtr, 1, "array.exp.next");
8939203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    }
8949203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl
8959203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // The remaining elements are filled with the array filler expression.
8969203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    Init = ILE->getArrayFiller();
8979203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  }
8989203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl
899197056726ed6412501130c2ef2ff69009772aa65John McCall  // Create the continuation block.
900197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::BasicBlock *contBB = createBasicBlock("new.loop.end");
901197056726ed6412501130c2ef2ff69009772aa65John McCall
9029203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  // If the number of elements isn't constant, we have to now check if there is
9039203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  // anything left to initialize.
9049203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  if (llvm::ConstantInt *constNum = dyn_cast<llvm::ConstantInt>(numElements)) {
9059203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    // If all elements have already been initialized, skip the whole loop.
906577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier    if (constNum->getZExtValue() <= initializerElements) {
907577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      // If there was a cleanup, deactivate it.
908577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      if (cleanupDominator)
9091ad23d62007162df82b58bca31b4aa277a5f6586Dmitri Gribenko        DeactivateCleanupBlock(cleanup, cleanupDominator);
910577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier      return;
911577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier    }
9129203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  } else {
913197056726ed6412501130c2ef2ff69009772aa65John McCall    llvm::BasicBlock *nonEmptyBB = createBasicBlock("new.loop.nonempty");
9149203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    llvm::Value *isEmpty = Builder.CreateICmpEQ(explicitPtr, endPtr,
915197056726ed6412501130c2ef2ff69009772aa65John McCall                                                "array.isempty");
916197056726ed6412501130c2ef2ff69009772aa65John McCall    Builder.CreateCondBr(isEmpty, contBB, nonEmptyBB);
917197056726ed6412501130c2ef2ff69009772aa65John McCall    EmitBlock(nonEmptyBB);
918197056726ed6412501130c2ef2ff69009772aa65John McCall  }
919197056726ed6412501130c2ef2ff69009772aa65John McCall
920197056726ed6412501130c2ef2ff69009772aa65John McCall  // Enter the loop.
921197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
922197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::BasicBlock *loopBB = createBasicBlock("new.loop");
923197056726ed6412501130c2ef2ff69009772aa65John McCall
924197056726ed6412501130c2ef2ff69009772aa65John McCall  EmitBlock(loopBB);
925197056726ed6412501130c2ef2ff69009772aa65John McCall
926197056726ed6412501130c2ef2ff69009772aa65John McCall  // Set up the current-element phi.
927197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::PHINode *curPtr =
9289203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    Builder.CreatePHI(explicitPtr->getType(), 2, "array.cur");
9299203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  curPtr->addIncoming(explicitPtr, entryBB);
930197056726ed6412501130c2ef2ff69009772aa65John McCall
931577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  // Store the new cleanup position for irregular cleanups.
932577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  if (endOfInit) Builder.CreateStore(curPtr, endOfInit);
933577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier
934197056726ed6412501130c2ef2ff69009772aa65John McCall  // Enter a partial-destruction cleanup if necessary.
935577fb5b2c15f7c187983a53e53f4f53b5d7aabb1Chad Rosier  if (!cleanupDominator && needsEHCleanup(dtorKind)) {
936197056726ed6412501130c2ef2ff69009772aa65John McCall    pushRegularPartialArrayCleanup(beginPtr, curPtr, elementType,
937197056726ed6412501130c2ef2ff69009772aa65John McCall                                   getDestroyer(dtorKind));
938197056726ed6412501130c2ef2ff69009772aa65John McCall    cleanup = EHStack.stable_begin();
9396f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    cleanupDominator = Builder.CreateUnreachable();
940197056726ed6412501130c2ef2ff69009772aa65John McCall  }
941197056726ed6412501130c2ef2ff69009772aa65John McCall
942197056726ed6412501130c2ef2ff69009772aa65John McCall  // Emit the initializer into this element.
9439203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  StoreAnyExprIntoOneUnit(*this, Init, E->getAllocatedType(), curPtr);
944197056726ed6412501130c2ef2ff69009772aa65John McCall
945197056726ed6412501130c2ef2ff69009772aa65John McCall  // Leave the cleanup if we entered one.
94640563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman  if (cleanupDominator) {
9476f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    DeactivateCleanupBlock(cleanup, cleanupDominator);
9486f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    cleanupDominator->eraseFromParent();
9496f103ba42cb69d50005a977c5ea583984ab63fc4John McCall  }
950197056726ed6412501130c2ef2ff69009772aa65John McCall
951197056726ed6412501130c2ef2ff69009772aa65John McCall  // Advance to the next element.
952197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::Value *nextPtr = Builder.CreateConstGEP1_32(curPtr, 1, "array.next");
953197056726ed6412501130c2ef2ff69009772aa65John McCall
954197056726ed6412501130c2ef2ff69009772aa65John McCall  // Check whether we've gotten to the end of the array and, if so,
955197056726ed6412501130c2ef2ff69009772aa65John McCall  // exit the loop.
956197056726ed6412501130c2ef2ff69009772aa65John McCall  llvm::Value *isEnd = Builder.CreateICmpEQ(nextPtr, endPtr, "array.atend");
957197056726ed6412501130c2ef2ff69009772aa65John McCall  Builder.CreateCondBr(isEnd, contBB, loopBB);
958197056726ed6412501130c2ef2ff69009772aa65John McCall  curPtr->addIncoming(nextPtr, Builder.GetInsertBlock());
959197056726ed6412501130c2ef2ff69009772aa65John McCall
960197056726ed6412501130c2ef2ff69009772aa65John McCall  EmitBlock(contBB);
961ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz Jahanian}
962ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz Jahanian
96359174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregorstatic void EmitZeroMemSet(CodeGenFunction &CGF, QualType T,
96459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor                           llvm::Value *NewPtr, llvm::Value *Size) {
965d16c2cf1cafa413709aa487cbbd5dc392f1ba1ffJohn McCall  CGF.EmitCastToVoidPtr(NewPtr);
966fe71008c2764768f25478b16c1802755189ed7c9Ken Dyck  CharUnits Alignment = CGF.getContext().getTypeAlignInChars(T);
9679f0c7cc36d29cf591c33962931f5862847145f3eBenjamin Kramer  CGF.Builder.CreateMemSet(NewPtr, CGF.Builder.getInt8(0), Size,
968fe71008c2764768f25478b16c1802755189ed7c9Ken Dyck                           Alignment.getQuantity(), false);
96959174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor}
97059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
971a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlssonstatic void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
972197056726ed6412501130c2ef2ff69009772aa65John McCall                               QualType ElementType,
973a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson                               llvm::Value *NewPtr,
97459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor                               llvm::Value *NumElements,
97559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor                               llvm::Value *AllocSizeWithoutCookie) {
9762aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  const Expr *Init = E->getInitializer();
9775d4d946ec2d88696fd8422aeb64dc29688e6a2c1Anders Carlsson  if (E->isArray()) {
9782aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    if (const CXXConstructExpr *CCE = dyn_cast_or_null<CXXConstructExpr>(Init)){
9792aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl      CXXConstructorDecl *Ctor = CCE->getConstructor();
980887ddf39b365320fdf8dde923287bf52bb3c6a38Douglas Gregor      if (Ctor->isTrivial()) {
98159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor        // If new expression did not specify value-initialization, then there
98259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor        // is no initialization.
9832aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl        if (!CCE->requiresZeroInitialization() || Ctor->getParent()->isEmpty())
98459174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor          return;
98559174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor
986197056726ed6412501130c2ef2ff69009772aa65John McCall        if (CGF.CGM.getTypes().isZeroInitializable(ElementType)) {
98759174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor          // Optimization: since zero initialization will just set the memory
98859174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor          // to all zeroes, generate a single memset to do it in one shot.
989197056726ed6412501130c2ef2ff69009772aa65John McCall          EmitZeroMemSet(CGF, ElementType, NewPtr, AllocSizeWithoutCookie);
99059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor          return;
99159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor        }
99259174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor      }
993c3c0766277cd64bf117450a1519c9cf762d994d4John McCall
9942aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl      CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr,
9952aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl                                     CCE->arg_begin(),  CCE->arg_end(),
996b41ba1aa47a66979df578074de3c218d820c152dEli Friedman                                     CCE->requiresZeroInitialization());
997e99bdb6969ec16d2829ccdf62b04a8c8eda8b215Anders Carlsson      return;
9982aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    } else if (Init && isa<ImplicitValueInitExpr>(Init) &&
99940563cd5ea402b7a0db13058ee869a77cd1ab5eeEli Friedman               CGF.CGM.getTypes().isZeroInitializable(ElementType)) {
100059174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor      // Optimization: since zero initialization will just set the memory
100159174c0633fb5cde41735cfbff5744bdf837e8d9Douglas Gregor      // to all zeroes, generate a single memset to do it in one shot.
1002197056726ed6412501130c2ef2ff69009772aa65John McCall      EmitZeroMemSet(CGF, ElementType, NewPtr, AllocSizeWithoutCookie);
1003197056726ed6412501130c2ef2ff69009772aa65John McCall      return;
1004ef66872797e46ced3ffdb428e582bc7f00474f99Fariborz Jahanian    }
10052aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    CGF.EmitNewArrayInitializer(E, ElementType, NewPtr, NumElements);
10062aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    return;
10075d4d946ec2d88696fd8422aeb64dc29688e6a2c1Anders Carlsson  }
1008a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
10092aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl  if (!Init)
10105304c953c1ccba4772ee77ce6526fff14ef5a16cFariborz Jahanian    return;
10112aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl
10129203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  StoreAnyExprIntoOneUnit(CGF, Init, E->getAllocatedType(), NewPtr);
1013a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson}
1014a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
10157d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCallnamespace {
10167d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  /// A cleanup to call the given 'operator delete' function upon
10177d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  /// abnormal exit from a new expression.
10187d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  class CallDeleteDuringNew : public EHScopeStack::Cleanup {
10197d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    size_t NumPlacementArgs;
10207d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    const FunctionDecl *OperatorDelete;
10217d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    llvm::Value *Ptr;
10227d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    llvm::Value *AllocSize;
10237d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10247d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    RValue *getPlacementArgs() { return reinterpret_cast<RValue*>(this+1); }
10257d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10267d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  public:
10277d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    static size_t getExtraSize(size_t NumPlacementArgs) {
10287d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      return NumPlacementArgs * sizeof(RValue);
10297d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    }
10307d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10317d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    CallDeleteDuringNew(size_t NumPlacementArgs,
10327d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall                        const FunctionDecl *OperatorDelete,
10337d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall                        llvm::Value *Ptr,
10347d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall                        llvm::Value *AllocSize)
10357d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      : NumPlacementArgs(NumPlacementArgs), OperatorDelete(OperatorDelete),
10367d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall        Ptr(Ptr), AllocSize(AllocSize) {}
10377d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10387d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    void setPlacementArg(unsigned I, RValue Arg) {
10397d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      assert(I < NumPlacementArgs && "index out of range");
10407d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      getPlacementArgs()[I] = Arg;
10417d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    }
10427d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
1043ad346f4f678ab1c3222425641d851dc63e9dfa1aJohn McCall    void Emit(CodeGenFunction &CGF, Flags flags) {
10447d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      const FunctionProtoType *FPT
10457d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall        = OperatorDelete->getType()->getAs<FunctionProtoType>();
10467d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      assert(FPT->getNumArgs() == NumPlacementArgs + 1 ||
1047c384636f9a405b687990564b204b98e360c81587John McCall             (FPT->getNumArgs() == 2 && NumPlacementArgs == 0));
10487d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10497d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      CallArgList DeleteArgs;
10507d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10517d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      // The first argument is always a void*.
10527d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      FunctionProtoType::arg_type_iterator AI = FPT->arg_type_begin();
105304c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman      DeleteArgs.add(RValue::get(Ptr), *AI++);
10547d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10557d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      // A member 'operator delete' can take an extra 'size_t' argument.
10567d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      if (FPT->getNumArgs() == NumPlacementArgs + 2)
105704c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman        DeleteArgs.add(RValue::get(AllocSize), *AI++);
10587d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10597d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      // Pass the rest of the arguments, which must match exactly.
10607d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      for (unsigned I = 0; I != NumPlacementArgs; ++I)
106104c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman        DeleteArgs.add(getPlacementArgs()[I], *AI++);
10627d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
10637d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall      // Call 'operator delete'.
10640f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall      CGF.EmitCall(CGF.CGM.getTypes().arrangeFreeFunctionCall(DeleteArgs, FPT),
10657d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall                   CGF.CGM.GetAddrOfFunction(OperatorDelete),
10667d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall                   ReturnValueSlot(), DeleteArgs, OperatorDelete);
10677d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall    }
10687d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  };
10693019c444c672938c57f5573840071ecd73425ee7John McCall
10703019c444c672938c57f5573840071ecd73425ee7John McCall  /// A cleanup to call the given 'operator delete' function upon
10713019c444c672938c57f5573840071ecd73425ee7John McCall  /// abnormal exit from a new expression when the new expression is
10723019c444c672938c57f5573840071ecd73425ee7John McCall  /// conditional.
10733019c444c672938c57f5573840071ecd73425ee7John McCall  class CallDeleteDuringConditionalNew : public EHScopeStack::Cleanup {
10743019c444c672938c57f5573840071ecd73425ee7John McCall    size_t NumPlacementArgs;
10753019c444c672938c57f5573840071ecd73425ee7John McCall    const FunctionDecl *OperatorDelete;
1076804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    DominatingValue<RValue>::saved_type Ptr;
1077804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    DominatingValue<RValue>::saved_type AllocSize;
10783019c444c672938c57f5573840071ecd73425ee7John McCall
1079804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    DominatingValue<RValue>::saved_type *getPlacementArgs() {
1080804b807ea918184d6de63bd745e1ff75a9bfc679John McCall      return reinterpret_cast<DominatingValue<RValue>::saved_type*>(this+1);
10813019c444c672938c57f5573840071ecd73425ee7John McCall    }
10823019c444c672938c57f5573840071ecd73425ee7John McCall
10833019c444c672938c57f5573840071ecd73425ee7John McCall  public:
10843019c444c672938c57f5573840071ecd73425ee7John McCall    static size_t getExtraSize(size_t NumPlacementArgs) {
1085804b807ea918184d6de63bd745e1ff75a9bfc679John McCall      return NumPlacementArgs * sizeof(DominatingValue<RValue>::saved_type);
10863019c444c672938c57f5573840071ecd73425ee7John McCall    }
10873019c444c672938c57f5573840071ecd73425ee7John McCall
10883019c444c672938c57f5573840071ecd73425ee7John McCall    CallDeleteDuringConditionalNew(size_t NumPlacementArgs,
10893019c444c672938c57f5573840071ecd73425ee7John McCall                                   const FunctionDecl *OperatorDelete,
1090804b807ea918184d6de63bd745e1ff75a9bfc679John McCall                                   DominatingValue<RValue>::saved_type Ptr,
1091804b807ea918184d6de63bd745e1ff75a9bfc679John McCall                              DominatingValue<RValue>::saved_type AllocSize)
10923019c444c672938c57f5573840071ecd73425ee7John McCall      : NumPlacementArgs(NumPlacementArgs), OperatorDelete(OperatorDelete),
10933019c444c672938c57f5573840071ecd73425ee7John McCall        Ptr(Ptr), AllocSize(AllocSize) {}
10943019c444c672938c57f5573840071ecd73425ee7John McCall
1095804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    void setPlacementArg(unsigned I, DominatingValue<RValue>::saved_type Arg) {
10963019c444c672938c57f5573840071ecd73425ee7John McCall      assert(I < NumPlacementArgs && "index out of range");
10973019c444c672938c57f5573840071ecd73425ee7John McCall      getPlacementArgs()[I] = Arg;
10983019c444c672938c57f5573840071ecd73425ee7John McCall    }
10993019c444c672938c57f5573840071ecd73425ee7John McCall
1100ad346f4f678ab1c3222425641d851dc63e9dfa1aJohn McCall    void Emit(CodeGenFunction &CGF, Flags flags) {
11013019c444c672938c57f5573840071ecd73425ee7John McCall      const FunctionProtoType *FPT
11023019c444c672938c57f5573840071ecd73425ee7John McCall        = OperatorDelete->getType()->getAs<FunctionProtoType>();
11033019c444c672938c57f5573840071ecd73425ee7John McCall      assert(FPT->getNumArgs() == NumPlacementArgs + 1 ||
11043019c444c672938c57f5573840071ecd73425ee7John McCall             (FPT->getNumArgs() == 2 && NumPlacementArgs == 0));
11053019c444c672938c57f5573840071ecd73425ee7John McCall
11063019c444c672938c57f5573840071ecd73425ee7John McCall      CallArgList DeleteArgs;
11073019c444c672938c57f5573840071ecd73425ee7John McCall
11083019c444c672938c57f5573840071ecd73425ee7John McCall      // The first argument is always a void*.
11093019c444c672938c57f5573840071ecd73425ee7John McCall      FunctionProtoType::arg_type_iterator AI = FPT->arg_type_begin();
111004c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman      DeleteArgs.add(Ptr.restore(CGF), *AI++);
11113019c444c672938c57f5573840071ecd73425ee7John McCall
11123019c444c672938c57f5573840071ecd73425ee7John McCall      // A member 'operator delete' can take an extra 'size_t' argument.
11133019c444c672938c57f5573840071ecd73425ee7John McCall      if (FPT->getNumArgs() == NumPlacementArgs + 2) {
1114804b807ea918184d6de63bd745e1ff75a9bfc679John McCall        RValue RV = AllocSize.restore(CGF);
111504c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman        DeleteArgs.add(RV, *AI++);
11163019c444c672938c57f5573840071ecd73425ee7John McCall      }
11173019c444c672938c57f5573840071ecd73425ee7John McCall
11183019c444c672938c57f5573840071ecd73425ee7John McCall      // Pass the rest of the arguments, which must match exactly.
11193019c444c672938c57f5573840071ecd73425ee7John McCall      for (unsigned I = 0; I != NumPlacementArgs; ++I) {
1120804b807ea918184d6de63bd745e1ff75a9bfc679John McCall        RValue RV = getPlacementArgs()[I].restore(CGF);
112104c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman        DeleteArgs.add(RV, *AI++);
11223019c444c672938c57f5573840071ecd73425ee7John McCall      }
11233019c444c672938c57f5573840071ecd73425ee7John McCall
11243019c444c672938c57f5573840071ecd73425ee7John McCall      // Call 'operator delete'.
11250f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall      CGF.EmitCall(CGF.CGM.getTypes().arrangeFreeFunctionCall(DeleteArgs, FPT),
11263019c444c672938c57f5573840071ecd73425ee7John McCall                   CGF.CGM.GetAddrOfFunction(OperatorDelete),
11273019c444c672938c57f5573840071ecd73425ee7John McCall                   ReturnValueSlot(), DeleteArgs, OperatorDelete);
11283019c444c672938c57f5573840071ecd73425ee7John McCall    }
11293019c444c672938c57f5573840071ecd73425ee7John McCall  };
11303019c444c672938c57f5573840071ecd73425ee7John McCall}
11313019c444c672938c57f5573840071ecd73425ee7John McCall
11323019c444c672938c57f5573840071ecd73425ee7John McCall/// Enter a cleanup to call 'operator delete' if the initializer in a
11333019c444c672938c57f5573840071ecd73425ee7John McCall/// new-expression throws.
11343019c444c672938c57f5573840071ecd73425ee7John McCallstatic void EnterNewDeleteCleanup(CodeGenFunction &CGF,
11353019c444c672938c57f5573840071ecd73425ee7John McCall                                  const CXXNewExpr *E,
11363019c444c672938c57f5573840071ecd73425ee7John McCall                                  llvm::Value *NewPtr,
11373019c444c672938c57f5573840071ecd73425ee7John McCall                                  llvm::Value *AllocSize,
11383019c444c672938c57f5573840071ecd73425ee7John McCall                                  const CallArgList &NewArgs) {
11393019c444c672938c57f5573840071ecd73425ee7John McCall  // If we're not inside a conditional branch, then the cleanup will
11403019c444c672938c57f5573840071ecd73425ee7John McCall  // dominate and we can do the easier (and more efficient) thing.
11413019c444c672938c57f5573840071ecd73425ee7John McCall  if (!CGF.isInConditionalBranch()) {
11423019c444c672938c57f5573840071ecd73425ee7John McCall    CallDeleteDuringNew *Cleanup = CGF.EHStack
11433019c444c672938c57f5573840071ecd73425ee7John McCall      .pushCleanupWithExtra<CallDeleteDuringNew>(EHCleanup,
11443019c444c672938c57f5573840071ecd73425ee7John McCall                                                 E->getNumPlacementArgs(),
11453019c444c672938c57f5573840071ecd73425ee7John McCall                                                 E->getOperatorDelete(),
11463019c444c672938c57f5573840071ecd73425ee7John McCall                                                 NewPtr, AllocSize);
11473019c444c672938c57f5573840071ecd73425ee7John McCall    for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I)
1148c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman      Cleanup->setPlacementArg(I, NewArgs[I+1].RV);
11493019c444c672938c57f5573840071ecd73425ee7John McCall
11503019c444c672938c57f5573840071ecd73425ee7John McCall    return;
11513019c444c672938c57f5573840071ecd73425ee7John McCall  }
11523019c444c672938c57f5573840071ecd73425ee7John McCall
11533019c444c672938c57f5573840071ecd73425ee7John McCall  // Otherwise, we need to save all this stuff.
1154804b807ea918184d6de63bd745e1ff75a9bfc679John McCall  DominatingValue<RValue>::saved_type SavedNewPtr =
1155804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    DominatingValue<RValue>::save(CGF, RValue::get(NewPtr));
1156804b807ea918184d6de63bd745e1ff75a9bfc679John McCall  DominatingValue<RValue>::saved_type SavedAllocSize =
1157804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    DominatingValue<RValue>::save(CGF, RValue::get(AllocSize));
11583019c444c672938c57f5573840071ecd73425ee7John McCall
11593019c444c672938c57f5573840071ecd73425ee7John McCall  CallDeleteDuringConditionalNew *Cleanup = CGF.EHStack
11606f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    .pushCleanupWithExtra<CallDeleteDuringConditionalNew>(EHCleanup,
11613019c444c672938c57f5573840071ecd73425ee7John McCall                                                 E->getNumPlacementArgs(),
11623019c444c672938c57f5573840071ecd73425ee7John McCall                                                 E->getOperatorDelete(),
11633019c444c672938c57f5573840071ecd73425ee7John McCall                                                 SavedNewPtr,
11643019c444c672938c57f5573840071ecd73425ee7John McCall                                                 SavedAllocSize);
11653019c444c672938c57f5573840071ecd73425ee7John McCall  for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I)
1166804b807ea918184d6de63bd745e1ff75a9bfc679John McCall    Cleanup->setPlacementArg(I,
1167c6d07821c529bb95e4cf072e49b736c5142f1786Eli Friedman                     DominatingValue<RValue>::save(CGF, NewArgs[I+1].RV));
11683019c444c672938c57f5573840071ecd73425ee7John McCall
11696f103ba42cb69d50005a977c5ea583984ab63fc4John McCall  CGF.initFullExprCleanup();
11707d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall}
11717d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
117216d81b8db39593b5f1a38b077757272a09c12da8Anders Carlssonllvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
1173c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // The element type being allocated.
1174c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  QualType allocType = getContext().getBaseElementType(E->getAllocatedType());
11751e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
1176c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // 1. Build a call to the allocation function.
1177c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  FunctionDecl *allocator = E->getOperatorNew();
1178c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  const FunctionProtoType *allocatorType =
1179c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    allocator->getType()->castAs<FunctionProtoType>();
118016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1181c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  CallArgList allocatorArgs;
118216d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
118316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // The allocation size is the first argument.
1184c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  QualType sizeType = getContext().getSizeType();
118516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
11869203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  // If there is a brace-initializer, cannot allocate fewer elements than inits.
11879203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  unsigned minElements = 0;
11889203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  if (E->isArray() && E->hasInitializer()) {
11899203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    if (const InitListExpr *ILE = dyn_cast<InitListExpr>(E->getInitializer()))
11909203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl      minElements = ILE->getNumInits();
11919203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl  }
11929203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl
1193c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::Value *numElements = 0;
1194c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::Value *allocSizeWithoutCookie = 0;
1195c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::Value *allocSize =
11969203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl    EmitCXXNewAllocSize(*this, E, minElements, numElements,
11979203647221439c6eb04842bb8a22f5f03fd4d2bfSebastian Redl                        allocSizeWithoutCookie);
1198a4d4c019bf477ce6ff7b01517e690f6c5fd6ad71Anders Carlsson
119904c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman  allocatorArgs.add(RValue::get(allocSize), sizeType);
120016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
120116d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // Emit the rest of the arguments.
120216d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // FIXME: Ideally, this should just use EmitCallArgs.
1203c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  CXXNewExpr::const_arg_iterator placementArg = E->placement_arg_begin();
120416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
120516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // First, use the types from the function type.
120616d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // We start at 1 here because the first argument (the allocation size)
120716d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // has already been emitted.
1208c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  for (unsigned i = 1, e = allocatorType->getNumArgs(); i != e;
1209c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall       ++i, ++placementArg) {
1210c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    QualType argType = allocatorType->getArgType(i);
121116d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1212c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    assert(getContext().hasSameUnqualifiedType(argType.getNonReferenceType(),
1213c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall                                               placementArg->getType()) &&
121416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson           "type mismatch in call argument!");
121516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1216413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall    EmitCallArg(allocatorArgs, *placementArg, argType);
121716d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  }
121816d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
121916d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // Either we've emitted all the call args, or we have a call to a
122016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // variadic function.
1221c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  assert((placementArg == E->placement_arg_end() ||
1222c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall          allocatorType->isVariadic()) &&
1223c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall         "Extra arguments to non-variadic function!");
122416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
122516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // If we still have any arguments, emit them using the type of the argument.
1226c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  for (CXXNewExpr::const_arg_iterator placementArgsEnd = E->placement_arg_end();
1227c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall       placementArg != placementArgsEnd; ++placementArg) {
1228413ebdb1af6fb0d81845b61254daf02ba0449afdJohn McCall    EmitCallArg(allocatorArgs, *placementArg, placementArg->getType());
122916d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  }
123016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1231b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // Emit the allocation call.  If the allocator is a global placement
1232b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  // operator, just "inline" it directly.
1233b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  RValue RV;
1234b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  if (allocator->isReservedGlobalPlacementOperator()) {
1235b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    assert(allocatorArgs.size() == 2);
1236b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    RV = allocatorArgs[1].RV;
1237b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    // TODO: kill any unnecessary computations done for the size
1238b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall    // argument.
1239b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  } else {
12400f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall    RV = EmitCall(CGM.getTypes().arrangeFreeFunctionCall(allocatorArgs,
12410f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall                                                         allocatorType),
1242b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall                  CGM.GetAddrOfFunction(allocator), ReturnValueSlot(),
1243b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall                  allocatorArgs, allocator);
1244b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  }
124516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1246c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // Emit a null check on the allocation result if the allocation
1247c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // function is allowed to return null (because it has a non-throwing
1248c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // exception spec; for this part, we inline
1249c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // CXXNewExpr::shouldNullCheckAllocation()) and we have an
1250c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  // interesting initializer.
12518026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl  bool nullCheck = allocatorType->isNothrow(getContext()) &&
12522aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl    (!allocType.isPODType(getContext()) || E->hasInitializer());
125316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1254c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::BasicBlock *nullCheckBB = 0;
1255c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::BasicBlock *contBB = 0;
125616d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1257c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::Value *allocation = RV.getScalarVal();
1258956a5a17713deb1b5b27893303c4f308a1bd2a62Micah Villmow  unsigned AS = allocation->getType()->getPointerAddressSpace();
125916d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1260a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall  // The null-check means that the initializer is conditionally
1261a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall  // evaluated.
1262a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall  ConditionalEvaluation conditional(*this);
1263a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall
1264c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  if (nullCheck) {
1265c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    conditional.begin(*this);
126616d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1267c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    nullCheckBB = Builder.GetInsertBlock();
1268c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    llvm::BasicBlock *notNullBB = createBasicBlock("new.notnull");
1269c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    contBB = createBasicBlock("new.cont");
1270a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall
1271c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    llvm::Value *isNull = Builder.CreateIsNull(allocation, "new.isnull");
1272c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    Builder.CreateCondBr(isNull, contBB, notNullBB);
1273c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    EmitBlock(notNullBB);
127416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  }
12751e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
12767d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  // If there's an operator delete, enter a cleanup to call it if an
12777d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  // exception is thrown.
1278c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  EHScopeStack::stable_iterator operatorDeleteCleanup;
12796f103ba42cb69d50005a977c5ea583984ab63fc4John McCall  llvm::Instruction *cleanupDominator = 0;
1280b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall  if (E->getOperatorDelete() &&
1281b1c98a35fbd49d6404a72db4aca2ceda352380c7John McCall      !E->getOperatorDelete()->isReservedGlobalPlacementOperator()) {
1282c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    EnterNewDeleteCleanup(*this, E, allocation, allocSize, allocatorArgs);
1283c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    operatorDeleteCleanup = EHStack.stable_begin();
12846f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    cleanupDominator = Builder.CreateUnreachable();
12857d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  }
12867d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
1287576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman  assert((allocSize == allocSizeWithoutCookie) ==
1288576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman         CalculateCookiePadding(*this, E).isZero());
1289576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman  if (allocSize != allocSizeWithoutCookie) {
1290576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman    assert(E->isArray());
1291576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman    allocation = CGM.getCXXABI().InitializeArrayCookie(*this, allocation,
1292576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman                                                       numElements,
1293576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman                                                       E, allocType);
1294576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman  }
1295576cf17055c92e7d1ae8fb9fd9f79433a16a4394Eli Friedman
12962acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *elementPtrTy
1297c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    = ConvertTypeForMem(allocType)->getPointerTo(AS);
1298c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  llvm::Value *result = Builder.CreateBitCast(allocation, elementPtrTy);
12997d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
1300197056726ed6412501130c2ef2ff69009772aa65John McCall  EmitNewInitializer(*this, E, allocType, result, numElements,
1301197056726ed6412501130c2ef2ff69009772aa65John McCall                     allocSizeWithoutCookie);
13021e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  if (E->isArray()) {
13031e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    // NewPtr is a pointer to the base element type.  If we're
13041e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    // allocating an array of arrays, we'll need to cast back to the
13051e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    // array pointer type.
13062acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner    llvm::Type *resultType = ConvertTypeForMem(E->getType());
1307c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    if (result->getType() != resultType)
1308c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall      result = Builder.CreateBitCast(result, resultType);
1309ceb43b662bf09b44a08714e8f9d222780ca979d7Fariborz Jahanian  }
13107d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall
13117d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  // Deactivate the 'operator delete' cleanup if we finished
13127d8647f194ae4f2499e5bcd40dcfea34cd21ebc6John McCall  // initialization.
13136f103ba42cb69d50005a977c5ea583984ab63fc4John McCall  if (operatorDeleteCleanup.isValid()) {
13146f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    DeactivateCleanupBlock(operatorDeleteCleanup, cleanupDominator);
13156f103ba42cb69d50005a977c5ea583984ab63fc4John McCall    cleanupDominator->eraseFromParent();
13166f103ba42cb69d50005a977c5ea583984ab63fc4John McCall  }
13172aed8b88613863f3c439cdfb205bdf8b608fb205Sebastian Redl
1318c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  if (nullCheck) {
1319a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall    conditional.end(*this);
1320a7f633f522af786e80dc08dbd63e222c9414095bJohn McCall
1321c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    llvm::BasicBlock *notNullBB = Builder.GetInsertBlock();
1322c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    EmitBlock(contBB);
132316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1324bbf3bacb3e0c1ebb3e8a4a8b1330404a7e379315Jay Foad    llvm::PHINode *PHI = Builder.CreatePHI(result->getType(), 2);
1325c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    PHI->addIncoming(result, notNullBB);
1326c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    PHI->addIncoming(llvm::Constant::getNullValue(result->getType()),
1327c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall                     nullCheckBB);
132816d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1329c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall    result = PHI;
133016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  }
13311e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
1332c2f3e7f42c8bf9e8d4393a6e8c4762dafc4f28ddJohn McCall  return result;
133316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson}
133416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
13355fe05986473c4ff780508dec4cd2cf4822168125Eli Friedmanvoid CodeGenFunction::EmitDeleteCall(const FunctionDecl *DeleteFD,
13365fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman                                     llvm::Value *Ptr,
13375fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman                                     QualType DeleteTy) {
13381e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  assert(DeleteFD->getOverloadedOperator() == OO_Delete);
13391e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
13405fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman  const FunctionProtoType *DeleteFTy =
13415fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman    DeleteFD->getType()->getAs<FunctionProtoType>();
13425fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman
13435fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman  CallArgList DeleteArgs;
13445fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman
1345871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  // Check if we need to pass the size to the delete operator.
1346871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  llvm::Value *Size = 0;
1347871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  QualType SizeTy;
13485fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman  if (DeleteFTy->getNumArgs() == 2) {
1349871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson    SizeTy = DeleteFTy->getArgType(1);
13504f122ef0ca7683486d78c84ed87455d5f35ee1b1Ken Dyck    CharUnits DeleteTypeSize = getContext().getTypeSizeInChars(DeleteTy);
13514f122ef0ca7683486d78c84ed87455d5f35ee1b1Ken Dyck    Size = llvm::ConstantInt::get(ConvertType(SizeTy),
13524f122ef0ca7683486d78c84ed87455d5f35ee1b1Ken Dyck                                  DeleteTypeSize.getQuantity());
1353871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  }
1354871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson
1355871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  QualType ArgTy = DeleteFTy->getArgType(0);
1356871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  llvm::Value *DeletePtr = Builder.CreateBitCast(Ptr, ConvertType(ArgTy));
135704c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman  DeleteArgs.add(RValue::get(DeletePtr), ArgTy);
1358871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson
1359871d078f5ae5505553c02deeabdd4b83b4820211Anders Carlsson  if (Size)
136004c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman    DeleteArgs.add(RValue::get(Size), SizeTy);
13615fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman
13625fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman  // Emit the call to delete.
13630f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall  EmitCall(CGM.getTypes().arrangeFreeFunctionCall(DeleteArgs, DeleteFTy),
1364f3c47c9525153aea2de0ec4bd615b9cf2d81c103Anders Carlsson           CGM.GetAddrOfFunction(DeleteFD), ReturnValueSlot(),
13655fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman           DeleteArgs, DeleteFD);
13665fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman}
13675fe05986473c4ff780508dec4cd2cf4822168125Eli Friedman
13681e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallnamespace {
13691e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  /// Calls the given 'operator delete' on a single object.
13701e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  struct CallObjectDelete : EHScopeStack::Cleanup {
13711e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    llvm::Value *Ptr;
13721e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    const FunctionDecl *OperatorDelete;
13731e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    QualType ElementType;
13741e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
13751e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    CallObjectDelete(llvm::Value *Ptr,
13761e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                     const FunctionDecl *OperatorDelete,
13771e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                     QualType ElementType)
13781e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      : Ptr(Ptr), OperatorDelete(OperatorDelete), ElementType(ElementType) {}
13791e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
1380ad346f4f678ab1c3222425641d851dc63e9dfa1aJohn McCall    void Emit(CodeGenFunction &CGF, Flags flags) {
13811e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
13821e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    }
13831e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  };
13841e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall}
13851e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
13861e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall/// Emit the code for deleting a single object.
13871e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallstatic void EmitObjectDelete(CodeGenFunction &CGF,
13881e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                             const FunctionDecl *OperatorDelete,
13891e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                             llvm::Value *Ptr,
1390a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor                             QualType ElementType,
1391a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor                             bool UseGlobalDelete) {
13921e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // Find the destructor for the type, if applicable.  If the
13931e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // destructor is virtual, we'll just emit the vcall and return.
13941e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  const CXXDestructorDecl *Dtor = 0;
13951e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  if (const RecordType *RT = ElementType->getAs<RecordType>()) {
13961e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
1397aebab72698ce5283395e61597a266fb04e62e390Eli Friedman    if (RD->hasDefinition() && !RD->hasTrivialDestructor()) {
13981e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      Dtor = RD->getDestructor();
13991e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14001e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      if (Dtor->isVirtual()) {
1401a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor        if (UseGlobalDelete) {
1402a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor          // If we're supposed to call the global delete, make sure we do so
1403a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor          // even if the destructor throws.
1404ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall
1405ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall          // Derive the complete-object pointer, which is what we need
1406ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall          // to pass to the deallocation function.
1407ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall          llvm::Value *completePtr =
1408ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall            CGF.CGM.getCXXABI().adjustToCompleteObject(CGF, Ptr, ElementType);
1409ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall
1410a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor          CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
1411ecd03b447bb0e2ed1954c77441d49a4a17ca8138John McCall                                                    completePtr, OperatorDelete,
1412a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor                                                    ElementType);
1413a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor        }
14140f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov
14154def70d3040e73707c738f7c366737a986135edfRichard Smith        // FIXME: Provide a source location here.
14160f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov        CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
14170f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov        CGF.CGM.getCXXABI().EmitVirtualDestructorCall(CGF, Dtor, DtorType,
14180f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov                                                      SourceLocation(),
14190f9827f5d6248d7008063768eb5f2c3e6ba83e94Timur Iskhodzhanov                                                      ReturnValueSlot(), Ptr);
14201e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
1421a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor        if (UseGlobalDelete) {
1422a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor          CGF.PopCleanupBlock();
1423a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor        }
1424a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor
14251e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        return;
14261e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      }
14271e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    }
14281e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  }
14291e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14301e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // Make sure that we call delete even if the dtor throws.
14313ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall  // This doesn't have to a conditional cleanup because we're going
14323ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCall  // to pop it off in a second.
14331e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  CGF.EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup,
14341e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                                            Ptr, OperatorDelete, ElementType);
14351e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14361e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  if (Dtor)
14371e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    CGF.EmitCXXDestructorCall(Dtor, Dtor_Complete,
1438378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor                              /*ForVirtualBase=*/false,
1439378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor                              /*Delegating=*/false,
1440378e1e739aed97e9b278beeb20e9f5bbe34c0232Douglas Gregor                              Ptr);
14414e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  else if (CGF.getLangOpts().ObjCAutoRefCount &&
1442f85e193739c953358c865005855253af4f68a497John McCall           ElementType->isObjCLifetimeType()) {
1443f85e193739c953358c865005855253af4f68a497John McCall    switch (ElementType.getObjCLifetime()) {
1444f85e193739c953358c865005855253af4f68a497John McCall    case Qualifiers::OCL_None:
1445f85e193739c953358c865005855253af4f68a497John McCall    case Qualifiers::OCL_ExplicitNone:
1446f85e193739c953358c865005855253af4f68a497John McCall    case Qualifiers::OCL_Autoreleasing:
1447f85e193739c953358c865005855253af4f68a497John McCall      break;
14481e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
1449f85e193739c953358c865005855253af4f68a497John McCall    case Qualifiers::OCL_Strong: {
1450f85e193739c953358c865005855253af4f68a497John McCall      // Load the pointer value.
1451f85e193739c953358c865005855253af4f68a497John McCall      llvm::Value *PtrValue = CGF.Builder.CreateLoad(Ptr,
1452f85e193739c953358c865005855253af4f68a497John McCall                                             ElementType.isVolatileQualified());
1453f85e193739c953358c865005855253af4f68a497John McCall
14545b07e8077a20b80fee90bd76c43c6150c676e4a8John McCall      CGF.EmitARCRelease(PtrValue, ARCPreciseLifetime);
1455f85e193739c953358c865005855253af4f68a497John McCall      break;
1456f85e193739c953358c865005855253af4f68a497John McCall    }
1457f85e193739c953358c865005855253af4f68a497John McCall
1458f85e193739c953358c865005855253af4f68a497John McCall    case Qualifiers::OCL_Weak:
1459f85e193739c953358c865005855253af4f68a497John McCall      CGF.EmitARCDestroyWeak(Ptr);
1460f85e193739c953358c865005855253af4f68a497John McCall      break;
1461f85e193739c953358c865005855253af4f68a497John McCall    }
1462f85e193739c953358c865005855253af4f68a497John McCall  }
1463f85e193739c953358c865005855253af4f68a497John McCall
14641e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  CGF.PopCleanupBlock();
14651e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall}
14661e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14671e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallnamespace {
14681e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  /// Calls the given 'operator delete' on an array of objects.
14691e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  struct CallArrayDelete : EHScopeStack::Cleanup {
14701e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    llvm::Value *Ptr;
14711e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    const FunctionDecl *OperatorDelete;
14721e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    llvm::Value *NumElements;
14731e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    QualType ElementType;
14741e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    CharUnits CookieSize;
14751e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14761e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    CallArrayDelete(llvm::Value *Ptr,
14771e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                    const FunctionDecl *OperatorDelete,
14781e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                    llvm::Value *NumElements,
14791e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                    QualType ElementType,
14801e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                    CharUnits CookieSize)
14811e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      : Ptr(Ptr), OperatorDelete(OperatorDelete), NumElements(NumElements),
14821e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        ElementType(ElementType), CookieSize(CookieSize) {}
14831e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
1484ad346f4f678ab1c3222425641d851dc63e9dfa1aJohn McCall    void Emit(CodeGenFunction &CGF, Flags flags) {
14851e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      const FunctionProtoType *DeleteFTy =
14861e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        OperatorDelete->getType()->getAs<FunctionProtoType>();
14871e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      assert(DeleteFTy->getNumArgs() == 1 || DeleteFTy->getNumArgs() == 2);
14881e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14891e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      CallArgList Args;
14901e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14911e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      // Pass the pointer as the first argument.
14921e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      QualType VoidPtrTy = DeleteFTy->getArgType(0);
14931e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      llvm::Value *DeletePtr
14941e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        = CGF.Builder.CreateBitCast(Ptr, CGF.ConvertType(VoidPtrTy));
149504c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman      Args.add(RValue::get(DeletePtr), VoidPtrTy);
14961e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
14971e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      // Pass the original requested size as the second argument.
14981e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      if (DeleteFTy->getNumArgs() == 2) {
14991e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        QualType size_t = DeleteFTy->getArgType(1);
15002acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner        llvm::IntegerType *SizeTy
15011e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall          = cast<llvm::IntegerType>(CGF.ConvertType(size_t));
15021e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15031e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        CharUnits ElementTypeSize =
15041e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall          CGF.CGM.getContext().getTypeSizeInChars(ElementType);
15051e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15061e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        // The size of an element, multiplied by the number of elements.
15071e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        llvm::Value *Size
15081e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall          = llvm::ConstantInt::get(SizeTy, ElementTypeSize.getQuantity());
15091e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        Size = CGF.Builder.CreateMul(Size, NumElements);
15101e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15111e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        // Plus the size of the cookie if applicable.
15121e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        if (!CookieSize.isZero()) {
15131e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall          llvm::Value *CookieSizeV
15141e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall            = llvm::ConstantInt::get(SizeTy, CookieSize.getQuantity());
15151e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall          Size = CGF.Builder.CreateAdd(Size, CookieSizeV);
15161e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall        }
15171e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
151804c9a49ee251424b11d7c4e8b1c23637684cecb6Eli Friedman        Args.add(RValue::get(Size), size_t);
15191e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      }
15201e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15211e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      // Emit the call to delete.
15220f3d0970dcdf6cf17550b86838dff12813968dbcJohn McCall      CGF.EmitCall(CGF.getTypes().arrangeFreeFunctionCall(Args, DeleteFTy),
15231e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                   CGF.CGM.GetAddrOfFunction(OperatorDelete),
15241e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall                   ReturnValueSlot(), Args, OperatorDelete);
15251e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    }
15261e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  };
15271e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall}
15281e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15291e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall/// Emit the code for deleting an array of objects.
15301e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCallstatic void EmitArrayDelete(CodeGenFunction &CGF,
15316ec278d1a354517e20f13a877481453ee7940c78John McCall                            const CXXDeleteExpr *E,
15327cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                            llvm::Value *deletedPtr,
15337cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                            QualType elementType) {
15347cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  llvm::Value *numElements = 0;
15357cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  llvm::Value *allocatedPtr = 0;
15367cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  CharUnits cookieSize;
15377cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
15387cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                                      numElements, allocatedPtr, cookieSize);
15391e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15407cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  assert(allocatedPtr && "ReadArrayCookie didn't set allocated pointer");
15411e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15421e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // Make sure that we call delete even if one of the dtors throws.
15437cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  const FunctionDecl *operatorDelete = E->getOperatorDelete();
15441e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup,
15457cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                                           allocatedPtr, operatorDelete,
15467cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                                           numElements, elementType,
15477cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                                           cookieSize);
15487cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall
15497cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  // Destroy the elements.
15507cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  if (QualType::DestructionKind dtorKind = elementType.isDestructedType()) {
15517cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall    assert(numElements && "no element count for a type with a destructor!");
15527cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall
15537cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall    llvm::Value *arrayEnd =
15547cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall      CGF.Builder.CreateInBoundsGEP(deletedPtr, numElements, "delete.end");
1555fbf780a9d1dbb191fc40c8af967c590e08724b74John McCall
1556fbf780a9d1dbb191fc40c8af967c590e08724b74John McCall    // Note that it is legal to allocate a zero-length array, and we
1557fbf780a9d1dbb191fc40c8af967c590e08724b74John McCall    // can never fold the check away because the length should always
1558fbf780a9d1dbb191fc40c8af967c590e08724b74John McCall    // come from a cookie.
15597cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall    CGF.emitArrayDestroy(deletedPtr, arrayEnd, elementType,
15607cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                         CGF.getDestroyer(dtorKind),
1561fbf780a9d1dbb191fc40c8af967c590e08724b74John McCall                         /*checkZeroLength*/ true,
15627cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall                         CGF.needsEHCleanup(dtorKind));
15631e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  }
15641e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15657cfd76cb5cec2aa7aaa4176339c806de6ec85a79John McCall  // Pop the cleanup block.
15661e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  CGF.PopCleanupBlock();
15671e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall}
15681e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
156916d81b8db39593b5f1a38b077757272a09c12da8Anders Carlssonvoid CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
15709091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  const Expr *Arg = E->getArgument();
15719091656e423f2354e53b2b3baa95b3eb5510badcDouglas Gregor  llvm::Value *Ptr = EmitScalarExpr(Arg);
157216d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
157316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  // Null check the pointer.
157416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  llvm::BasicBlock *DeleteNotNull = createBasicBlock("delete.notnull");
157516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  llvm::BasicBlock *DeleteEnd = createBasicBlock("delete.end");
157616d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1577b924124316becf2968a37dab36d0c48ea167666fAnders Carlsson  llvm::Value *IsNull = Builder.CreateIsNull(Ptr, "isnull");
157816d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
157916d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  Builder.CreateCondBr(IsNull, DeleteEnd, DeleteNotNull);
158016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  EmitBlock(DeleteNotNull);
15811e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15821e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // We might be deleting a pointer to array.  If so, GEP down to the
15831e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // first non-array element.
15841e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  // (this assumes that A(*)[3][7] is converted to [3 x [7 x %A]]*)
15851e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  QualType DeleteTy = Arg->getType()->getAs<PointerType>()->getPointeeType();
15861e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  if (DeleteTy->isConstantArrayType()) {
15871e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    llvm::Value *Zero = Builder.getInt32(0);
15885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<llvm::Value*,8> GEP;
15891e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15901e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    GEP.push_back(Zero); // point at the outermost array
15911e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15921e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    // For each layer of array type we're pointing at:
15931e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall    while (const ConstantArrayType *Arr
15941e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall             = getContext().getAsConstantArrayType(DeleteTy)) {
15951e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      // 1. Unpeel the array type.
15961e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      DeleteTy = Arr->getElementType();
15971e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
15981e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      // 2. GEP to the first element of the array.
15991e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall      GEP.push_back(Zero);
160016d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson    }
16011e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
16020f6ac7cf7bc6a02c1a5c19d2c90ec0d1dd7786e7Jay Foad    Ptr = Builder.CreateInBoundsGEP(Ptr, GEP, "del.first");
160316d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  }
160416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
1605eede61a83e90f3cb03ef8665b67d648dccd6ce42Douglas Gregor  assert(ConvertTypeForMem(DeleteTy) ==
1606eede61a83e90f3cb03ef8665b67d648dccd6ce42Douglas Gregor         cast<llvm::PointerType>(Ptr->getType())->getElementType());
16071e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall
16081e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  if (E->isArrayForm()) {
16096ec278d1a354517e20f13a877481453ee7940c78John McCall    EmitArrayDelete(*this, E, Ptr, DeleteTy);
16101e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  } else {
1611a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor    EmitObjectDelete(*this, E->getOperatorDelete(), Ptr, DeleteTy,
1612a8b20f70d562cdc2679f82d409832b79fc415277Douglas Gregor                     E->isGlobalDelete());
16131e7fe751466ea82665fd21e9162fd7cc9c5f412dJohn McCall  }
161416d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson
161516d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson  EmitBlock(DeleteEnd);
161616d81b8db39593b5f1a38b077757272a09c12da8Anders Carlsson}
1617c2e84ae9a6d25cea3e583c768e576b4c981ec028Mike Stump
16184bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlssonstatic llvm::Constant *getBadTypeidFn(CodeGenFunction &CGF) {
16194bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson  // void __cxa_bad_typeid();
16208b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner  llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
16214bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson
16224bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson  return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
16234bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson}
16244bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson
16254bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlssonstatic void EmitBadTypeidCall(CodeGenFunction &CGF) {
1626ad3692bbe1874abafae1757a2b9d3bfa2249dc43Anders Carlsson  llvm::Value *Fn = getBadTypeidFn(CGF);
1627bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
16284bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson  CGF.Builder.CreateUnreachable();
16294bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson}
16304bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson
16313f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlssonstatic llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF,
16323f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson                                         const Expr *E,
16332acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner                                         llvm::Type *StdTypeInfoPtrTy) {
16343f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  // Get the vtable pointer.
16353f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  llvm::Value *ThisPtr = CGF.EmitLValue(E).getAddress();
16363f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16373f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  // C++ [expr.typeid]p2:
16383f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   If the glvalue expression is obtained by applying the unary * operator to
16393f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   a pointer and the pointer is a null pointer value, the typeid expression
16403f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   throws the std::bad_typeid exception.
16413f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E->IgnoreParens())) {
16423f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson    if (UO->getOpcode() == UO_Deref) {
16433f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      llvm::BasicBlock *BadTypeidBlock =
16443f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson        CGF.createBasicBlock("typeid.bad_typeid");
16453f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      llvm::BasicBlock *EndBlock =
16463f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson        CGF.createBasicBlock("typeid.end");
16473f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16483f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      llvm::Value *IsNull = CGF.Builder.CreateIsNull(ThisPtr);
16493f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      CGF.Builder.CreateCondBr(IsNull, BadTypeidBlock, EndBlock);
16503f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16513f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      CGF.EmitBlock(BadTypeidBlock);
16523f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      EmitBadTypeidCall(CGF);
16533f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson      CGF.EmitBlock(EndBlock);
16543f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson    }
16553f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  }
16563f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16573f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  llvm::Value *Value = CGF.GetVTablePtr(ThisPtr,
16583f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson                                        StdTypeInfoPtrTy->getPointerTo());
16593f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16603f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  // Load the type info.
16613f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  Value = CGF.Builder.CreateConstInBoundsGEP1_64(Value, -1ULL);
16623f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  return CGF.Builder.CreateLoad(Value);
16633f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson}
16643f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16653ad32c8d93eb65d1d4943d7df567fc9b4f55d137John McCallllvm::Value *CodeGenFunction::EmitCXXTypeidExpr(const CXXTypeidExpr *E) {
16662acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *StdTypeInfoPtrTy =
16673f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson    ConvertType(E->getType())->getPointerTo();
166831b7f52d8c8d459e80d2a72176cc7fcc4b7d8d38Anders Carlsson
16691d7088d1d9dc99e5478c0184a3e21cafef2a0b53Anders Carlsson  if (E->isTypeOperand()) {
16701d7088d1d9dc99e5478c0184a3e21cafef2a0b53Anders Carlsson    llvm::Constant *TypeInfo =
16711d7088d1d9dc99e5478c0184a3e21cafef2a0b53Anders Carlsson      CGM.GetAddrOfRTTIDescriptor(E->getTypeOperand());
16723f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson    return Builder.CreateBitCast(TypeInfo, StdTypeInfoPtrTy);
16731d7088d1d9dc99e5478c0184a3e21cafef2a0b53Anders Carlsson  }
16744bdbc0cb1e29ac870b7e7985cf4a1b5c34176e8cAnders Carlsson
16753f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  // C++ [expr.typeid]p2:
16763f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   When typeid is applied to a glvalue expression whose type is a
16773f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   polymorphic class type, the result refers to a std::type_info object
16783f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   representing the type of the most derived object (that is, the dynamic
16793f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  //   type) to which the glvalue refers.
16800d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith  if (E->isPotentiallyEvaluated())
16810d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith    return EmitTypeidFromVTable(*this, E->getExprOperand(),
16820d729105ecb50a7e3cbe6e57c29149edfa5cf05aRichard Smith                                StdTypeInfoPtrTy);
16833f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson
16843f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  QualType OperandTy = E->getExprOperand()->getType();
16853f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson  return Builder.CreateBitCast(CGM.GetAddrOfRTTIDescriptor(OperandTy),
16863f6c5e13f6c1662a7173c747fc63f4e8edb91206Anders Carlsson                               StdTypeInfoPtrTy);
1687c2e84ae9a6d25cea3e583c768e576b4c981ec028Mike Stump}
1688c849c052d6b4b70f2651c1969531861a5f230053Mike Stump
1689f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlssonstatic llvm::Constant *getDynamicCastFn(CodeGenFunction &CGF) {
1690f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  // void *__dynamic_cast(const void *sub,
1691f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  //                      const abi::__class_type_info *src,
1692f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  //                      const abi::__class_type_info *dst,
1693f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  //                      std::ptrdiff_t src2dst_offset);
1694f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
16958b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner  llvm::Type *Int8PtrTy = CGF.Int8PtrTy;
16969cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  llvm::Type *PtrDiffTy =
1697f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CGF.ConvertType(CGF.getContext().getPointerDiffType());
1698f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
16999cbe4f0ba01ec304e1e3d071c071f7bca33631c0Chris Lattner  llvm::Type *Args[4] = { Int8PtrTy, Int8PtrTy, Int8PtrTy, PtrDiffTy };
170021f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer
170121f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer  llvm::FunctionType *FTy = llvm::FunctionType::get(Int8PtrTy, Args, false);
170221f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer
170321f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer  // Mark the function as nounwind readonly.
170421f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer  llvm::Attribute::AttrKind FuncAttrs[] = { llvm::Attribute::NoUnwind,
170521f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer                                            llvm::Attribute::ReadOnly };
170621f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer  llvm::AttributeSet Attrs = llvm::AttributeSet::get(
170721f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer      CGF.getLLVMContext(), llvm::AttributeSet::FunctionIndex, FuncAttrs);
170821f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer
170921f6b39cca88f0a027c6f5cde24575165c2d5e40Benjamin Kramer  return CGF.CGM.CreateRuntimeFunction(FTy, "__dynamic_cast", Attrs);
1710f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson}
1711f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1712f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlssonstatic llvm::Constant *getBadCastFn(CodeGenFunction &CGF) {
1713f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  // void __cxa_bad_cast();
17148b418685e9e4f02f4eb2a76e1ec063e07552b68dChris Lattner  llvm::FunctionType *FTy = llvm::FunctionType::get(CGF.VoidTy, false);
1715f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  return CGF.CGM.CreateRuntimeFunction(FTy, "__cxa_bad_cast");
1716f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson}
1717f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
17183ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlssonstatic void EmitBadCastCall(CodeGenFunction &CGF) {
1719ad3692bbe1874abafae1757a2b9d3bfa2249dc43Anders Carlsson  llvm::Value *Fn = getBadCastFn(CGF);
1720bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  CGF.EmitRuntimeCallOrInvoke(Fn).setDoesNotReturn();
17213ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  CGF.Builder.CreateUnreachable();
17223ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson}
17233ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson
1724ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer/// \brief Compute the src2dst_offset hint as described in the
1725ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer/// Itanium C++ ABI [2.9.7]
1726ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramerstatic CharUnits computeOffsetHint(ASTContext &Context,
1727ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer                                   const CXXRecordDecl *Src,
1728ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer                                   const CXXRecordDecl *Dst) {
1729ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
1730ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer                     /*DetectVirtual=*/false);
1731ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1732ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // If Dst is not derived from Src we can skip the whole computation below and
1733ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // return that Src is not a public base of Dst.  Record all inheritance paths.
1734ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  if (!Dst->isDerivedFrom(Src, Paths))
1735ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    return CharUnits::fromQuantity(-2ULL);
1736ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1737ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  unsigned NumPublicPaths = 0;
1738ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  CharUnits Offset;
1739ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1740ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // Now walk all possible inheritance paths.
1741ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  for (CXXBasePaths::paths_iterator I = Paths.begin(), E = Paths.end();
1742ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer       I != E; ++I) {
1743ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    if (I->Access != AS_public) // Ignore non-public inheritance.
1744ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      continue;
1745ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1746ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    ++NumPublicPaths;
1747ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1748ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    for (CXXBasePath::iterator J = I->begin(), JE = I->end(); J != JE; ++J) {
1749ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      // If the path contains a virtual base class we can't give any hint.
1750ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      // -1: no hint.
1751ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      if (J->Base->isVirtual())
1752ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer        return CharUnits::fromQuantity(-1ULL);
1753ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1754ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      if (NumPublicPaths > 1) // Won't use offsets, skip computation.
1755ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer        continue;
1756ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1757ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      // Accumulate the base class offsets.
1758ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      const ASTRecordLayout &L = Context.getASTRecordLayout(J->Class);
1759ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer      Offset += L.getBaseClassOffset(J->Base->getType()->getAsCXXRecordDecl());
1760ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    }
1761ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  }
1762ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1763ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // -2: Src is not a public base of Dst.
1764ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  if (NumPublicPaths == 0)
1765ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    return CharUnits::fromQuantity(-2ULL);
1766ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1767ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // -3: Src is a multiple public base type but never a virtual base type.
1768ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  if (NumPublicPaths > 1)
1769ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    return CharUnits::fromQuantity(-3ULL);
1770ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1771ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // Otherwise, the Src type is a unique public nonvirtual base type of Dst.
1772ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // Return the offset of Src from the origin of Dst.
1773ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  return Offset;
1774ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer}
1775ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer
1776f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlssonstatic llvm::Value *
1777f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders CarlssonEmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
1778f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson                    QualType SrcTy, QualType DestTy,
1779f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson                    llvm::BasicBlock *CastEnd) {
17802acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *PtrDiffLTy =
1781f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CGF.ConvertType(CGF.getContext().getPointerDiffType());
17822acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *DestLTy = CGF.ConvertType(DestTy);
1783f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1784f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  if (const PointerType *PTy = DestTy->getAs<PointerType>()) {
1785f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    if (PTy->getPointeeType()->isVoidType()) {
1786f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      // C++ [expr.dynamic.cast]p7:
1787f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      //   If T is "pointer to cv void," then the result is a pointer to the
1788f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      //   most derived object pointed to by v.
1789f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1790f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      // Get the vtable pointer.
1791f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      llvm::Value *VTable = CGF.GetVTablePtr(Value, PtrDiffLTy->getPointerTo());
1792f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1793f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      // Get the offset-to-top from the vtable.
1794f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      llvm::Value *OffsetToTop =
1795f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson        CGF.Builder.CreateConstInBoundsGEP1_64(VTable, -2ULL);
1796f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      OffsetToTop = CGF.Builder.CreateLoad(OffsetToTop, "offset.to.top");
1797f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1798f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      // Finally, add the offset to the pointer.
1799f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      Value = CGF.EmitCastToVoidPtr(Value);
1800f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      Value = CGF.Builder.CreateInBoundsGEP(Value, OffsetToTop);
1801f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1802f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      return CGF.Builder.CreateBitCast(Value, DestLTy);
1803f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    }
1804f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  }
1805f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1806f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  QualType SrcRecordTy;
1807f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  QualType DestRecordTy;
1808f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1809f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  if (const PointerType *DestPTy = DestTy->getAs<PointerType>()) {
1810f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    SrcRecordTy = SrcTy->castAs<PointerType>()->getPointeeType();
1811f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    DestRecordTy = DestPTy->getPointeeType();
1812c849c052d6b4b70f2651c1969531861a5f230053Mike Stump  } else {
1813f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    SrcRecordTy = SrcTy;
1814f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    DestRecordTy = DestTy->castAs<ReferenceType>()->getPointeeType();
1815c849c052d6b4b70f2651c1969531861a5f230053Mike Stump  }
1816c849c052d6b4b70f2651c1969531861a5f230053Mike Stump
1817f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  assert(SrcRecordTy->isRecordType() && "source type must be a record type!");
1818f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  assert(DestRecordTy->isRecordType() && "dest type must be a record type!");
1819f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1820f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  llvm::Value *SrcRTTI =
1821f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
1822f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  llvm::Value *DestRTTI =
1823f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
1824f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1825ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  // Compute the offset hint.
1826ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
1827ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  const CXXRecordDecl *DestDecl = DestRecordTy->getAsCXXRecordDecl();
1828ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer  llvm::Value *OffsetHint =
1829ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer    llvm::ConstantInt::get(PtrDiffLTy,
1830ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer                           computeOffsetHint(CGF.getContext(), SrcDecl,
1831ae3f7608756eb90d8dd5d014238437fcbf1c7de7Benjamin Kramer                                             DestDecl).getQuantity());
1832f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1833f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  // Emit the call to __dynamic_cast.
1834f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  Value = CGF.EmitCastToVoidPtr(Value);
1835bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall
1836bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  llvm::Value *args[] = { Value, SrcRTTI, DestRTTI, OffsetHint };
1837bd7370a78604e9a20d698bfe328c1e43f12a0613John McCall  Value = CGF.EmitNounwindRuntimeCall(getDynamicCastFn(CGF), args);
1838f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  Value = CGF.Builder.CreateBitCast(Value, DestLTy);
1839f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1840f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  /// C++ [expr.dynamic.cast]p9:
1841f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  ///   A failed cast to reference type throws std::bad_cast
1842f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  if (DestTy->isReferenceType()) {
1843f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    llvm::BasicBlock *BadCastBlock =
1844f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson      CGF.createBasicBlock("dynamic_cast.bad_cast");
1845f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1846f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    llvm::Value *IsNull = CGF.Builder.CreateIsNull(Value);
1847f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CGF.Builder.CreateCondBr(IsNull, BadCastBlock, CastEnd);
1848f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1849f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CGF.EmitBlock(BadCastBlock);
18503ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson    EmitBadCastCall(CGF);
1851c849c052d6b4b70f2651c1969531861a5f230053Mike Stump  }
1852c849c052d6b4b70f2651c1969531861a5f230053Mike Stump
1853f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  return Value;
1854f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson}
1855f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
18563ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlssonstatic llvm::Value *EmitDynamicCastToNull(CodeGenFunction &CGF,
18573ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson                                          QualType DestTy) {
18582acc6e3feda5e4f7d9009bdcf8b1cd777fecfe2dChris Lattner  llvm::Type *DestLTy = CGF.ConvertType(DestTy);
18593ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  if (DestTy->isPointerType())
18603ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson    return llvm::Constant::getNullValue(DestLTy);
18613ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson
18623ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  /// C++ [expr.dynamic.cast]p9:
18633ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  ///   A failed cast to reference type throws std::bad_cast
18643ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  EmitBadCastCall(CGF);
18653ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson
18663ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  CGF.EmitBlock(CGF.createBasicBlock("dynamic_cast.end"));
18673ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  return llvm::UndefValue::get(DestLTy);
18683ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson}
18693ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson
1870f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlssonllvm::Value *CodeGenFunction::EmitDynamicCast(llvm::Value *Value,
1871f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson                                              const CXXDynamicCastExpr *DCE) {
1872f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  QualType DestTy = DCE->getTypeAsWritten();
1873c849c052d6b4b70f2651c1969531861a5f230053Mike Stump
18743ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  if (DCE->isAlwaysNull())
18753ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson    return EmitDynamicCastToNull(*this, DestTy);
18763ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson
18773ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson  QualType SrcTy = DCE->getSubExpr()->getType();
18783ddcdd5d6c88902d24baa9e6bb240a3da88e68d4Anders Carlsson
1879f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  // C++ [expr.dynamic.cast]p4:
1880f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  //   If the value of v is a null pointer value in the pointer case, the result
1881f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  //   is the null pointer value of type T.
1882f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  bool ShouldNullCheckSrcValue = SrcTy->isPointerType();
1883f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1884f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  llvm::BasicBlock *CastNull = 0;
1885f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  llvm::BasicBlock *CastNotNull = 0;
1886f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  llvm::BasicBlock *CastEnd = createBasicBlock("dynamic_cast.end");
1887f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1888f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  if (ShouldNullCheckSrcValue) {
1889f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CastNull = createBasicBlock("dynamic_cast.null");
1890f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    CastNotNull = createBasicBlock("dynamic_cast.notnull");
1891c849c052d6b4b70f2651c1969531861a5f230053Mike Stump
1892f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    llvm::Value *IsNull = Builder.CreateIsNull(Value);
1893f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    Builder.CreateCondBr(IsNull, CastNull, CastNotNull);
1894f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    EmitBlock(CastNotNull);
1895c849c052d6b4b70f2651c1969531861a5f230053Mike Stump  }
1896f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1897f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  Value = EmitDynamicCastCall(*this, Value, SrcTy, DestTy, CastEnd);
1898f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1899f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  if (ShouldNullCheckSrcValue) {
1900f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    EmitBranch(CastEnd);
1901f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1902f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    EmitBlock(CastNull);
1903f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    EmitBranch(CastEnd);
1904c849c052d6b4b70f2651c1969531861a5f230053Mike Stump  }
1905f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1906f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  EmitBlock(CastEnd);
1907f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1908f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  if (ShouldNullCheckSrcValue) {
1909f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    llvm::PHINode *PHI = Builder.CreatePHI(Value->getType(), 2);
1910f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    PHI->addIncoming(Value, CastNotNull);
1911f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    PHI->addIncoming(llvm::Constant::getNullValue(Value->getType()), CastNull);
1912f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson
1913f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson    Value = PHI;
1914c849c052d6b4b70f2651c1969531861a5f230053Mike Stump  }
1915c849c052d6b4b70f2651c1969531861a5f230053Mike Stump
1916f0cb4a6ac7ffcba25309a5d1ad1a4bf869b13a33Anders Carlsson  return Value;
1917c849c052d6b4b70f2651c1969531861a5f230053Mike Stump}
19184c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman
19194c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedmanvoid CodeGenFunction::EmitLambdaExpr(const LambdaExpr *E, AggValueSlot Slot) {
1920f8823e7ae00d2b0a9395b51b7bd53b505df72031Eli Friedman  RunCleanupsScope Scope(*this);
1921377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman  LValue SlotLV = MakeAddrLValue(Slot.getAddr(), E->getType(),
1922377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman                                 Slot.getAlignment());
1923f8823e7ae00d2b0a9395b51b7bd53b505df72031Eli Friedman
19244c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman  CXXRecordDecl::field_iterator CurField = E->getLambdaClass()->field_begin();
19254c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman  for (LambdaExpr::capture_init_iterator i = E->capture_init_begin(),
19264c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman                                         e = E->capture_init_end();
1927c07b18ed2b207b17cf8d770966e5c1e52d46f4ecEric Christopher       i != e; ++i, ++CurField) {
19284c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman    // Emit initialization
1929377ecc7996dce6803f7b7b6208cab5e197c9c5b8Eli Friedman
1930581deb3da481053c4993c7600f97acf7768caac5David Blaikie    LValue LV = EmitLValueForFieldInitialization(SlotLV, *CurField);
1931b74ed087469db042325bad76fdf3ff6ed67dec09Eli Friedman    ArrayRef<VarDecl *> ArrayIndexes;
1932b74ed087469db042325bad76fdf3ff6ed67dec09Eli Friedman    if (CurField->getType()->isArrayType())
1933b74ed087469db042325bad76fdf3ff6ed67dec09Eli Friedman      ArrayIndexes = E->getCaptureInitIndexVars(i);
1934581deb3da481053c4993c7600f97acf7768caac5David Blaikie    EmitInitializerForField(*CurField, LV, *i, ArrayIndexes);
19354c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman  }
19364c5d8afd100189b6cce4fd89bfb8aec5700acb50Eli Friedman}
1937