1 //===--- CGExprCXX.cpp - Emit LLVM Code for C++ expressions ---------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This contains code dealing with code generation of C++ expressions
12 //===----------------------------------------------------------------------===//
14 #include "CodeGenFunction.h"
15 using namespace clang;
16 using namespace CodeGen;
18 RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD,
20 ReturnValueSlot ReturnValue,
23 CallExpr::const_arg_iterator ArgBeg,
24 CallExpr::const_arg_iterator ArgEnd) {
25 assert(MD->isInstance() &&
26 "Trying to emit a member call expr on a static method!");
28 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
33 Args.push_back(std::make_pair(RValue::get(This),
34 MD->getThisType(getContext())));
36 // If there is a VTT parameter, emit it.
38 QualType T = getContext().getPointerType(getContext().VoidPtrTy);
39 Args.push_back(std::make_pair(RValue::get(VTT), T));
42 // And the rest of the call args
43 EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
45 QualType ResultType = FPT->getResultType();
46 return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args,
48 Callee, ReturnValue, Args, MD);
51 /// canDevirtualizeMemberFunctionCalls - Checks whether virtual calls on given
52 /// expr can be devirtualized.
53 static bool canDevirtualizeMemberFunctionCalls(const Expr *Base) {
54 if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Base)) {
55 if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
56 // This is a record decl. We know the type and can devirtualize it.
57 return VD->getType()->isRecordType();
63 // We can always devirtualize calls on temporary object expressions.
64 if (isa<CXXConstructExpr>(Base))
67 // And calls on bound temporaries.
68 if (isa<CXXBindTemporaryExpr>(Base))
71 // Check if this is a call expr that returns a record type.
72 if (const CallExpr *CE = dyn_cast<CallExpr>(Base))
73 return CE->getCallReturnType()->isRecordType();
75 // We can't devirtualize the call.
79 RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE,
80 ReturnValueSlot ReturnValue) {
81 if (isa<BinaryOperator>(CE->getCallee()->IgnoreParens()))
82 return EmitCXXMemberPointerCallExpr(CE, ReturnValue);
84 const MemberExpr *ME = cast<MemberExpr>(CE->getCallee()->IgnoreParens());
85 const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
88 // The method is static, emit it as we would a regular call.
89 llvm::Value *Callee = CGM.GetAddrOfFunction(MD);
90 return EmitCall(getContext().getPointerType(MD->getType()), Callee,
91 ReturnValue, CE->arg_begin(), CE->arg_end());
94 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
96 const llvm::Type *Ty =
97 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
102 This = EmitScalarExpr(ME->getBase());
104 LValue BaseLV = EmitLValue(ME->getBase());
105 This = BaseLV.getAddress();
108 if (MD->isCopyAssignment() && MD->isTrivial()) {
109 // We don't like to generate the trivial copy assignment operator when
110 // it isn't necessary; just produce the proper effect here.
111 llvm::Value *RHS = EmitLValue(*CE->arg_begin()).getAddress();
112 EmitAggregateCopy(This, RHS, CE->getType());
113 return RValue::get(This);
116 // C++ [class.virtual]p12:
117 // Explicit qualification with the scope operator (5.1) suppresses the
118 // virtual call mechanism.
120 // We also don't emit a virtual call if the base expression has a record type
121 // because then we know what the type is.
123 if (const CXXDestructorDecl *Destructor
124 = dyn_cast<CXXDestructorDecl>(MD)) {
125 if (Destructor->isTrivial())
126 return RValue::get(0);
127 if (MD->isVirtual() && !ME->hasQualifier() &&
128 !canDevirtualizeMemberFunctionCalls(ME->getBase())) {
129 Callee = BuildVirtualCall(Destructor, Dtor_Complete, This, Ty);
131 Callee = CGM.GetAddrOfFunction(GlobalDecl(Destructor, Dtor_Complete), Ty);
133 } else if (MD->isVirtual() && !ME->hasQualifier() &&
134 !canDevirtualizeMemberFunctionCalls(ME->getBase())) {
135 Callee = BuildVirtualCall(MD, This, Ty);
137 Callee = CGM.GetAddrOfFunction(MD, Ty);
140 return EmitCXXMemberCall(MD, Callee, ReturnValue, This, /*VTT=*/0,
141 CE->arg_begin(), CE->arg_end());
145 CodeGenFunction::EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E,
146 ReturnValueSlot ReturnValue) {
147 const BinaryOperator *BO =
148 cast<BinaryOperator>(E->getCallee()->IgnoreParens());
149 const Expr *BaseExpr = BO->getLHS();
150 const Expr *MemFnExpr = BO->getRHS();
152 const MemberPointerType *MPT =
153 MemFnExpr->getType()->getAs<MemberPointerType>();
154 const FunctionProtoType *FPT =
155 MPT->getPointeeType()->getAs<FunctionProtoType>();
156 const CXXRecordDecl *RD =
157 cast<CXXRecordDecl>(MPT->getClass()->getAs<RecordType>()->getDecl());
159 const llvm::FunctionType *FTy =
160 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(RD, FPT),
163 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);
165 // Get the member function pointer.
166 llvm::Value *MemFnPtr = CreateMemTemp(MemFnExpr->getType(), "mem.fn");
167 EmitAggExpr(MemFnExpr, MemFnPtr, /*VolatileDest=*/false);
169 // Emit the 'this' pointer.
172 if (BO->getOpcode() == BinaryOperator::PtrMemI)
173 This = EmitScalarExpr(BaseExpr);
175 This = EmitLValue(BaseExpr).getAddress();
178 llvm::Value *Adj = Builder.CreateStructGEP(MemFnPtr, 1);
179 Adj = Builder.CreateLoad(Adj, "mem.fn.adj");
181 llvm::Value *Ptr = Builder.CreateBitCast(This, Int8PtrTy, "ptr");
182 Ptr = Builder.CreateGEP(Ptr, Adj, "adj");
184 This = Builder.CreateBitCast(Ptr, This->getType(), "this");
186 llvm::Value *FnPtr = Builder.CreateStructGEP(MemFnPtr, 0, "mem.fn.ptr");
188 const llvm::Type *PtrDiffTy = ConvertType(getContext().getPointerDiffType());
190 llvm::Value *FnAsInt = Builder.CreateLoad(FnPtr, "fn");
192 // If the LSB in the function pointer is 1, the function pointer points to
193 // a virtual function.
194 llvm::Value *IsVirtual
195 = Builder.CreateAnd(FnAsInt, llvm::ConstantInt::get(PtrDiffTy, 1),
198 IsVirtual = Builder.CreateTrunc(IsVirtual,
199 llvm::Type::getInt1Ty(VMContext));
201 llvm::BasicBlock *FnVirtual = createBasicBlock("fn.virtual");
202 llvm::BasicBlock *FnNonVirtual = createBasicBlock("fn.nonvirtual");
203 llvm::BasicBlock *FnEnd = createBasicBlock("fn.end");
205 Builder.CreateCondBr(IsVirtual, FnVirtual, FnNonVirtual);
206 EmitBlock(FnVirtual);
208 const llvm::Type *VTableTy =
209 FTy->getPointerTo()->getPointerTo();
211 llvm::Value *VTable = Builder.CreateBitCast(This, VTableTy->getPointerTo());
212 VTable = Builder.CreateLoad(VTable);
214 VTable = Builder.CreateBitCast(VTable, Int8PtrTy);
215 llvm::Value *VTableOffset =
216 Builder.CreateSub(FnAsInt, llvm::ConstantInt::get(PtrDiffTy, 1));
218 VTable = Builder.CreateGEP(VTable, VTableOffset, "fn");
219 VTable = Builder.CreateBitCast(VTable, VTableTy);
221 llvm::Value *VirtualFn = Builder.CreateLoad(VTable, "virtualfn");
224 EmitBlock(FnNonVirtual);
226 // If the function is not virtual, just load the pointer.
227 llvm::Value *NonVirtualFn = Builder.CreateLoad(FnPtr, "fn");
228 NonVirtualFn = Builder.CreateIntToPtr(NonVirtualFn, FTy->getPointerTo());
232 llvm::PHINode *Callee = Builder.CreatePHI(FTy->getPointerTo());
233 Callee->reserveOperandSpace(2);
234 Callee->addIncoming(VirtualFn, FnVirtual);
235 Callee->addIncoming(NonVirtualFn, FnNonVirtual);
240 getContext().getPointerType(getContext().getTagDeclType(RD));
242 // Push the this ptr.
243 Args.push_back(std::make_pair(RValue::get(This), ThisType));
245 // And the rest of the call args
246 EmitCallArgs(Args, FPT, E->arg_begin(), E->arg_end());
247 const FunctionType *BO_FPT = BO->getType()->getAs<FunctionProtoType>();
248 return EmitCall(CGM.getTypes().getFunctionInfo(Args, BO_FPT), Callee,
253 CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
254 const CXXMethodDecl *MD,
255 ReturnValueSlot ReturnValue) {
256 assert(MD->isInstance() &&
257 "Trying to emit a member call expr on a static method!");
259 if (MD->isCopyAssignment()) {
260 const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(MD->getDeclContext());
261 if (ClassDecl->hasTrivialCopyAssignment()) {
262 assert(!ClassDecl->hasUserDeclaredCopyAssignment() &&
263 "EmitCXXOperatorMemberCallExpr - user declared copy assignment");
264 llvm::Value *This = EmitLValue(E->getArg(0)).getAddress();
265 llvm::Value *Src = EmitLValue(E->getArg(1)).getAddress();
266 QualType Ty = E->getType();
267 EmitAggregateCopy(This, Src, Ty);
268 return RValue::get(This);
272 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
273 const llvm::Type *Ty =
274 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
277 llvm::Value *This = EmitLValue(E->getArg(0)).getAddress();
280 if (MD->isVirtual() && !canDevirtualizeMemberFunctionCalls(E->getArg(0)))
281 Callee = BuildVirtualCall(MD, This, Ty);
283 Callee = CGM.GetAddrOfFunction(MD, Ty);
285 return EmitCXXMemberCall(MD, Callee, ReturnValue, This, /*VTT=*/0,
286 E->arg_begin() + 1, E->arg_end());
290 CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest,
291 const CXXConstructExpr *E) {
292 assert(Dest && "Must have a destination!");
293 const CXXConstructorDecl *CD = E->getConstructor();
294 const ConstantArrayType *Array =
295 getContext().getAsConstantArrayType(E->getType());
296 // For a copy constructor, even if it is trivial, must fall thru so
297 // its argument is code-gen'ed.
298 if (!CD->isCopyConstructor()) {
299 QualType InitType = E->getType();
301 InitType = getContext().getBaseElementType(Array);
302 const CXXRecordDecl *RD =
303 cast<CXXRecordDecl>(InitType->getAs<RecordType>()->getDecl());
304 if (RD->hasTrivialConstructor())
307 // Code gen optimization to eliminate copy constructor and return
308 // its first argument instead.
309 if (getContext().getLangOptions().ElideConstructors && E->isElidable()) {
310 const Expr *Arg = E->getArg(0)->getTemporaryObject();
311 EmitAggExpr(Arg, Dest, false);
315 QualType BaseElementTy = getContext().getBaseElementType(Array);
316 const llvm::Type *BasePtr = ConvertType(BaseElementTy);
317 BasePtr = llvm::PointerType::getUnqual(BasePtr);
318 llvm::Value *BaseAddrPtr =
319 Builder.CreateBitCast(Dest, BasePtr);
321 EmitCXXAggrConstructorCall(CD, Array, BaseAddrPtr,
322 E->arg_begin(), E->arg_end());
326 (E->getConstructionKind() == CXXConstructExpr::CK_Complete)
327 ? Ctor_Complete : Ctor_Base;
328 bool ForVirtualBase =
329 E->getConstructionKind() == CXXConstructExpr::CK_VirtualBase;
331 // Call the constructor.
332 EmitCXXConstructorCall(CD, Type, ForVirtualBase, Dest,
333 E->arg_begin(), E->arg_end());
337 static CharUnits CalculateCookiePadding(ASTContext &Ctx, QualType ElementType) {
338 const RecordType *RT = ElementType->getAs<RecordType>();
340 return CharUnits::Zero();
342 const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl());
344 return CharUnits::Zero();
346 // Check if the class has a trivial destructor.
347 if (RD->hasTrivialDestructor()) {
348 // Check if the usual deallocation function takes two arguments.
349 const CXXMethodDecl *UsualDeallocationFunction = 0;
351 DeclarationName OpName =
352 Ctx.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
353 DeclContext::lookup_const_iterator Op, OpEnd;
354 for (llvm::tie(Op, OpEnd) = RD->lookup(OpName);
356 const CXXMethodDecl *Delete = cast<CXXMethodDecl>(*Op);
358 if (Delete->isUsualDeallocationFunction()) {
359 UsualDeallocationFunction = Delete;
364 // No usual deallocation function, we don't need a cookie.
365 if (!UsualDeallocationFunction)
366 return CharUnits::Zero();
368 // The usual deallocation function doesn't take a size_t argument, so we
369 // don't need a cookie.
370 if (UsualDeallocationFunction->getNumParams() == 1)
371 return CharUnits::Zero();
373 assert(UsualDeallocationFunction->getNumParams() == 2 &&
374 "Unexpected deallocation function type!");
377 // Padding is the maximum of sizeof(size_t) and alignof(ElementType)
378 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
379 Ctx.getTypeAlignInChars(ElementType));
382 static CharUnits CalculateCookiePadding(ASTContext &Ctx, const CXXNewExpr *E) {
384 return CharUnits::Zero();
386 // No cookie is required if the new operator being used is
387 // ::operator new[](size_t, void*).
388 const FunctionDecl *OperatorNew = E->getOperatorNew();
389 if (OperatorNew->getDeclContext()->getLookupContext()->isFileContext()) {
390 if (OperatorNew->getNumParams() == 2) {
391 CanQualType ParamType =
392 Ctx.getCanonicalType(OperatorNew->getParamDecl(1)->getType());
394 if (ParamType == Ctx.VoidPtrTy)
395 return CharUnits::Zero();
399 return CalculateCookiePadding(Ctx, E->getAllocatedType());
402 static llvm::Value *EmitCXXNewAllocSize(ASTContext &Context,
403 CodeGenFunction &CGF,
405 llvm::Value *& NumElements) {
406 QualType Type = E->getAllocatedType();
407 CharUnits TypeSize = CGF.getContext().getTypeSizeInChars(Type);
408 const llvm::Type *SizeTy = CGF.ConvertType(CGF.getContext().getSizeType());
411 return llvm::ConstantInt::get(SizeTy, TypeSize.getQuantity());
413 CharUnits CookiePadding = CalculateCookiePadding(CGF.getContext(), E);
415 Expr::EvalResult Result;
416 if (E->getArraySize()->Evaluate(Result, CGF.getContext()) &&
417 !Result.HasSideEffects && Result.Val.isInt()) {
419 CharUnits AllocSize =
420 Result.Val.getInt().getZExtValue() * TypeSize + CookiePadding;
423 llvm::ConstantInt::get(SizeTy, Result.Val.getInt().getZExtValue());
424 while (const ArrayType *AType = Context.getAsArrayType(Type)) {
425 const llvm::ArrayType *llvmAType =
426 cast<llvm::ArrayType>(CGF.ConvertType(Type));
428 CGF.Builder.CreateMul(NumElements,
429 llvm::ConstantInt::get(
430 SizeTy, llvmAType->getNumElements()));
431 Type = AType->getElementType();
434 return llvm::ConstantInt::get(SizeTy, AllocSize.getQuantity());
437 // Emit the array size expression.
438 NumElements = CGF.EmitScalarExpr(E->getArraySize());
440 // Multiply with the type size.
442 CGF.Builder.CreateMul(NumElements,
443 llvm::ConstantInt::get(SizeTy,
444 TypeSize.getQuantity()));
446 while (const ArrayType *AType = Context.getAsArrayType(Type)) {
447 const llvm::ArrayType *llvmAType =
448 cast<llvm::ArrayType>(CGF.ConvertType(Type));
450 CGF.Builder.CreateMul(NumElements,
451 llvm::ConstantInt::get(
452 SizeTy, llvmAType->getNumElements()));
453 Type = AType->getElementType();
456 // And add the cookie padding if necessary.
457 if (!CookiePadding.isZero())
458 V = CGF.Builder.CreateAdd(V,
459 llvm::ConstantInt::get(SizeTy, CookiePadding.getQuantity()));
464 static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E,
466 llvm::Value *NumElements) {
468 if (CXXConstructorDecl *Ctor = E->getConstructor()) {
469 if (!Ctor->getParent()->hasTrivialConstructor())
470 CGF.EmitCXXAggrConstructorCall(Ctor, NumElements, NewPtr,
471 E->constructor_arg_begin(),
472 E->constructor_arg_end());
477 QualType AllocType = E->getAllocatedType();
479 if (CXXConstructorDecl *Ctor = E->getConstructor()) {
480 CGF.EmitCXXConstructorCall(Ctor, Ctor_Complete, /*ForVirtualBase=*/false,
481 NewPtr, E->constructor_arg_begin(),
482 E->constructor_arg_end());
487 // We have a POD type.
488 if (E->getNumConstructorArgs() == 0)
491 assert(E->getNumConstructorArgs() == 1 &&
492 "Can only have one argument to initializer of POD type.");
494 const Expr *Init = E->getConstructorArg(0);
496 if (!CGF.hasAggregateLLVMType(AllocType))
497 CGF.EmitStoreOfScalar(CGF.EmitScalarExpr(Init), NewPtr,
498 AllocType.isVolatileQualified(), AllocType);
499 else if (AllocType->isAnyComplexType())
500 CGF.EmitComplexExprIntoAddr(Init, NewPtr,
501 AllocType.isVolatileQualified());
503 CGF.EmitAggExpr(Init, NewPtr, AllocType.isVolatileQualified());
506 llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
507 QualType AllocType = E->getAllocatedType();
508 FunctionDecl *NewFD = E->getOperatorNew();
509 const FunctionProtoType *NewFTy = NewFD->getType()->getAs<FunctionProtoType>();
513 // The allocation size is the first argument.
514 QualType SizeTy = getContext().getSizeType();
516 llvm::Value *NumElements = 0;
517 llvm::Value *AllocSize = EmitCXXNewAllocSize(getContext(),
518 *this, E, NumElements);
520 NewArgs.push_back(std::make_pair(RValue::get(AllocSize), SizeTy));
522 // Emit the rest of the arguments.
523 // FIXME: Ideally, this should just use EmitCallArgs.
524 CXXNewExpr::const_arg_iterator NewArg = E->placement_arg_begin();
526 // First, use the types from the function type.
527 // We start at 1 here because the first argument (the allocation size)
528 // has already been emitted.
529 for (unsigned i = 1, e = NewFTy->getNumArgs(); i != e; ++i, ++NewArg) {
530 QualType ArgType = NewFTy->getArgType(i);
532 assert(getContext().getCanonicalType(ArgType.getNonReferenceType()).
534 getContext().getCanonicalType(NewArg->getType()).getTypePtr() &&
535 "type mismatch in call argument!");
537 NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
542 // Either we've emitted all the call args, or we have a call to a
543 // variadic function.
544 assert((NewArg == E->placement_arg_end() || NewFTy->isVariadic()) &&
545 "Extra arguments in non-variadic function!");
547 // If we still have any arguments, emit them using the type of the argument.
548 for (CXXNewExpr::const_arg_iterator NewArgEnd = E->placement_arg_end();
549 NewArg != NewArgEnd; ++NewArg) {
550 QualType ArgType = NewArg->getType();
551 NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
555 // Emit the call to new.
557 EmitCall(CGM.getTypes().getFunctionInfo(NewArgs, NewFTy),
558 CGM.GetAddrOfFunction(NewFD), ReturnValueSlot(), NewArgs, NewFD);
560 // If an allocation function is declared with an empty exception specification
561 // it returns null to indicate failure to allocate storage. [expr.new]p13.
562 // (We don't need to check for null when there's no new initializer and
563 // we're allocating a POD type).
564 bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() &&
565 !(AllocType->isPODType() && !E->hasInitializer());
567 llvm::BasicBlock *NewNull = 0;
568 llvm::BasicBlock *NewNotNull = 0;
569 llvm::BasicBlock *NewEnd = 0;
571 llvm::Value *NewPtr = RV.getScalarVal();
573 if (NullCheckResult) {
574 NewNull = createBasicBlock("new.null");
575 NewNotNull = createBasicBlock("new.notnull");
576 NewEnd = createBasicBlock("new.end");
578 llvm::Value *IsNull =
579 Builder.CreateICmpEQ(NewPtr,
580 llvm::Constant::getNullValue(NewPtr->getType()),
583 Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
584 EmitBlock(NewNotNull);
587 CharUnits CookiePadding = CalculateCookiePadding(getContext(), E);
588 if (!CookiePadding.isZero()) {
589 CharUnits CookieOffset =
590 CookiePadding - getContext().getTypeSizeInChars(SizeTy);
592 llvm::Value *NumElementsPtr =
593 Builder.CreateConstInBoundsGEP1_64(NewPtr, CookieOffset.getQuantity());
595 NumElementsPtr = Builder.CreateBitCast(NumElementsPtr,
596 ConvertType(SizeTy)->getPointerTo());
597 Builder.CreateStore(NumElements, NumElementsPtr);
599 // Now add the padding to the new ptr.
600 NewPtr = Builder.CreateConstInBoundsGEP1_64(NewPtr,
601 CookiePadding.getQuantity());
604 if (AllocType->isArrayType()) {
605 while (const ArrayType *AType = getContext().getAsArrayType(AllocType))
606 AllocType = AType->getElementType();
608 Builder.CreateBitCast(NewPtr,
609 ConvertType(getContext().getPointerType(AllocType)));
610 EmitNewInitializer(*this, E, NewPtr, NumElements);
611 NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
614 NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
615 EmitNewInitializer(*this, E, NewPtr, NumElements);
618 if (NullCheckResult) {
619 Builder.CreateBr(NewEnd);
620 NewNotNull = Builder.GetInsertBlock();
622 Builder.CreateBr(NewEnd);
625 llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
626 PHI->reserveOperandSpace(2);
627 PHI->addIncoming(NewPtr, NewNotNull);
628 PHI->addIncoming(llvm::Constant::getNullValue(NewPtr->getType()), NewNull);
636 static std::pair<llvm::Value *, llvm::Value *>
637 GetAllocatedObjectPtrAndNumElements(CodeGenFunction &CGF,
638 llvm::Value *Ptr, QualType DeleteTy) {
639 QualType SizeTy = CGF.getContext().getSizeType();
640 const llvm::Type *SizeLTy = CGF.ConvertType(SizeTy);
642 CharUnits DeleteTypeAlign = CGF.getContext().getTypeAlignInChars(DeleteTy);
643 CharUnits CookiePadding =
644 std::max(CGF.getContext().getTypeSizeInChars(SizeTy),
646 assert(!CookiePadding.isZero() && "CookiePadding should not be 0.");
648 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
649 CharUnits CookieOffset =
650 CookiePadding - CGF.getContext().getTypeSizeInChars(SizeTy);
652 llvm::Value *AllocatedObjectPtr = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy);
654 CGF.Builder.CreateConstInBoundsGEP1_64(AllocatedObjectPtr,
655 -CookiePadding.getQuantity());
657 llvm::Value *NumElementsPtr =
658 CGF.Builder.CreateConstInBoundsGEP1_64(AllocatedObjectPtr,
659 CookieOffset.getQuantity());
661 CGF.Builder.CreateBitCast(NumElementsPtr, SizeLTy->getPointerTo());
663 llvm::Value *NumElements = CGF.Builder.CreateLoad(NumElementsPtr);
665 CGF.Builder.CreateIntCast(NumElements, SizeLTy, /*isSigned=*/false);
667 return std::make_pair(AllocatedObjectPtr, NumElements);
670 void CodeGenFunction::EmitDeleteCall(const FunctionDecl *DeleteFD,
673 const FunctionProtoType *DeleteFTy =
674 DeleteFD->getType()->getAs<FunctionProtoType>();
676 CallArgList DeleteArgs;
678 // Check if we need to pass the size to the delete operator.
679 llvm::Value *Size = 0;
681 if (DeleteFTy->getNumArgs() == 2) {
682 SizeTy = DeleteFTy->getArgType(1);
683 CharUnits DeleteTypeSize = getContext().getTypeSizeInChars(DeleteTy);
684 Size = llvm::ConstantInt::get(ConvertType(SizeTy),
685 DeleteTypeSize.getQuantity());
688 if (DeleteFD->getOverloadedOperator() == OO_Array_Delete &&
689 !CalculateCookiePadding(getContext(), DeleteTy).isZero()) {
690 // We need to get the number of elements in the array from the cookie.
691 llvm::Value *AllocatedObjectPtr;
692 llvm::Value *NumElements;
693 llvm::tie(AllocatedObjectPtr, NumElements) =
694 GetAllocatedObjectPtrAndNumElements(*this, Ptr, DeleteTy);
696 // Multiply the size with the number of elements.
698 Size = Builder.CreateMul(NumElements, Size);
700 Ptr = AllocatedObjectPtr;
703 QualType ArgTy = DeleteFTy->getArgType(0);
704 llvm::Value *DeletePtr = Builder.CreateBitCast(Ptr, ConvertType(ArgTy));
705 DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy));
708 DeleteArgs.push_back(std::make_pair(RValue::get(Size), SizeTy));
710 // Emit the call to delete.
711 EmitCall(CGM.getTypes().getFunctionInfo(DeleteArgs, DeleteFTy),
712 CGM.GetAddrOfFunction(DeleteFD), ReturnValueSlot(),
713 DeleteArgs, DeleteFD);
716 void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
718 // Get at the argument before we performed the implicit conversion
720 const Expr *Arg = E->getArgument();
721 while (const ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg)) {
722 if (ICE->getCastKind() != CastExpr::CK_UserDefinedConversion &&
723 ICE->getType()->isVoidPointerType())
724 Arg = ICE->getSubExpr();
729 QualType DeleteTy = Arg->getType()->getAs<PointerType>()->getPointeeType();
731 llvm::Value *Ptr = EmitScalarExpr(Arg);
733 // Null check the pointer.
734 llvm::BasicBlock *DeleteNotNull = createBasicBlock("delete.notnull");
735 llvm::BasicBlock *DeleteEnd = createBasicBlock("delete.end");
737 llvm::Value *IsNull =
738 Builder.CreateICmpEQ(Ptr, llvm::Constant::getNullValue(Ptr->getType()),
741 Builder.CreateCondBr(IsNull, DeleteEnd, DeleteNotNull);
742 EmitBlock(DeleteNotNull);
744 bool ShouldCallDelete = true;
746 // Call the destructor if necessary.
747 if (const RecordType *RT = DeleteTy->getAs<RecordType>()) {
748 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
749 if (!RD->hasTrivialDestructor()) {
750 const CXXDestructorDecl *Dtor = RD->getDestructor(getContext());
751 if (E->isArrayForm()) {
752 llvm::Value *AllocatedObjectPtr;
753 llvm::Value *NumElements;
754 llvm::tie(AllocatedObjectPtr, NumElements) =
755 GetAllocatedObjectPtrAndNumElements(*this, Ptr, DeleteTy);
757 EmitCXXAggrDestructorCall(Dtor, NumElements, Ptr);
758 } else if (Dtor->isVirtual()) {
759 const llvm::Type *Ty =
760 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(Dtor),
761 /*isVariadic=*/false);
763 llvm::Value *Callee = BuildVirtualCall(Dtor, Dtor_Deleting, Ptr, Ty);
764 EmitCXXMemberCall(Dtor, Callee, ReturnValueSlot(), Ptr, /*VTT=*/0,
767 // The dtor took care of deleting the object.
768 ShouldCallDelete = false;
770 EmitCXXDestructorCall(Dtor, Dtor_Complete, /*ForVirtualBase=*/false,
776 if (ShouldCallDelete)
777 EmitDeleteCall(E->getOperatorDelete(), Ptr, DeleteTy);
779 EmitBlock(DeleteEnd);
782 llvm::Value * CodeGenFunction::EmitCXXTypeidExpr(const CXXTypeidExpr *E) {
783 QualType Ty = E->getType();
784 const llvm::Type *LTy = ConvertType(Ty)->getPointerTo();
786 if (E->isTypeOperand()) {
787 llvm::Constant *TypeInfo =
788 CGM.GetAddrOfRTTIDescriptor(E->getTypeOperand());
789 return Builder.CreateBitCast(TypeInfo, LTy);
792 Expr *subE = E->getExprOperand();
793 Ty = subE->getType();
794 CanQualType CanTy = CGM.getContext().getCanonicalType(Ty);
795 Ty = CanTy.getUnqualifiedType().getNonReferenceType();
796 if (const RecordType *RT = Ty->getAs<RecordType>()) {
797 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
798 if (RD->isPolymorphic()) {
799 // FIXME: if subE is an lvalue do
800 LValue Obj = EmitLValue(subE);
801 llvm::Value *This = Obj.getAddress();
802 LTy = LTy->getPointerTo()->getPointerTo();
803 llvm::Value *V = Builder.CreateBitCast(This, LTy);
804 // We need to do a zero check for *p, unless it has NonNullAttr.
805 // FIXME: PointerType->hasAttr<NonNullAttr>()
806 bool CanBeZero = false;
807 if (UnaryOperator *UO = dyn_cast<UnaryOperator>(subE->IgnoreParens()))
808 if (UO->getOpcode() == UnaryOperator::Deref)
811 llvm::BasicBlock *NonZeroBlock = createBasicBlock();
812 llvm::BasicBlock *ZeroBlock = createBasicBlock();
814 llvm::Value *Zero = llvm::Constant::getNullValue(LTy);
815 Builder.CreateCondBr(Builder.CreateICmpNE(V, Zero),
816 NonZeroBlock, ZeroBlock);
817 EmitBlock(ZeroBlock);
818 /// Call __cxa_bad_typeid
819 const llvm::Type *ResultType = llvm::Type::getVoidTy(VMContext);
820 const llvm::FunctionType *FTy;
821 FTy = llvm::FunctionType::get(ResultType, false);
822 llvm::Value *F = CGM.CreateRuntimeFunction(FTy, "__cxa_bad_typeid");
823 Builder.CreateCall(F)->setDoesNotReturn();
824 Builder.CreateUnreachable();
825 EmitBlock(NonZeroBlock);
827 V = Builder.CreateLoad(V, "vtable");
828 V = Builder.CreateConstInBoundsGEP1_64(V, -1ULL);
829 V = Builder.CreateLoad(V);
833 return Builder.CreateBitCast(CGM.GetAddrOfRTTIDescriptor(Ty), LTy);
836 llvm::Value *CodeGenFunction::EmitDynamicCast(llvm::Value *V,
837 const CXXDynamicCastExpr *DCE) {
838 QualType SrcTy = DCE->getSubExpr()->getType();
839 QualType DestTy = DCE->getTypeAsWritten();
840 QualType InnerType = DestTy->getPointeeType();
842 const llvm::Type *LTy = ConvertType(DCE->getType());
844 bool CanBeZero = false;
846 bool ThrowOnBad = false;
847 if (DestTy->isPointerType()) {
848 // FIXME: if PointerType->hasAttr<NonNullAttr>(), we don't set this
850 if (InnerType->isVoidType())
853 LTy = LTy->getPointerTo();
857 if (SrcTy->isPointerType() || SrcTy->isReferenceType())
858 SrcTy = SrcTy->getPointeeType();
859 SrcTy = SrcTy.getUnqualifiedType();
861 if (DestTy->isPointerType() || DestTy->isReferenceType())
862 DestTy = DestTy->getPointeeType();
863 DestTy = DestTy.getUnqualifiedType();
865 llvm::BasicBlock *ContBlock = createBasicBlock();
866 llvm::BasicBlock *NullBlock = 0;
867 llvm::BasicBlock *NonZeroBlock = 0;
869 NonZeroBlock = createBasicBlock();
870 NullBlock = createBasicBlock();
871 Builder.CreateCondBr(Builder.CreateIsNotNull(V), NonZeroBlock, NullBlock);
872 EmitBlock(NonZeroBlock);
875 llvm::BasicBlock *BadCastBlock = 0;
877 const llvm::Type *PtrDiffTy = ConvertType(getContext().getPointerDiffType());
879 // See if this is a dynamic_cast(void*)
881 llvm::Value *This = V;
882 V = Builder.CreateBitCast(This, PtrDiffTy->getPointerTo()->getPointerTo());
883 V = Builder.CreateLoad(V, "vtable");
884 V = Builder.CreateConstInBoundsGEP1_64(V, -2ULL);
885 V = Builder.CreateLoad(V, "offset to top");
886 This = Builder.CreateBitCast(This, llvm::Type::getInt8PtrTy(VMContext));
887 V = Builder.CreateInBoundsGEP(This, V);
888 V = Builder.CreateBitCast(V, LTy);
890 /// Call __dynamic_cast
891 const llvm::Type *ResultType = llvm::Type::getInt8PtrTy(VMContext);
892 const llvm::FunctionType *FTy;
893 std::vector<const llvm::Type*> ArgTys;
894 const llvm::Type *PtrToInt8Ty
895 = llvm::Type::getInt8Ty(VMContext)->getPointerTo();
896 ArgTys.push_back(PtrToInt8Ty);
897 ArgTys.push_back(PtrToInt8Ty);
898 ArgTys.push_back(PtrToInt8Ty);
899 ArgTys.push_back(PtrDiffTy);
900 FTy = llvm::FunctionType::get(ResultType, ArgTys, false);
902 // FIXME: Calculate better hint.
903 llvm::Value *hint = llvm::ConstantInt::get(PtrDiffTy, -1ULL);
905 assert(SrcTy->isRecordType() && "Src type must be record type!");
906 assert(DestTy->isRecordType() && "Dest type must be record type!");
909 = CGM.GetAddrOfRTTIDescriptor(SrcTy.getUnqualifiedType());
911 = CGM.GetAddrOfRTTIDescriptor(DestTy.getUnqualifiedType());
913 V = Builder.CreateBitCast(V, PtrToInt8Ty);
914 V = Builder.CreateCall4(CGM.CreateRuntimeFunction(FTy, "__dynamic_cast"),
915 V, SrcArg, DestArg, hint);
916 V = Builder.CreateBitCast(V, LTy);
919 BadCastBlock = createBasicBlock();
921 Builder.CreateCondBr(Builder.CreateIsNotNull(V), ContBlock, BadCastBlock);
922 EmitBlock(BadCastBlock);
923 /// Call __cxa_bad_cast
924 ResultType = llvm::Type::getVoidTy(VMContext);
925 const llvm::FunctionType *FBadTy;
926 FBadTy = llvm::FunctionType::get(ResultType, false);
927 llvm::Value *F = CGM.CreateRuntimeFunction(FBadTy, "__cxa_bad_cast");
928 Builder.CreateCall(F)->setDoesNotReturn();
929 Builder.CreateUnreachable();
934 Builder.CreateBr(ContBlock);
935 EmitBlock(NullBlock);
936 Builder.CreateBr(ContBlock);
938 EmitBlock(ContBlock);
940 llvm::PHINode *PHI = Builder.CreatePHI(LTy);
941 PHI->reserveOperandSpace(2);
942 PHI->addIncoming(V, NonZeroBlock);
943 PHI->addIncoming(llvm::Constant::getNullValue(LTy), NullBlock);