clang 23.0.0git
CGExprCXX.cpp
Go to the documentation of this file.
1//===--- CGExprCXX.cpp - Emit LLVM Code for C++ expressions ---------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This contains code dealing with code generation of C++ expressions
10//
11//===----------------------------------------------------------------------===//
12
13#include "CGCUDARuntime.h"
14#include "CGCXXABI.h"
15#include "CGDebugInfo.h"
16#include "CGObjCRuntime.h"
17#include "CodeGenFunction.h"
18#include "ConstantEmitter.h"
19#include "TargetInfo.h"
22#include "llvm/IR/Intrinsics.h"
23
24using namespace clang;
25using namespace CodeGen;
26
27namespace {
28struct MemberCallInfo {
29 RequiredArgs ReqArgs;
30 // Number of prefix arguments for the call. Ignores the `this` pointer.
31 unsigned PrefixSize;
32};
33} // namespace
34
35static MemberCallInfo
37 llvm::Value *This, llvm::Value *ImplicitParam,
38 QualType ImplicitParamTy, const CallExpr *CE,
39 CallArgList &Args, CallArgList *RtlArgs) {
40 auto *MD = cast<CXXMethodDecl>(GD.getDecl());
41
42 assert(CE == nullptr || isa<CXXMemberCallExpr>(CE) ||
44 assert(MD->isImplicitObjectMemberFunction() &&
45 "Trying to emit a member or operator call expr on a static method!");
46
47 // Push the this ptr.
48 const CXXRecordDecl *RD =
50 Args.add(RValue::get(This), CGF.getTypes().DeriveThisType(RD, MD));
51
52 // If there is an implicit parameter (e.g. VTT), emit it.
53 if (ImplicitParam) {
54 Args.add(RValue::get(ImplicitParam), ImplicitParamTy);
55 }
56
57 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
58 RequiredArgs required = RequiredArgs::forPrototypePlus(FPT, Args.size());
59 unsigned PrefixSize = Args.size() - 1;
60
61 // And the rest of the call args.
62 if (RtlArgs) {
63 // Special case: if the caller emitted the arguments right-to-left already
64 // (prior to emitting the *this argument), we're done. This happens for
65 // assignment operators.
66 Args.addFrom(*RtlArgs);
67 } else if (CE) {
68 // Special case: skip first argument of CXXOperatorCall (it is "this").
69 unsigned ArgsToSkip = 0;
70 if (const auto *Op = dyn_cast<CXXOperatorCallExpr>(CE)) {
71 if (const auto *M = dyn_cast<CXXMethodDecl>(Op->getCalleeDecl()))
72 ArgsToSkip =
73 static_cast<unsigned>(!M->isExplicitObjectMemberFunction());
74 }
75 CGF.EmitCallArgs(Args, FPT, drop_begin(CE->arguments(), ArgsToSkip),
76 CE->getDirectCallee());
77 } else {
78 assert(
79 FPT->getNumParams() == 0 &&
80 "No CallExpr specified for function with non-zero number of arguments");
81 }
82 return {required, PrefixSize};
83}
84
86 const CXXMethodDecl *MD, const CGCallee &Callee,
87 ReturnValueSlot ReturnValue, llvm::Value *This, llvm::Value *ImplicitParam,
88 QualType ImplicitParamTy, const CallExpr *CE, CallArgList *RtlArgs,
89 llvm::CallBase **CallOrInvoke) {
91 CallArgList Args;
92 MemberCallInfo CallInfo = commonEmitCXXMemberOrOperatorCall(
93 *this, MD, This, ImplicitParam, ImplicitParamTy, CE, Args, RtlArgs);
94 auto &FnInfo = CGM.getTypes().arrangeCXXMethodCall(
95 Args, FPT, CallInfo.ReqArgs, CallInfo.PrefixSize);
96 return EmitCall(FnInfo, Callee, ReturnValue, Args, CallOrInvoke,
97 CE && CE == MustTailCall,
98 CE ? CE->getExprLoc() : SourceLocation());
99}
100
102 GlobalDecl Dtor, const CGCallee &Callee, llvm::Value *This, QualType ThisTy,
103 llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *CE,
104 llvm::CallBase **CallOrInvoke) {
105 const CXXMethodDecl *DtorDecl = cast<CXXMethodDecl>(Dtor.getDecl());
106
107 assert(!ThisTy.isNull());
108 assert(ThisTy->getAsCXXRecordDecl() == DtorDecl->getParent() &&
109 "Pointer/Object mixup");
110
111 LangAS SrcAS = ThisTy.getAddressSpace();
112 LangAS DstAS = DtorDecl->getMethodQualifiers().getAddressSpace();
113 if (SrcAS != DstAS) {
114 QualType DstTy = DtorDecl->getThisType();
115 llvm::Type *NewType = CGM.getTypes().ConvertType(DstTy);
116 This = performAddrSpaceCast(This, NewType);
117 }
118
119 CallArgList Args;
120 commonEmitCXXMemberOrOperatorCall(*this, Dtor, This, ImplicitParam,
121 ImplicitParamTy, CE, Args, nullptr);
122 return EmitCall(CGM.getTypes().arrangeCXXStructorDeclaration(Dtor), Callee,
123 ReturnValueSlot(), Args, CallOrInvoke,
124 CE && CE == MustTailCall,
125 CE ? CE->getExprLoc() : SourceLocation{});
126}
127
128RValue
130 QualType DestroyedType = E->getDestroyedType();
131 if (DestroyedType.hasStrongOrWeakObjCLifetime()) {
132 // Automatic Reference Counting:
133 // If the pseudo-expression names a retainable object with weak or
134 // strong lifetime, the object shall be released.
135 Expr *BaseExpr = E->getBase();
136 Address BaseValue = Address::invalid();
137 Qualifiers BaseQuals;
138
139 // If this is s.x, emit s as an lvalue. If it is s->x, emit s as a scalar.
140 if (E->isArrow()) {
141 BaseValue = EmitPointerWithAlignment(BaseExpr);
142 const auto *PTy = BaseExpr->getType()->castAs<PointerType>();
143 BaseQuals = PTy->getPointeeType().getQualifiers();
144 } else {
145 LValue BaseLV = EmitLValue(BaseExpr);
146 BaseValue = BaseLV.getAddress();
147 QualType BaseTy = BaseExpr->getType();
148 BaseQuals = BaseTy.getQualifiers();
149 }
150
151 switch (DestroyedType.getObjCLifetime()) {
155 break;
156
159 Builder.CreateLoad(BaseValue, DestroyedType.isVolatileQualified()),
161 break;
162
164 EmitARCDestroyWeak(BaseValue);
165 break;
166 }
167 } else {
168 // C++ [expr.pseudo]p1:
169 // The result shall only be used as the operand for the function call
170 // operator (), and the result of such a call has type void. The only
171 // effect is the evaluation of the postfix-expression before the dot or
172 // arrow.
174 }
175
176 return RValue::get(nullptr);
177}
178
179static CXXRecordDecl *getCXXRecord(const Expr *E) {
180 QualType T = E->getType();
181 if (const PointerType *PTy = T->getAs<PointerType>())
182 T = PTy->getPointeeType();
183 return T->castAsCXXRecordDecl();
184}
185
186// Note: This function also emit constructor calls to support a MSVC
187// extensions allowing explicit constructor function call.
190 llvm::CallBase **CallOrInvoke) {
191 const Expr *callee = CE->getCallee()->IgnoreParens();
192
193 if (isa<BinaryOperator>(callee))
194 return EmitCXXMemberPointerCallExpr(CE, ReturnValue, CallOrInvoke);
195
196 const MemberExpr *ME = cast<MemberExpr>(callee);
198
199 if (MD->isStatic()) {
200 // The method is static, emit it as we would a regular call.
201 CGCallee callee =
202 CGCallee::forDirect(CGM.GetAddrOfFunction(MD), GlobalDecl(MD));
203 return EmitCall(getContext().getPointerType(MD->getType()), callee, CE,
204 ReturnValue, /*Chain=*/nullptr, CallOrInvoke);
205 }
206
207 bool HasQualifier = ME->hasQualifier();
208 NestedNameSpecifier Qualifier = ME->getQualifier();
209 bool IsArrow = ME->isArrow();
210 const Expr *Base = ME->getBase();
211
213 HasQualifier, Qualifier, IsArrow,
214 Base, CallOrInvoke);
215}
216
219 bool HasQualifier, NestedNameSpecifier Qualifier, bool IsArrow,
220 const Expr *Base, llvm::CallBase **CallOrInvoke) {
222
223 // Compute the object pointer.
224 bool CanUseVirtualCall = MD->isVirtual() && !HasQualifier;
225
226 const CXXMethodDecl *DevirtualizedMethod = nullptr;
227 if (CanUseVirtualCall &&
228 MD->getDevirtualizedMethod(Base, getLangOpts().AppleKext)) {
229 const CXXRecordDecl *BestDynamicDecl = Base->getBestDynamicClassType();
230 DevirtualizedMethod = MD->getCorrespondingMethodInClass(BestDynamicDecl);
231 assert(DevirtualizedMethod);
232 const CXXRecordDecl *DevirtualizedClass = DevirtualizedMethod->getParent();
233 const Expr *Inner = Base->IgnoreParenBaseCasts();
234 if (DevirtualizedMethod->getReturnType().getCanonicalType() !=
236 // If the return types are not the same, this might be a case where more
237 // code needs to run to compensate for it. For example, the derived
238 // method might return a type that inherits form from the return
239 // type of MD and has a prefix.
240 // For now we just avoid devirtualizing these covariant cases.
241 DevirtualizedMethod = nullptr;
242 else if (getCXXRecord(Inner) == DevirtualizedClass)
243 // If the class of the Inner expression is where the dynamic method
244 // is defined, build the this pointer from it.
245 Base = Inner;
246 else if (getCXXRecord(Base) != DevirtualizedClass) {
247 // If the method is defined in a class that is not the best dynamic
248 // one or the one of the full expression, we would have to build
249 // a derived-to-base cast to compute the correct this pointer, but
250 // we don't have support for that yet, so do a virtual call.
251 DevirtualizedMethod = nullptr;
252 }
253 }
254
255 bool TrivialForCodegen =
256 MD->isTrivial() || (MD->isDefaulted() && MD->getParent()->isUnion());
257 bool TrivialAssignment =
258 TrivialForCodegen &&
261
262 // C++17 demands that we evaluate the RHS of a (possibly-compound) assignment
263 // operator before the LHS.
264 CallArgList RtlArgStorage;
265 CallArgList *RtlArgs = nullptr;
266 LValue TrivialAssignmentRHS;
267 if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
268 if (OCE->isAssignmentOp()) {
269 if (TrivialAssignment) {
270 TrivialAssignmentRHS = EmitLValue(CE->getArg(1));
271 } else {
272 RtlArgs = &RtlArgStorage;
273 EmitCallArgs(*RtlArgs, MD->getType()->castAs<FunctionProtoType>(),
274 drop_begin(CE->arguments(), 1), CE->getDirectCallee(),
275 /*ParamsToSkip*/ 0, EvaluationOrder::ForceRightToLeft);
276 }
277 }
278 }
279
280 LValue This;
281 if (IsArrow) {
282 LValueBaseInfo BaseInfo;
283 TBAAAccessInfo TBAAInfo;
284 Address ThisValue = EmitPointerWithAlignment(Base, &BaseInfo, &TBAAInfo);
285 This = MakeAddrLValue(ThisValue, Base->getType()->getPointeeType(),
286 BaseInfo, TBAAInfo);
287 } else {
289 }
290
291 if (const CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(MD)) {
292 // This is the MSVC p->Ctor::Ctor(...) extension. We assume that's
293 // constructing a new complete object of type Ctor.
294 assert(!RtlArgs);
295 assert(ReturnValue.isNull() && "Constructor shouldn't have return value");
296 CallArgList Args;
298 *this, {Ctor, Ctor_Complete}, This.getPointer(*this),
299 /*ImplicitParam=*/nullptr,
300 /*ImplicitParamTy=*/QualType(), CE, Args, nullptr);
301
302 EmitCXXConstructorCall(Ctor, Ctor_Complete, /*ForVirtualBase=*/false,
303 /*Delegating=*/false, This.getAddress(), Args,
305 /*NewPointerIsChecked=*/false, CallOrInvoke);
306 return RValue::get(nullptr);
307 }
308
309 if (TrivialForCodegen) {
311 return RValue::get(nullptr);
312
313 if (TrivialAssignment) {
314 // We don't like to generate the trivial copy/move assignment operator
315 // when it isn't necessary; just produce the proper effect here.
316 // It's important that we use the result of EmitLValue here rather than
317 // emitting call arguments, in order to preserve TBAA information from
318 // the RHS.
319 LValue RHS = isa<CXXOperatorCallExpr>(CE) ? TrivialAssignmentRHS
320 : EmitLValue(*CE->arg_begin());
321 EmitAggregateAssign(This, RHS, CE->getType());
322 return RValue::get(This.getPointer(*this));
323 }
324
325 assert(MD->getParent()->mayInsertExtraPadding() &&
326 "unknown trivial member function");
327 }
328
329 // Compute the function type we're calling.
330 const CXXMethodDecl *CalleeDecl =
331 DevirtualizedMethod ? DevirtualizedMethod : MD;
332 const CGFunctionInfo *FInfo = nullptr;
333 if (const auto *Dtor = dyn_cast<CXXDestructorDecl>(CalleeDecl))
334 FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
336 else
337 FInfo = &CGM.getTypes().arrangeCXXMethodDeclaration(CalleeDecl);
338
339 llvm::FunctionType *Ty = CGM.getTypes().GetFunctionType(*FInfo);
340
341 // C++11 [class.mfct.non-static]p2:
342 // If a non-static member function of a class X is called for an object that
343 // is not of type X, or of a type derived from X, the behavior is undefined.
344 SourceLocation CallLoc;
346 if (CE)
347 CallLoc = CE->getExprLoc();
348
349 SanitizerSet SkippedChecks;
350 if (const auto *CMCE = dyn_cast<CXXMemberCallExpr>(CE)) {
351 auto *IOA = CMCE->getImplicitObjectArgument();
352 bool IsImplicitObjectCXXThis = IsWrappedCXXThis(IOA);
353 if (IsImplicitObjectCXXThis)
354 SkippedChecks.set(SanitizerKind::Alignment, true);
355 if (IsImplicitObjectCXXThis || isa<DeclRefExpr>(IOA))
356 SkippedChecks.set(SanitizerKind::Null, true);
357 }
358
361 This.emitRawPointer(*this),
362 C.getCanonicalTagType(CalleeDecl->getParent()),
363 /*Alignment=*/CharUnits::Zero(), SkippedChecks);
364
365 // C++ [class.virtual]p12:
366 // Explicit qualification with the scope operator (5.1) suppresses the
367 // virtual call mechanism.
368 //
369 // We also don't emit a virtual call if the base expression has a record type
370 // because then we know what the type is.
371 bool UseVirtualCall = CanUseVirtualCall && !DevirtualizedMethod;
372
373 if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(CalleeDecl)) {
374 assert(CE->arguments().empty() &&
375 "Destructor shouldn't have explicit parameters");
376 assert(ReturnValue.isNull() && "Destructor shouldn't have return value");
377 if (UseVirtualCall) {
378 CGM.getCXXABI().EmitVirtualDestructorCall(
379 *this, Dtor, Dtor_Complete, This.getAddress(),
380 cast<CXXMemberCallExpr>(CE), CallOrInvoke);
381 } else {
382 GlobalDecl GD(Dtor, Dtor_Complete);
383 CGCallee Callee;
384 if (getLangOpts().AppleKext && Dtor->isVirtual() && HasQualifier)
385 Callee = BuildAppleKextVirtualCall(Dtor, Qualifier, Ty);
386 else if (!DevirtualizedMethod)
387 Callee =
388 CGCallee::forDirect(CGM.getAddrOfCXXStructor(GD, FInfo, Ty), GD);
389 else {
390 Callee = CGCallee::forDirect(CGM.GetAddrOfFunction(GD, Ty), GD);
391 }
392
393 QualType ThisTy =
394 IsArrow ? Base->getType()->getPointeeType() : Base->getType();
395 EmitCXXDestructorCall(GD, Callee, This.getPointer(*this), ThisTy,
396 /*ImplicitParam=*/nullptr,
397 /*ImplicitParamTy=*/QualType(), CE, CallOrInvoke);
398 }
399 return RValue::get(nullptr);
400 }
401
402 // FIXME: Uses of 'MD' past this point need to be audited. We may need to use
403 // 'CalleeDecl' instead.
404
405 CGCallee Callee;
406 if (UseVirtualCall) {
407 Callee = CGCallee::forVirtual(CE, MD, This.getAddress(), Ty);
408 } else {
409 if (SanOpts.has(SanitizerKind::CFINVCall) &&
410 MD->getParent()->isDynamicClass()) {
411 llvm::Value *VTable;
412 const CXXRecordDecl *RD;
413 std::tie(VTable, RD) = CGM.getCXXABI().LoadVTablePtr(
414 *this, This.getAddress(), CalleeDecl->getParent());
416 }
417
418 if (getLangOpts().AppleKext && MD->isVirtual() && HasQualifier)
419 Callee = BuildAppleKextVirtualCall(MD, Qualifier, Ty);
420 else if (!DevirtualizedMethod)
421 Callee =
422 CGCallee::forDirect(CGM.GetAddrOfFunction(MD, Ty), GlobalDecl(MD));
423 else {
424 Callee =
425 CGCallee::forDirect(CGM.GetAddrOfFunction(DevirtualizedMethod, Ty),
426 GlobalDecl(DevirtualizedMethod));
427 }
428 }
429
430 if (MD->isVirtual()) {
431 Address NewThisAddr =
432 CGM.getCXXABI().adjustThisArgumentForVirtualFunctionCall(
433 *this, CalleeDecl, This.getAddress(), UseVirtualCall);
434 This.setAddress(NewThisAddr);
435 }
436
438 CalleeDecl, Callee, ReturnValue, This.getPointer(*this),
439 /*ImplicitParam=*/nullptr, QualType(), CE, RtlArgs, CallOrInvoke);
440}
441
442RValue
445 llvm::CallBase **CallOrInvoke) {
446 const BinaryOperator *BO =
448 const Expr *BaseExpr = BO->getLHS();
449 const Expr *MemFnExpr = BO->getRHS();
450
451 const auto *MPT = MemFnExpr->getType()->castAs<MemberPointerType>();
452 const auto *FPT = MPT->getPointeeType()->castAs<FunctionProtoType>();
453 const auto *RD = MPT->getMostRecentCXXRecordDecl();
454
455 // Emit the 'this' pointer.
457 if (BO->getOpcode() == BO_PtrMemI)
458 This = EmitPointerWithAlignment(BaseExpr, nullptr, nullptr, KnownNonNull);
459 else
460 This = EmitLValue(BaseExpr, KnownNonNull).getAddress();
461
462 CanQualType ClassType = CGM.getContext().getCanonicalTagType(RD);
463 EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This.emitRawPointer(*this),
464 ClassType);
465
466 // Get the member function pointer.
467 llvm::Value *MemFnPtr = EmitScalarExpr(MemFnExpr);
468
469 // Ask the ABI to load the callee. Note that This is modified.
470 llvm::Value *ThisPtrForCall = nullptr;
471 CGCallee Callee = CGM.getCXXABI().EmitLoadOfMemberFunctionPointer(
472 *this, BO, This, ThisPtrForCall, MemFnPtr, MPT);
473
474 CallArgList Args;
475
476 QualType ThisType = getContext().getPointerType(ClassType);
477
478 // Push the this ptr.
479 Args.add(RValue::get(ThisPtrForCall), ThisType);
480
482
483 // And the rest of the call args
484 EmitCallArgs(Args, FPT, E->arguments());
485 return EmitCall(CGM.getTypes().arrangeCXXMethodCall(Args, FPT, required,
486 /*PrefixSize=*/0),
487 Callee, ReturnValue, Args, CallOrInvoke, E == MustTailCall,
488 E->getExprLoc());
489}
490
492 const CXXOperatorCallExpr *E, const CXXMethodDecl *MD,
493 ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke) {
494 assert(MD->isImplicitObjectMemberFunction() &&
495 "Trying to emit a member call expr on a static method!");
497 E, MD, ReturnValue, /*HasQualifier=*/false, /*Qualifier=*/std::nullopt,
498 /*IsArrow=*/false, E->getArg(0), CallOrInvoke);
499}
500
503 llvm::CallBase **CallOrInvoke) {
504 // Emit as a device kernel call if CUDA device code is to be generated.
505 // TODO: implement for HIP
506 if (!getLangOpts().HIP && getLangOpts().CUDAIsDevice)
507 return CGM.getCUDARuntime().EmitCUDADeviceKernelCallExpr(
508 *this, E, ReturnValue, CallOrInvoke);
509 return CGM.getCUDARuntime().EmitCUDAKernelCallExpr(*this, E, ReturnValue,
510 CallOrInvoke);
511}
512
514 Address DestPtr,
515 const CXXRecordDecl *Base) {
516 if (Base->isEmpty())
517 return;
518
519 DestPtr = DestPtr.withElementType(CGF.Int8Ty);
520
521 const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
522 CharUnits NVSize = Layout.getNonVirtualSize();
523
524 // We cannot simply zero-initialize the entire base sub-object if vbptrs are
525 // present, they are initialized by the most derived class before calling the
526 // constructor.
528 Stores.emplace_back(CharUnits::Zero(), NVSize);
529
530 // Each store is split by the existence of a vbptr.
531 CharUnits VBPtrWidth = CGF.getPointerSize();
532 std::vector<CharUnits> VBPtrOffsets =
534 for (CharUnits VBPtrOffset : VBPtrOffsets) {
535 // Stop before we hit any virtual base pointers located in virtual bases.
536 if (VBPtrOffset >= NVSize)
537 break;
538 std::pair<CharUnits, CharUnits> LastStore = Stores.pop_back_val();
539 CharUnits LastStoreOffset = LastStore.first;
540
541 CharUnits SplitBeforeOffset = LastStoreOffset;
542 CharUnits SplitBeforeSize = VBPtrOffset - SplitBeforeOffset;
543 assert(!SplitBeforeSize.isNegative() && "negative store size!");
544 if (!SplitBeforeSize.isZero())
545 Stores.emplace_back(SplitBeforeOffset, SplitBeforeSize);
546
547 CharUnits SplitAfterOffset = VBPtrOffset + VBPtrWidth;
548 CharUnits SplitAfterSize = NVSize - SplitAfterOffset;
549 assert(!SplitAfterSize.isNegative() && "negative store size!");
550 if (!SplitAfterSize.isZero())
551 Stores.emplace_back(SplitAfterOffset, SplitAfterSize);
552 }
553
554 // If the type contains a pointer to data member we can't memset it to zero.
555 // Instead, create a null constant and copy it to the destination.
556 // TODO: there are other patterns besides zero that we can usefully memset,
557 // like -1, which happens to be the pattern used by member-pointers.
558 // TODO: isZeroInitializable can be over-conservative in the case where a
559 // virtual base contains a member pointer.
560 llvm::Constant *NullConstantForBase = CGF.CGM.EmitNullConstantForBase(Base);
561 if (!NullConstantForBase->isNullValue()) {
562 llvm::GlobalVariable *NullVariable = new llvm::GlobalVariable(
563 CGF.CGM.getModule(), NullConstantForBase->getType(),
564 /*isConstant=*/true, llvm::GlobalVariable::PrivateLinkage,
565 NullConstantForBase, Twine());
566
567 CharUnits Align =
568 std::max(Layout.getNonVirtualAlignment(), DestPtr.getAlignment());
569 NullVariable->setAlignment(Align.getAsAlign());
570
571 Address SrcPtr(NullVariable, CGF.Int8Ty, Align);
572
573 // Get and call the appropriate llvm.memcpy overload.
574 for (std::pair<CharUnits, CharUnits> Store : Stores) {
575 CharUnits StoreOffset = Store.first;
576 CharUnits StoreSize = Store.second;
577 llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
579 CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
580 CGF.Builder.CreateConstInBoundsByteGEP(SrcPtr, StoreOffset),
581 StoreSizeVal);
582 }
583
584 // Otherwise, just memset the whole thing to zero. This is legal
585 // because in LLVM, all default initializers (other than the ones we just
586 // handled above) are guaranteed to have a bit pattern of all zeros.
587 } else {
588 for (std::pair<CharUnits, CharUnits> Store : Stores) {
589 CharUnits StoreOffset = Store.first;
590 CharUnits StoreSize = Store.second;
591 llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
593 CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
594 CGF.Builder.getInt8(0), StoreSizeVal);
595 }
596 }
597}
598
600 AggValueSlot Dest) {
601 assert(!Dest.isIgnored() && "Must have a destination!");
602 const CXXConstructorDecl *CD = E->getConstructor();
603
604 // If we require zero initialization before (or instead of) calling the
605 // constructor, as can be the case with a non-user-provided default
606 // constructor, emit the zero initialization now, unless destination is
607 // already zeroed.
608 if (E->requiresZeroInitialization() && !Dest.isZeroed()) {
609 switch (E->getConstructionKind()) {
613 break;
617 CD->getParent());
618 break;
619 }
620 }
621
622 // If this is a call to a trivial default constructor, do nothing.
623 if (CD->isTrivial() && CD->isDefaultConstructor())
624 return;
625
626 // Elide the constructor if we're constructing from a temporary.
627 if (getLangOpts().ElideConstructors && E->isElidable()) {
628 // FIXME: This only handles the simplest case, where the source object
629 // is passed directly as the first argument to the constructor.
630 // This should also handle stepping though implicit casts and
631 // conversion sequences which involve two steps, with a
632 // conversion operator followed by a converting constructor.
633 const Expr *SrcObj = E->getArg(0);
634 assert(SrcObj->isTemporaryObject(getContext(), CD->getParent()));
635 assert(
636 getContext().hasSameUnqualifiedType(E->getType(), SrcObj->getType()));
637 EmitAggExpr(SrcObj, Dest);
638 return;
639 }
640
641 if (const ArrayType *arrayType = getContext().getAsArrayType(E->getType())) {
643 Dest.isSanitizerChecked());
644 } else {
646 bool ForVirtualBase = false;
647 bool Delegating = false;
648
649 switch (E->getConstructionKind()) {
651 // We should be emitting a constructor; GlobalDecl will assert this
652 Type = CurGD.getCtorType();
653 Delegating = true;
654 break;
655
658 break;
659
661 ForVirtualBase = true;
662 [[fallthrough]];
663
665 Type = Ctor_Base;
666 }
667
668 // Call the constructor.
669 EmitCXXConstructorCall(CD, Type, ForVirtualBase, Delegating, Dest, E);
670 }
671}
672
674 const Expr *Exp) {
675 if (const ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(Exp))
676 Exp = E->getSubExpr();
677 assert(isa<CXXConstructExpr>(Exp) &&
678 "EmitSynthesizedCXXCopyCtor - unknown copy ctor expr");
680 const CXXConstructorDecl *CD = E->getConstructor();
681 RunCleanupsScope Scope(*this);
682
683 // If we require zero initialization before (or instead of) calling the
684 // constructor, as can be the case with a non-user-provided default
685 // constructor, emit the zero initialization now.
686 // FIXME. Do I still need this for a copy ctor synthesis?
689
690 assert(!getContext().getAsConstantArrayType(E->getType()) &&
691 "EmitSynthesizedCXXCopyCtor - Copied-in Array");
692 EmitSynthesizedCXXCopyCtorCall(CD, Dest, Src, E);
693}
694
696 const CXXNewExpr *E) {
697 if (!E->isArray())
698 return CharUnits::Zero();
699
700 // No cookie is required if the operator new[] being used is the
701 // reserved placement operator new[].
703 return CharUnits::Zero();
704
705 return CGF.CGM.getCXXABI().GetArrayCookieSize(E);
706}
707
708static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
709 const CXXNewExpr *e,
710 unsigned minElements,
711 llvm::Value *&numElements,
712 llvm::Value *&sizeWithoutCookie) {
714
715 if (!e->isArray()) {
717 sizeWithoutCookie =
718 llvm::ConstantInt::get(CGF.SizeTy, typeSize.getQuantity());
719 return sizeWithoutCookie;
720 }
721
722 // The width of size_t.
723 unsigned sizeWidth = CGF.SizeTy->getBitWidth();
724
725 // Figure out the cookie size.
726 llvm::APInt cookieSize(sizeWidth,
727 CalculateCookiePadding(CGF, e).getQuantity());
728
729 // Emit the array size expression.
730 // We multiply the size of all dimensions for NumElements.
731 // e.g for 'int[2][3]', ElemType is 'int' and NumElements is 6.
732 numElements = ConstantEmitter(CGF).tryEmitAbstract(
733 *e->getArraySize(), (*e->getArraySize())->getType());
734 if (!numElements)
735 numElements = CGF.EmitScalarExpr(*e->getArraySize());
736 assert(isa<llvm::IntegerType>(numElements->getType()));
737
738 // The number of elements can be have an arbitrary integer type;
739 // essentially, we need to multiply it by a constant factor, add a
740 // cookie size, and verify that the result is representable as a
741 // size_t. That's just a gloss, though, and it's wrong in one
742 // important way: if the count is negative, it's an error even if
743 // the cookie size would bring the total size >= 0.
744 bool isSigned =
745 (*e->getArraySize())->getType()->isSignedIntegerOrEnumerationType();
746 llvm::IntegerType *numElementsType =
747 cast<llvm::IntegerType>(numElements->getType());
748 unsigned numElementsWidth = numElementsType->getBitWidth();
749
750 // Compute the constant factor.
751 llvm::APInt arraySizeMultiplier(sizeWidth, 1);
752 while (const ConstantArrayType *CAT =
754 type = CAT->getElementType();
755 arraySizeMultiplier *= CAT->getSize();
756 }
757
759 llvm::APInt typeSizeMultiplier(sizeWidth, typeSize.getQuantity());
760 typeSizeMultiplier *= arraySizeMultiplier;
761
762 // This will be a size_t.
763 llvm::Value *size;
764
765 // If someone is doing 'new int[42]' there is no need to do a dynamic check.
766 // Don't bloat the -O0 code.
767 if (llvm::ConstantInt *numElementsC =
768 dyn_cast<llvm::ConstantInt>(numElements)) {
769 const llvm::APInt &count = numElementsC->getValue();
770
771 bool hasAnyOverflow = false;
772
773 // If 'count' was a negative number, it's an overflow.
774 if (isSigned && count.isNegative())
775 hasAnyOverflow = true;
776
777 // We want to do all this arithmetic in size_t. If numElements is
778 // wider than that, check whether it's already too big, and if so,
779 // overflow.
780 else if (numElementsWidth > sizeWidth &&
781 numElementsWidth - sizeWidth > count.countl_zero())
782 hasAnyOverflow = true;
783
784 // Okay, compute a count at the right width.
785 llvm::APInt adjustedCount = count.zextOrTrunc(sizeWidth);
786
787 // If there is a brace-initializer, we cannot allocate fewer elements than
788 // there are initializers. If we do, that's treated like an overflow.
789 if (adjustedCount.ult(minElements))
790 hasAnyOverflow = true;
791
792 // Scale numElements by that. This might overflow, but we don't
793 // care because it only overflows if allocationSize does, too, and
794 // if that overflows then we shouldn't use this.
795 numElements =
796 llvm::ConstantInt::get(CGF.SizeTy, adjustedCount * arraySizeMultiplier);
797
798 // Compute the size before cookie, and track whether it overflowed.
799 bool overflow;
800 llvm::APInt allocationSize =
801 adjustedCount.umul_ov(typeSizeMultiplier, overflow);
802 hasAnyOverflow |= overflow;
803
804 // Add in the cookie, and check whether it's overflowed.
805 if (cookieSize != 0) {
806 // Save the current size without a cookie. This shouldn't be
807 // used if there was overflow.
808 sizeWithoutCookie = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
809
810 allocationSize = allocationSize.uadd_ov(cookieSize, overflow);
811 hasAnyOverflow |= overflow;
812 }
813
814 // On overflow, produce a -1 so operator new will fail.
815 if (hasAnyOverflow) {
816 size = llvm::Constant::getAllOnesValue(CGF.SizeTy);
817 } else {
818 size = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
819 }
820
821 // Otherwise, we might need to use the overflow intrinsics.
822 } else {
823 // There are up to five conditions we need to test for:
824 // 1) if isSigned, we need to check whether numElements is negative;
825 // 2) if numElementsWidth > sizeWidth, we need to check whether
826 // numElements is larger than something representable in size_t;
827 // 3) if minElements > 0, we need to check whether numElements is smaller
828 // than that.
829 // 4) we need to compute
830 // sizeWithoutCookie := numElements * typeSizeMultiplier
831 // and check whether it overflows; and
832 // 5) if we need a cookie, we need to compute
833 // size := sizeWithoutCookie + cookieSize
834 // and check whether it overflows.
835
836 llvm::Value *hasOverflow = nullptr;
837
838 // If numElementsWidth > sizeWidth, then one way or another, we're
839 // going to have to do a comparison for (2), and this happens to
840 // take care of (1), too.
841 if (numElementsWidth > sizeWidth) {
842 llvm::APInt threshold =
843 llvm::APInt::getOneBitSet(numElementsWidth, sizeWidth);
844
845 llvm::Value *thresholdV =
846 llvm::ConstantInt::get(numElementsType, threshold);
847
848 hasOverflow = CGF.Builder.CreateICmpUGE(numElements, thresholdV);
849 numElements = CGF.Builder.CreateTrunc(numElements, CGF.SizeTy);
850
851 // Otherwise, if we're signed, we want to sext up to size_t.
852 } else if (isSigned) {
853 if (numElementsWidth < sizeWidth)
854 numElements = CGF.Builder.CreateSExt(numElements, CGF.SizeTy);
855
856 // If there's a non-1 type size multiplier, then we can do the
857 // signedness check at the same time as we do the multiply
858 // because a negative number times anything will cause an
859 // unsigned overflow. Otherwise, we have to do it here. But at least
860 // in this case, we can subsume the >= minElements check.
861 if (typeSizeMultiplier == 1)
862 hasOverflow = CGF.Builder.CreateICmpSLT(
863 numElements, llvm::ConstantInt::get(CGF.SizeTy, minElements));
864
865 // Otherwise, zext up to size_t if necessary.
866 } else if (numElementsWidth < sizeWidth) {
867 numElements = CGF.Builder.CreateZExt(numElements, CGF.SizeTy);
868 }
869
870 assert(numElements->getType() == CGF.SizeTy);
871
872 if (minElements) {
873 // Don't allow allocation of fewer elements than we have initializers.
874 if (!hasOverflow) {
875 hasOverflow = CGF.Builder.CreateICmpULT(
876 numElements, llvm::ConstantInt::get(CGF.SizeTy, minElements));
877 } else if (numElementsWidth > sizeWidth) {
878 // The other existing overflow subsumes this check.
879 // We do an unsigned comparison, since any signed value < -1 is
880 // taken care of either above or below.
881 hasOverflow = CGF.Builder.CreateOr(
882 hasOverflow,
883 CGF.Builder.CreateICmpULT(
884 numElements, llvm::ConstantInt::get(CGF.SizeTy, minElements)));
885 }
886 }
887
888 size = numElements;
889
890 // Multiply by the type size if necessary. This multiplier
891 // includes all the factors for nested arrays.
892 //
893 // This step also causes numElements to be scaled up by the
894 // nested-array factor if necessary. Overflow on this computation
895 // can be ignored because the result shouldn't be used if
896 // allocation fails.
897 if (typeSizeMultiplier != 1) {
898 llvm::Function *umul_with_overflow =
899 CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
900
901 llvm::Value *tsmV =
902 llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
903 llvm::Value *result =
904 CGF.Builder.CreateCall(umul_with_overflow, {size, tsmV});
905
906 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
907 if (hasOverflow)
908 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
909 else
910 hasOverflow = overflowed;
911
912 size = CGF.Builder.CreateExtractValue(result, 0);
913
914 // Also scale up numElements by the array size multiplier.
915 if (arraySizeMultiplier != 1) {
916 // If the base element type size is 1, then we can re-use the
917 // multiply we just did.
918 if (typeSize.isOne()) {
919 assert(arraySizeMultiplier == typeSizeMultiplier);
920 numElements = size;
921
922 // Otherwise we need a separate multiply.
923 } else {
924 llvm::Value *asmV =
925 llvm::ConstantInt::get(CGF.SizeTy, arraySizeMultiplier);
926 numElements = CGF.Builder.CreateMul(numElements, asmV);
927 }
928 }
929 } else {
930 // numElements doesn't need to be scaled.
931 assert(arraySizeMultiplier == 1);
932 }
933
934 // Add in the cookie size if necessary.
935 if (cookieSize != 0) {
936 sizeWithoutCookie = size;
937
938 llvm::Function *uadd_with_overflow =
939 CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
940
941 llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
942 llvm::Value *result =
943 CGF.Builder.CreateCall(uadd_with_overflow, {size, cookieSizeV});
944
945 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
946 if (hasOverflow)
947 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
948 else
949 hasOverflow = overflowed;
950
951 size = CGF.Builder.CreateExtractValue(result, 0);
952 }
953
954 // If we had any possibility of dynamic overflow, make a select to
955 // overwrite 'size' with an all-ones value, which should cause
956 // operator new to throw.
957 if (hasOverflow)
958 size = CGF.Builder.CreateSelect(
959 hasOverflow, llvm::Constant::getAllOnesValue(CGF.SizeTy), size);
960 }
961
962 if (cookieSize == 0)
963 sizeWithoutCookie = size;
964 else
965 assert(sizeWithoutCookie && "didn't set sizeWithoutCookie?");
966
967 return size;
968}
969
971 QualType AllocType, Address NewPtr,
972 AggValueSlot::Overlap_t MayOverlap) {
973 // FIXME: Refactor with EmitExprAsInit.
974 switch (CGF.getEvaluationKind(AllocType)) {
975 case TEK_Scalar:
976 CGF.EmitScalarInit(Init, nullptr, CGF.MakeAddrLValue(NewPtr, AllocType),
977 false);
978 return;
979 case TEK_Complex:
980 CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType),
981 /*isInit*/ true);
982 return;
983 case TEK_Aggregate: {
985 NewPtr, AllocType.getQualifiers(), AggValueSlot::IsDestructed,
987 MayOverlap, AggValueSlot::IsNotZeroed,
989 CGF.EmitAggExpr(Init, Slot);
990 return;
991 }
992 }
993 llvm_unreachable("bad evaluation kind");
994}
995
997 const CXXNewExpr *E, QualType ElementType, llvm::Type *ElementTy,
998 Address BeginPtr, llvm::Value *NumElements,
999 llvm::Value *AllocSizeWithoutCookie) {
1000 // If we have a type with trivial initialization and no initializer,
1001 // there's nothing to do.
1002 if (!E->hasInitializer())
1003 return;
1004
1005 Address CurPtr = BeginPtr;
1006
1007 unsigned InitListElements = 0;
1008
1009 const Expr *Init = E->getInitializer();
1010 Address EndOfInit = Address::invalid();
1011 QualType::DestructionKind DtorKind = ElementType.isDestructedType();
1012 CleanupDeactivationScope deactivation(*this);
1013 bool pushedCleanup = false;
1014
1015 CharUnits ElementSize = getContext().getTypeSizeInChars(ElementType);
1016 CharUnits ElementAlign =
1017 BeginPtr.getAlignment().alignmentOfArrayElement(ElementSize);
1018
1019 // Attempt to perform zero-initialization using memset.
1020 auto TryMemsetInitialization = [&]() -> bool {
1021 // FIXME: If the type is a pointer-to-data-member under the Itanium ABI,
1022 // we can initialize with a memset to -1.
1023 if (!CGM.getTypes().isZeroInitializable(ElementType))
1024 return false;
1025
1026 // Optimization: since zero initialization will just set the memory
1027 // to all zeroes, generate a single memset to do it in one shot.
1028
1029 // Subtract out the size of any elements we've already initialized.
1030 auto *RemainingSize = AllocSizeWithoutCookie;
1031 if (InitListElements) {
1032 // We know this can't overflow; we check this when doing the allocation.
1033 auto *InitializedSize = llvm::ConstantInt::get(
1034 RemainingSize->getType(),
1035 getContext().getTypeSizeInChars(ElementType).getQuantity() *
1036 InitListElements);
1037 RemainingSize = Builder.CreateSub(RemainingSize, InitializedSize);
1038 }
1039
1040 // Create the memset.
1041 Builder.CreateMemSet(CurPtr, Builder.getInt8(0), RemainingSize, false);
1042 return true;
1043 };
1044
1045 const InitListExpr *ILE = dyn_cast<InitListExpr>(Init);
1046 const CXXParenListInitExpr *CPLIE = nullptr;
1047 const StringLiteral *SL = nullptr;
1048 const ObjCEncodeExpr *OCEE = nullptr;
1049 const Expr *IgnoreParen = nullptr;
1050 if (!ILE) {
1051 IgnoreParen = Init->IgnoreParenImpCasts();
1052 CPLIE = dyn_cast<CXXParenListInitExpr>(IgnoreParen);
1053 SL = dyn_cast<StringLiteral>(IgnoreParen);
1054 OCEE = dyn_cast<ObjCEncodeExpr>(IgnoreParen);
1055 }
1056
1057 // If the initializer is an initializer list, first do the explicit elements.
1058 if (ILE || CPLIE || SL || OCEE) {
1059 // Initializing from a (braced) string literal is a special case; the init
1060 // list element does not initialize a (single) array element.
1061 if ((ILE && ILE->isStringLiteralInit()) || SL || OCEE) {
1062 if (!ILE)
1063 Init = IgnoreParen;
1064 // Initialize the initial portion of length equal to that of the string
1065 // literal. The allocation must be for at least this much; we emitted a
1066 // check for that earlier.
1068 CurPtr, ElementType.getQualifiers(), AggValueSlot::IsDestructed,
1072 EmitAggExpr(ILE ? ILE->getInit(0) : Init, Slot);
1073
1074 // Move past these elements.
1075 InitListElements =
1076 cast<ConstantArrayType>(Init->getType()->getAsArrayTypeUnsafe())
1077 ->getZExtSize();
1078 CurPtr = Builder.CreateConstInBoundsGEP(CurPtr, InitListElements,
1079 "string.init.end");
1080
1081 // Zero out the rest, if any remain.
1082 llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);
1083 if (!ConstNum || !ConstNum->equalsInt(InitListElements)) {
1084 bool OK = TryMemsetInitialization();
1085 (void)OK;
1086 assert(OK && "couldn't memset character type?");
1087 }
1088 return;
1089 }
1090
1091 ArrayRef<const Expr *> InitExprs =
1092 ILE ? ILE->inits() : CPLIE->getInitExprs();
1093 InitListElements = InitExprs.size();
1094
1095 // If this is a multi-dimensional array new, we will initialize multiple
1096 // elements with each init list element.
1097 QualType AllocType = E->getAllocatedType();
1098 if (const ConstantArrayType *CAT = dyn_cast_or_null<ConstantArrayType>(
1099 AllocType->getAsArrayTypeUnsafe())) {
1100 ElementTy = ConvertTypeForMem(AllocType);
1101 CurPtr = CurPtr.withElementType(ElementTy);
1102 InitListElements *= getContext().getConstantArrayElementCount(CAT);
1103 }
1104
1105 // Enter a partial-destruction Cleanup if necessary.
1106 if (DtorKind) {
1107 AllocaTrackerRAII AllocaTracker(*this);
1108 // In principle we could tell the Cleanup where we are more
1109 // directly, but the control flow can get so varied here that it
1110 // would actually be quite complex. Therefore we go through an
1111 // alloca.
1112 llvm::Instruction *DominatingIP =
1113 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(Int8PtrTy));
1114 EndOfInit = CreateTempAlloca(BeginPtr.getType(), getPointerAlign(),
1115 "array.init.end");
1117 EndOfInit, ElementType, ElementAlign,
1118 getDestroyer(DtorKind));
1119 cast<EHCleanupScope>(*EHStack.find(EHStack.stable_begin()))
1120 .AddAuxAllocas(AllocaTracker.Take());
1122 {EHStack.stable_begin(), DominatingIP});
1123 pushedCleanup = true;
1124 }
1125
1126 CharUnits StartAlign = CurPtr.getAlignment();
1127 unsigned i = 0;
1128 for (const Expr *IE : InitExprs) {
1129 // Tell the cleanup that it needs to destroy up to this
1130 // element. TODO: some of these stores can be trivially
1131 // observed to be unnecessary.
1132 if (EndOfInit.isValid()) {
1133 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1134 }
1135 // FIXME: If the last initializer is an incomplete initializer list for
1136 // an array, and we have an array filler, we can fold together the two
1137 // initialization loops.
1138 StoreAnyExprIntoOneUnit(*this, IE, IE->getType(), CurPtr,
1140 CurPtr = Address(Builder.CreateInBoundsGEP(CurPtr.getElementType(),
1141 CurPtr.emitRawPointer(*this),
1142 Builder.getSize(1),
1143 "array.exp.next"),
1144 CurPtr.getElementType(),
1145 StartAlign.alignmentAtOffset((++i) * ElementSize));
1146 }
1147
1148 // The remaining elements are filled with the array filler expression.
1149 Init = ILE ? ILE->getArrayFiller() : CPLIE->getArrayFiller();
1150
1151 // Extract the initializer for the individual array elements by pulling
1152 // out the array filler from all the nested initializer lists. This avoids
1153 // generating a nested loop for the initialization.
1154 while (Init && Init->getType()->isConstantArrayType()) {
1155 auto *SubILE = dyn_cast<InitListExpr>(Init);
1156 if (!SubILE)
1157 break;
1158 assert(SubILE->getNumInits() == 0 && "explicit inits in array filler?");
1159 Init = SubILE->getArrayFiller();
1160 }
1161
1162 // Switch back to initializing one base element at a time.
1163 CurPtr = CurPtr.withElementType(BeginPtr.getElementType());
1164 }
1165
1166 // If all elements have already been initialized, skip any further
1167 // initialization.
1168 llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);
1169 if (ConstNum && ConstNum->getZExtValue() <= InitListElements) {
1170 return;
1171 }
1172
1173 assert(Init && "have trailing elements to initialize but no initializer");
1174
1175 // If this is a constructor call, try to optimize it out, and failing that
1176 // emit a single loop to initialize all remaining elements.
1177 if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) {
1178 CXXConstructorDecl *Ctor = CCE->getConstructor();
1179 if (Ctor->isTrivial()) {
1180 // If new expression did not specify value-initialization, then there
1181 // is no initialization.
1182 if (!CCE->requiresZeroInitialization() || Ctor->getParent()->isEmpty())
1183 return;
1184
1185 if (TryMemsetInitialization())
1186 return;
1187 }
1188
1189 // Store the new Cleanup position for irregular Cleanups.
1190 //
1191 // FIXME: Share this cleanup with the constructor call emission rather than
1192 // having it create a cleanup of its own.
1193 if (EndOfInit.isValid())
1194 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1195
1196 // Emit a constructor call loop to initialize the remaining elements.
1197 if (InitListElements)
1198 NumElements = Builder.CreateSub(
1199 NumElements,
1200 llvm::ConstantInt::get(NumElements->getType(), InitListElements));
1201 EmitCXXAggrConstructorCall(Ctor, NumElements, CurPtr, CCE,
1202 /*NewPointerIsChecked*/ true,
1203 CCE->requiresZeroInitialization());
1204 if (getContext().getTargetInfo().emitVectorDeletingDtors(
1205 getContext().getLangOpts())) {
1206 CXXDestructorDecl *Dtor = Ctor->getParent()->getDestructor();
1207 if (Dtor && Dtor->isVirtual())
1208 CGM.requireVectorDestructorDefinition(Ctor->getParent());
1209 }
1210 return;
1211 }
1212
1213 // If this is value-initialization, we can usually use memset.
1214 ImplicitValueInitExpr IVIE(ElementType);
1216 if (TryMemsetInitialization())
1217 return;
1218
1219 // Switch to an ImplicitValueInitExpr for the element type. This handles
1220 // only one case: multidimensional array new of pointers to members. In
1221 // all other cases, we already have an initializer for the array element.
1222 Init = &IVIE;
1223 }
1224
1225 // At this point we should have found an initializer for the individual
1226 // elements of the array.
1227 assert(getContext().hasSameUnqualifiedType(ElementType, Init->getType()) &&
1228 "got wrong type of element to initialize");
1229
1230 // If we have an empty initializer list, we can usually use memset.
1231 if (auto *ILE = dyn_cast<InitListExpr>(Init))
1232 if (ILE->getNumInits() == 0 && TryMemsetInitialization())
1233 return;
1234
1235 // If we have a struct whose every field is value-initialized, we can
1236 // usually use memset.
1237 if (auto *ILE = dyn_cast<InitListExpr>(Init)) {
1238 if (const RecordType *RType =
1239 ILE->getType()->getAsCanonical<RecordType>()) {
1240 if (RType->getDecl()->isStruct()) {
1241 const RecordDecl *RD = RType->getDecl()->getDefinitionOrSelf();
1242 unsigned NumElements = 0;
1243 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1244 NumElements = CXXRD->getNumBases();
1245 for (auto *Field : RD->fields())
1246 if (!Field->isUnnamedBitField())
1247 ++NumElements;
1248 // FIXME: Recurse into nested InitListExprs.
1249 if (ILE->getNumInits() == NumElements)
1250 for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i)
1251 if (!isa<ImplicitValueInitExpr>(ILE->getInit(i)))
1252 --NumElements;
1253 if (ILE->getNumInits() == NumElements && TryMemsetInitialization())
1254 return;
1255 }
1256 }
1257 }
1258
1259 // Create the loop blocks.
1260 llvm::BasicBlock *EntryBB = Builder.GetInsertBlock();
1261 llvm::BasicBlock *LoopBB = createBasicBlock("new.loop");
1262 llvm::BasicBlock *ContBB = createBasicBlock("new.loop.end");
1263
1264 // Find the end of the array, hoisted out of the loop.
1265 llvm::Value *EndPtr = Builder.CreateInBoundsGEP(
1266 BeginPtr.getElementType(), BeginPtr.emitRawPointer(*this), NumElements,
1267 "array.end");
1268
1269 // If the number of elements isn't constant, we have to now check if there is
1270 // anything left to initialize.
1271 if (!ConstNum) {
1272 llvm::Value *IsEmpty = Builder.CreateICmpEQ(CurPtr.emitRawPointer(*this),
1273 EndPtr, "array.isempty");
1274 Builder.CreateCondBr(IsEmpty, ContBB, LoopBB);
1275 }
1276
1277 // Enter the loop.
1278 EmitBlock(LoopBB);
1279
1280 // Set up the current-element phi.
1281 llvm::PHINode *CurPtrPhi =
1282 Builder.CreatePHI(CurPtr.getType(), 2, "array.cur");
1283 CurPtrPhi->addIncoming(CurPtr.emitRawPointer(*this), EntryBB);
1284
1285 CurPtr = Address(CurPtrPhi, CurPtr.getElementType(), ElementAlign);
1286
1287 // Store the new Cleanup position for irregular Cleanups.
1288 if (EndOfInit.isValid())
1289 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1290
1291 // Enter a partial-destruction Cleanup if necessary.
1292 if (!pushedCleanup && needsEHCleanup(DtorKind)) {
1293 llvm::Instruction *DominatingIP =
1294 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(Int8PtrTy));
1296 CurPtr.emitRawPointer(*this), ElementType,
1297 ElementAlign, getDestroyer(DtorKind));
1299 {EHStack.stable_begin(), DominatingIP});
1300 }
1301
1302 // Emit the initializer into this element.
1303 StoreAnyExprIntoOneUnit(*this, Init, Init->getType(), CurPtr,
1305
1306 // Leave the Cleanup if we entered one.
1307 deactivation.ForceDeactivate();
1308
1309 // Advance to the next element by adjusting the pointer type as necessary.
1310 llvm::Value *NextPtr = Builder.CreateConstInBoundsGEP1_32(
1311 ElementTy, CurPtr.emitRawPointer(*this), 1, "array.next");
1312
1313 // Check whether we've gotten to the end of the array and, if so,
1314 // exit the loop.
1315 llvm::Value *IsEnd = Builder.CreateICmpEQ(NextPtr, EndPtr, "array.atend");
1316 Builder.CreateCondBr(IsEnd, ContBB, LoopBB);
1317 CurPtrPhi->addIncoming(NextPtr, Builder.GetInsertBlock());
1318
1319 EmitBlock(ContBB);
1320}
1321
1323 QualType ElementType, llvm::Type *ElementTy,
1324 Address NewPtr, llvm::Value *NumElements,
1325 llvm::Value *AllocSizeWithoutCookie) {
1326 ApplyDebugLocation DL(CGF, E);
1327 if (E->isArray())
1328 CGF.EmitNewArrayInitializer(E, ElementType, ElementTy, NewPtr, NumElements,
1329 AllocSizeWithoutCookie);
1330 else if (const Expr *Init = E->getInitializer())
1333}
1334
1335/// Emit a call to an operator new or operator delete function, as implicitly
1336/// created by new-expressions and delete-expressions.
1338 const FunctionDecl *CalleeDecl,
1339 const FunctionProtoType *CalleeType,
1340 const CallArgList &Args) {
1341 llvm::CallBase *CallOrInvoke;
1342 llvm::Constant *CalleePtr = CGF.CGM.GetAddrOfFunction(CalleeDecl);
1343 CGCallee Callee = CGCallee::forDirect(CalleePtr, GlobalDecl(CalleeDecl));
1345 Args, CalleeType, /*ChainCall=*/false),
1346 Callee, ReturnValueSlot(), Args, &CallOrInvoke);
1347
1348 /// C++1y [expr.new]p10:
1349 /// [In a new-expression,] an implementation is allowed to omit a call
1350 /// to a replaceable global allocation function.
1351 ///
1352 /// We model such elidable calls with the 'builtin' attribute.
1353 llvm::Function *Fn = dyn_cast<llvm::Function>(CalleePtr);
1354 if (CalleeDecl->isReplaceableGlobalAllocationFunction() && Fn &&
1355 Fn->hasFnAttribute(llvm::Attribute::NoBuiltin)) {
1356 CallOrInvoke->addFnAttr(llvm::Attribute::Builtin);
1357 }
1358
1359 return RV;
1360}
1361
1363 const CallExpr *TheCall,
1364 bool IsDelete) {
1365 CallArgList Args;
1366 EmitCallArgs(Args, Type, TheCall->arguments());
1367 // Find the allocation or deallocation function that we're calling.
1368 ASTContext &Ctx = getContext();
1369 DeclarationName Name =
1370 Ctx.DeclarationNames.getCXXOperatorName(IsDelete ? OO_Delete : OO_New);
1371
1372 for (auto *Decl : Ctx.getTranslationUnitDecl()->lookup(Name))
1373 if (auto *FD = dyn_cast<FunctionDecl>(Decl))
1374 if (Ctx.hasSameType(FD->getType(), QualType(Type, 0))) {
1375 RValue RV = EmitNewDeleteCall(*this, FD, Type, Args);
1376 if (auto *CB = dyn_cast_if_present<llvm::CallBase>(RV.getScalarVal())) {
1377 if (SanOpts.has(SanitizerKind::AllocToken)) {
1378 // Set !alloc_token metadata.
1379 EmitAllocToken(CB, TheCall);
1380 }
1381 }
1382 return RV;
1383 }
1384 llvm_unreachable("predeclared global operator new/delete is missing");
1385}
1386
1387namespace {
1388/// A cleanup to call the given 'operator delete' function upon abnormal
1389/// exit from a new expression. Templated on a traits type that deals with
1390/// ensuring that the arguments dominate the cleanup if necessary.
1391template <typename Traits>
1392class CallDeleteDuringNew final : public EHScopeStack::Cleanup {
1393 /// Type used to hold llvm::Value*s.
1394 typedef typename Traits::ValueTy ValueTy;
1395 /// Type used to hold RValues.
1396 typedef typename Traits::RValueTy RValueTy;
1397 struct PlacementArg {
1398 RValueTy ArgValue;
1400 };
1401
1402 unsigned NumPlacementArgs : 30;
1403 LLVM_PREFERRED_TYPE(AlignedAllocationMode)
1404 unsigned PassAlignmentToPlacementDelete : 1;
1405 const FunctionDecl *OperatorDelete;
1406 RValueTy TypeIdentity;
1407 ValueTy Ptr;
1408 ValueTy AllocSize;
1409 CharUnits AllocAlign;
1410
1411 PlacementArg *getPlacementArgs() {
1412 return reinterpret_cast<PlacementArg *>(this + 1);
1413 }
1414
1415public:
1416 static size_t getExtraSize(size_t NumPlacementArgs) {
1417 return NumPlacementArgs * sizeof(PlacementArg);
1418 }
1419
1420 CallDeleteDuringNew(size_t NumPlacementArgs,
1421 const FunctionDecl *OperatorDelete, RValueTy TypeIdentity,
1422 ValueTy Ptr, ValueTy AllocSize,
1423 const ImplicitAllocationParameters &IAP,
1424 CharUnits AllocAlign)
1425 : NumPlacementArgs(NumPlacementArgs),
1426 PassAlignmentToPlacementDelete(isAlignedAllocation(IAP.PassAlignment)),
1427 OperatorDelete(OperatorDelete), TypeIdentity(TypeIdentity), Ptr(Ptr),
1428 AllocSize(AllocSize), AllocAlign(AllocAlign) {}
1429
1430 void setPlacementArg(unsigned I, RValueTy Arg, QualType Type) {
1431 assert(I < NumPlacementArgs && "index out of range");
1432 getPlacementArgs()[I] = {Arg, Type};
1433 }
1434
1435 void Emit(CodeGenFunction &CGF, Flags flags) override {
1436 const auto *FPT = OperatorDelete->getType()->castAs<FunctionProtoType>();
1437 CallArgList DeleteArgs;
1438 unsigned FirstNonTypeArg = 0;
1439 TypeAwareAllocationMode TypeAwareDeallocation = TypeAwareAllocationMode::No;
1440 if (OperatorDelete->isTypeAwareOperatorNewOrDelete()) {
1441 TypeAwareDeallocation = TypeAwareAllocationMode::Yes;
1442 QualType SpecializedTypeIdentity = FPT->getParamType(0);
1443 ++FirstNonTypeArg;
1444 DeleteArgs.add(Traits::get(CGF, TypeIdentity), SpecializedTypeIdentity);
1445 }
1446 // The first argument after type-identity parameter (if any) is always
1447 // a void* (or C* for a destroying operator delete for class type C).
1448 DeleteArgs.add(Traits::get(CGF, Ptr), FPT->getParamType(FirstNonTypeArg));
1449
1450 // Figure out what other parameters we should be implicitly passing.
1451 UsualDeleteParams Params;
1452 if (NumPlacementArgs) {
1453 // A placement deallocation function is implicitly passed an alignment
1454 // if the placement allocation function was, but is never passed a size.
1455 Params.Alignment =
1456 alignedAllocationModeFromBool(PassAlignmentToPlacementDelete);
1457 Params.TypeAwareDelete = TypeAwareDeallocation;
1459 } else {
1460 // For a non-placement new-expression, 'operator delete' can take a
1461 // size and/or an alignment if it has the right parameters.
1462 Params = OperatorDelete->getUsualDeleteParams();
1463 }
1464
1465 assert(!Params.DestroyingDelete &&
1466 "should not call destroying delete in a new-expression");
1467
1468 // The second argument can be a std::size_t (for non-placement delete).
1469 if (Params.Size)
1470 DeleteArgs.add(Traits::get(CGF, AllocSize),
1471 CGF.getContext().getSizeType());
1472
1473 // The next (second or third) argument can be a std::align_val_t, which
1474 // is an enum whose underlying type is std::size_t.
1475 // FIXME: Use the right type as the parameter type. Note that in a call
1476 // to operator delete(size_t, ...), we may not have it available.
1477 if (isAlignedAllocation(Params.Alignment))
1478 DeleteArgs.add(RValue::get(llvm::ConstantInt::get(
1479 CGF.SizeTy, AllocAlign.getQuantity())),
1480 CGF.getContext().getSizeType());
1481
1482 // Pass the rest of the arguments, which must match exactly.
1483 for (unsigned I = 0; I != NumPlacementArgs; ++I) {
1484 auto Arg = getPlacementArgs()[I];
1485 DeleteArgs.add(Traits::get(CGF, Arg.ArgValue), Arg.ArgType);
1486 }
1487
1488 // Call 'operator delete'.
1489 EmitNewDeleteCall(CGF, OperatorDelete, FPT, DeleteArgs);
1490 }
1491};
1492} // namespace
1493
1494/// Enter a cleanup to call 'operator delete' if the initializer in a
1495/// new-expression throws.
1497 RValue TypeIdentity, Address NewPtr,
1498 llvm::Value *AllocSize, CharUnits AllocAlign,
1499 const CallArgList &NewArgs) {
1500 unsigned NumNonPlacementArgs = E->getNumImplicitArgs();
1501
1502 // If we're not inside a conditional branch, then the cleanup will
1503 // dominate and we can do the easier (and more efficient) thing.
1504 if (!CGF.isInConditionalBranch()) {
1505 struct DirectCleanupTraits {
1506 typedef llvm::Value *ValueTy;
1507 typedef RValue RValueTy;
1508 static RValue get(CodeGenFunction &, ValueTy V) { return RValue::get(V); }
1509 static RValue get(CodeGenFunction &, RValueTy V) { return V; }
1510 };
1511
1512 typedef CallDeleteDuringNew<DirectCleanupTraits> DirectCleanup;
1513
1514 DirectCleanup *Cleanup = CGF.EHStack.pushCleanupWithExtra<DirectCleanup>(
1516 TypeIdentity, NewPtr.emitRawPointer(CGF), AllocSize,
1517 E->implicitAllocationParameters(), AllocAlign);
1518 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1519 auto &Arg = NewArgs[I + NumNonPlacementArgs];
1520 Cleanup->setPlacementArg(I, Arg.getRValue(CGF), Arg.Ty);
1521 }
1522
1523 return;
1524 }
1525
1526 // Otherwise, we need to save all this stuff.
1528 DominatingValue<RValue>::save(CGF, RValue::get(NewPtr, CGF));
1531 DominatingValue<RValue>::saved_type SavedTypeIdentity =
1532 DominatingValue<RValue>::save(CGF, TypeIdentity);
1533 struct ConditionalCleanupTraits {
1535 typedef DominatingValue<RValue>::saved_type RValueTy;
1536 static RValue get(CodeGenFunction &CGF, ValueTy V) {
1537 return V.restore(CGF);
1538 }
1539 };
1540 typedef CallDeleteDuringNew<ConditionalCleanupTraits> ConditionalCleanup;
1541
1542 ConditionalCleanup *Cleanup =
1543 CGF.EHStack.pushCleanupWithExtra<ConditionalCleanup>(
1545 SavedTypeIdentity, SavedNewPtr, SavedAllocSize,
1546 E->implicitAllocationParameters(), AllocAlign);
1547 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1548 auto &Arg = NewArgs[I + NumNonPlacementArgs];
1549 Cleanup->setPlacementArg(
1550 I, DominatingValue<RValue>::save(CGF, Arg.getRValue(CGF)), Arg.Ty);
1551 }
1552
1553 CGF.initFullExprCleanup();
1554}
1555
1557 // The element type being allocated.
1559
1560 // 1. Build a call to the allocation function.
1561 FunctionDecl *allocator = E->getOperatorNew();
1562
1563 // If there is a brace-initializer or C++20 parenthesized initializer, cannot
1564 // allocate fewer elements than inits.
1565 unsigned minElements = 0;
1566 unsigned IndexOfAlignArg = 1;
1567 if (E->isArray() && E->hasInitializer()) {
1568 const Expr *Init = E->getInitializer();
1569 const InitListExpr *ILE = dyn_cast<InitListExpr>(Init);
1570 const CXXParenListInitExpr *CPLIE = dyn_cast<CXXParenListInitExpr>(Init);
1571 const Expr *IgnoreParen = Init->IgnoreParenImpCasts();
1572 if ((ILE && ILE->isStringLiteralInit()) ||
1573 isa<StringLiteral>(IgnoreParen) || isa<ObjCEncodeExpr>(IgnoreParen)) {
1574 minElements =
1575 cast<ConstantArrayType>(Init->getType()->getAsArrayTypeUnsafe())
1576 ->getZExtSize();
1577 } else if (ILE || CPLIE) {
1578 minElements = ILE ? ILE->getNumInits() : CPLIE->getInitExprs().size();
1579 }
1580 }
1581
1582 llvm::Value *numElements = nullptr;
1583 llvm::Value *allocSizeWithoutCookie = nullptr;
1584 llvm::Value *allocSize = EmitCXXNewAllocSize(
1585 *this, E, minElements, numElements, allocSizeWithoutCookie);
1586 CharUnits allocAlign = getContext().getTypeAlignInChars(allocType);
1587
1588 // Emit the allocation call. If the allocator is a global placement
1589 // operator, just "inline" it directly.
1590 Address allocation = Address::invalid();
1591 CallArgList allocatorArgs;
1592 RValue TypeIdentityArg;
1593 if (allocator->isReservedGlobalPlacementOperator()) {
1594 assert(E->getNumPlacementArgs() == 1);
1595 const Expr *arg = *E->placement_arguments().begin();
1596
1597 LValueBaseInfo BaseInfo;
1598 allocation = EmitPointerWithAlignment(arg, &BaseInfo);
1599
1600 // The pointer expression will, in many cases, be an opaque void*.
1601 // In these cases, discard the computed alignment and use the
1602 // formal alignment of the allocated type.
1603 if (BaseInfo.getAlignmentSource() != AlignmentSource::Decl)
1604 allocation.setAlignment(allocAlign);
1605
1606 // Set up allocatorArgs for the call to operator delete if it's not
1607 // the reserved global operator.
1608 if (E->getOperatorDelete() &&
1610 allocatorArgs.add(RValue::get(allocSize), getContext().getSizeType());
1611 allocatorArgs.add(RValue::get(allocation, *this), arg->getType());
1612 }
1613
1614 } else {
1615 const FunctionProtoType *allocatorType =
1616 allocator->getType()->castAs<FunctionProtoType>();
1618 unsigned ParamsToSkip = 0;
1619 if (isTypeAwareAllocation(IAP.PassTypeIdentity)) {
1620 QualType SpecializedTypeIdentity = allocatorType->getParamType(0);
1621 CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr,
1622 SourceLocation());
1623 TypeIdentityArg = EmitAnyExprToTemp(&TypeIdentityParam);
1624 allocatorArgs.add(TypeIdentityArg, SpecializedTypeIdentity);
1625 ++ParamsToSkip;
1626 ++IndexOfAlignArg;
1627 }
1628 // The allocation size is the first argument.
1629 QualType sizeType = getContext().getSizeType();
1630 allocatorArgs.add(RValue::get(allocSize), sizeType);
1631 ++ParamsToSkip;
1632
1633 if (allocSize != allocSizeWithoutCookie) {
1634 CharUnits cookieAlign = getSizeAlign(); // FIXME: Ask the ABI.
1635 allocAlign = std::max(allocAlign, cookieAlign);
1636 }
1637
1638 // The allocation alignment may be passed as the second argument.
1639 if (isAlignedAllocation(IAP.PassAlignment)) {
1640 QualType AlignValT = sizeType;
1641 if (allocatorType->getNumParams() > IndexOfAlignArg) {
1642 AlignValT = allocatorType->getParamType(IndexOfAlignArg);
1643 assert(getContext().hasSameUnqualifiedType(
1644 AlignValT->castAsEnumDecl()->getIntegerType(), sizeType) &&
1645 "wrong type for alignment parameter");
1646 ++ParamsToSkip;
1647 } else {
1648 // Corner case, passing alignment to 'operator new(size_t, ...)'.
1649 assert(allocator->isVariadic() && "can't pass alignment to allocator");
1650 }
1651 allocatorArgs.add(
1652 RValue::get(llvm::ConstantInt::get(SizeTy, allocAlign.getQuantity())),
1653 AlignValT);
1654 }
1655
1656 // FIXME: Why do we not pass a CalleeDecl here?
1657 EmitCallArgs(allocatorArgs, allocatorType, E->placement_arguments(),
1658 /*AC*/ AbstractCallee(), /*ParamsToSkip*/ ParamsToSkip);
1659
1660 RValue RV =
1661 EmitNewDeleteCall(*this, allocator, allocatorType, allocatorArgs);
1662
1663 if (auto *newCall = dyn_cast<llvm::CallBase>(RV.getScalarVal())) {
1664 if (auto *CGDI = getDebugInfo()) {
1665 // Set !heapallocsite metadata on the call to operator new.
1666 CGDI->addHeapAllocSiteMetadata(newCall, allocType, E->getExprLoc());
1667 }
1668 if (SanOpts.has(SanitizerKind::AllocToken)) {
1669 // Set !alloc_token metadata.
1670 EmitAllocToken(newCall, allocType);
1671 }
1672 }
1673
1674 // If this was a call to a global replaceable allocation function that does
1675 // not take an alignment argument, the allocator is known to produce
1676 // storage that's suitably aligned for any object that fits, up to a known
1677 // threshold. Otherwise assume it's suitably aligned for the allocated type.
1678 CharUnits allocationAlign = allocAlign;
1679 if (!E->passAlignment() &&
1680 allocator->isReplaceableGlobalAllocationFunction()) {
1681 unsigned AllocatorAlign = llvm::bit_floor(std::min<uint64_t>(
1682 Target.getNewAlign(), getContext().getTypeSize(allocType)));
1683 allocationAlign = std::max(
1684 allocationAlign, getContext().toCharUnitsFromBits(AllocatorAlign));
1685 }
1686
1687 allocation = Address(RV.getScalarVal(), Int8Ty, allocationAlign);
1688 }
1689
1690 // Emit a null check on the allocation result if the allocation
1691 // function is allowed to return null (because it has a non-throwing
1692 // exception spec or is the reserved placement new) and we have an
1693 // interesting initializer will be running sanitizers on the initialization.
1694 bool nullCheck = E->shouldNullCheckAllocation() &&
1695 (!allocType.isPODType(getContext()) || E->hasInitializer() ||
1697
1698 llvm::BasicBlock *nullCheckBB = nullptr;
1699 llvm::BasicBlock *contBB = nullptr;
1700
1701 // The null-check means that the initializer is conditionally
1702 // evaluated.
1703 ConditionalEvaluation conditional(*this);
1704
1705 if (nullCheck) {
1706 conditional.begin(*this);
1707
1708 nullCheckBB = Builder.GetInsertBlock();
1709 llvm::BasicBlock *notNullBB = createBasicBlock("new.notnull");
1710 contBB = createBasicBlock("new.cont");
1711
1712 llvm::Value *isNull = Builder.CreateIsNull(allocation, "new.isnull");
1713 Builder.CreateCondBr(isNull, contBB, notNullBB);
1714 EmitBlock(notNullBB);
1715 }
1716
1717 // If there's an operator delete, enter a cleanup to call it if an
1718 // exception is thrown.
1719 EHScopeStack::stable_iterator operatorDeleteCleanup;
1720 llvm::Instruction *cleanupDominator = nullptr;
1721 if (E->getOperatorDelete() &&
1723 EnterNewDeleteCleanup(*this, E, TypeIdentityArg, allocation, allocSize,
1724 allocAlign, allocatorArgs);
1725 operatorDeleteCleanup = EHStack.stable_begin();
1726 cleanupDominator = Builder.CreateUnreachable();
1727 }
1728
1729 assert((allocSize == allocSizeWithoutCookie) ==
1730 CalculateCookiePadding(*this, E).isZero());
1731 if (allocSize != allocSizeWithoutCookie) {
1732 assert(E->isArray());
1733 allocation = CGM.getCXXABI().InitializeArrayCookie(
1734 *this, allocation, numElements, E, allocType);
1735 }
1736
1737 llvm::Type *elementTy = ConvertTypeForMem(allocType);
1738 Address result = allocation.withElementType(elementTy);
1739
1740 // Passing pointer through launder.invariant.group to avoid propagation of
1741 // vptrs information which may be included in previous type.
1742 // To not break LTO with different optimizations levels, we do it regardless
1743 // of optimization level.
1744 if (CGM.getCodeGenOpts().StrictVTablePointers &&
1745 allocator->isReservedGlobalPlacementOperator())
1746 result = Builder.CreateLaunderInvariantGroup(result);
1747
1748 // Emit sanitizer checks for pointer value now, so that in the case of an
1749 // array it was checked only once and not at each constructor call. We may
1750 // have already checked that the pointer is non-null.
1751 // FIXME: If we have an array cookie and a potentially-throwing allocator,
1752 // we'll null check the wrong pointer here.
1753 SanitizerSet SkippedChecks;
1754 SkippedChecks.set(SanitizerKind::Null, nullCheck);
1757 result, allocType, result.getAlignment(), SkippedChecks,
1758 numElements);
1759
1760 EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
1761 allocSizeWithoutCookie);
1762 llvm::Value *resultPtr = result.emitRawPointer(*this);
1763
1764 // Deactivate the 'operator delete' cleanup if we finished
1765 // initialization.
1766 if (operatorDeleteCleanup.isValid()) {
1767 DeactivateCleanupBlock(operatorDeleteCleanup, cleanupDominator);
1768 cleanupDominator->eraseFromParent();
1769 }
1770
1771 if (nullCheck) {
1772 conditional.end(*this);
1773
1774 llvm::BasicBlock *notNullBB = Builder.GetInsertBlock();
1775 EmitBlock(contBB);
1776
1777 llvm::PHINode *PHI = Builder.CreatePHI(resultPtr->getType(), 2);
1778 PHI->addIncoming(resultPtr, notNullBB);
1779 PHI->addIncoming(llvm::Constant::getNullValue(resultPtr->getType()),
1780 nullCheckBB);
1781
1782 resultPtr = PHI;
1783 }
1784
1785 return resultPtr;
1786}
1787
1789 llvm::Value *DeletePtr, QualType DeleteTy,
1790 llvm::Value *NumElements,
1791 CharUnits CookieSize) {
1792 assert((!NumElements && CookieSize.isZero()) ||
1793 DeleteFD->getOverloadedOperator() == OO_Array_Delete);
1794
1795 const auto *DeleteFTy = DeleteFD->getType()->castAs<FunctionProtoType>();
1796 CallArgList DeleteArgs;
1797
1798 auto Params = DeleteFD->getUsualDeleteParams();
1799 auto ParamTypeIt = DeleteFTy->param_type_begin();
1800
1801 std::optional<llvm::AllocaInst *> TagAlloca;
1802 auto EmitTag = [&](QualType TagType, const char *TagName) {
1803 assert(!TagAlloca);
1804 llvm::Type *Ty = getTypes().ConvertType(TagType);
1805 CharUnits Align = CGM.getNaturalTypeAlignment(TagType);
1806 llvm::AllocaInst *TagAllocation = CreateTempAlloca(Ty, TagName);
1807 TagAllocation->setAlignment(Align.getAsAlign());
1808 DeleteArgs.add(RValue::getAggregate(Address(TagAllocation, Ty, Align)),
1809 TagType);
1810 TagAlloca = TagAllocation;
1811 };
1812
1813 // Pass std::type_identity tag if present
1815 EmitTag(*ParamTypeIt++, "typeaware.delete.tag");
1816
1817 // Pass the pointer itself.
1818 QualType ArgTy = *ParamTypeIt++;
1819 DeleteArgs.add(RValue::get(DeletePtr), ArgTy);
1820
1821 // Pass the std::destroying_delete tag if present.
1822 if (Params.DestroyingDelete)
1823 EmitTag(*ParamTypeIt++, "destroying.delete.tag");
1824
1825 // Pass the size if the delete function has a size_t parameter.
1826 if (Params.Size) {
1827 QualType SizeType = *ParamTypeIt++;
1828 CharUnits DeleteTypeSize = getContext().getTypeSizeInChars(DeleteTy);
1829 llvm::Value *Size = llvm::ConstantInt::get(ConvertType(SizeType),
1830 DeleteTypeSize.getQuantity());
1831
1832 // For array new, multiply by the number of elements.
1833 if (NumElements)
1834 Size = Builder.CreateMul(Size, NumElements);
1835
1836 // If there is a cookie, add the cookie size.
1837 if (!CookieSize.isZero())
1838 Size = Builder.CreateAdd(
1839 Size, llvm::ConstantInt::get(SizeTy, CookieSize.getQuantity()));
1840
1841 DeleteArgs.add(RValue::get(Size), SizeType);
1842 }
1843
1844 // Pass the alignment if the delete function has an align_val_t parameter.
1845 if (isAlignedAllocation(Params.Alignment)) {
1846 QualType AlignValType = *ParamTypeIt++;
1847 CharUnits DeleteTypeAlign =
1848 getContext().toCharUnitsFromBits(getContext().getTypeAlignIfKnown(
1849 DeleteTy, true /* NeedsPreferredAlignment */));
1850 llvm::Value *Align = llvm::ConstantInt::get(ConvertType(AlignValType),
1851 DeleteTypeAlign.getQuantity());
1852 DeleteArgs.add(RValue::get(Align), AlignValType);
1853 }
1854
1855 assert(ParamTypeIt == DeleteFTy->param_type_end() &&
1856 "unknown parameter to usual delete function");
1857
1858 // Emit the call to delete.
1859 EmitNewDeleteCall(*this, DeleteFD, DeleteFTy, DeleteArgs);
1860
1861 // If call argument lowering didn't use a generated tag argument alloca we
1862 // remove them
1863 if (TagAlloca && (*TagAlloca)->use_empty())
1864 (*TagAlloca)->eraseFromParent();
1865}
1866namespace {
1867/// Calls the given 'operator delete' on a single object.
1868struct CallObjectDelete final : EHScopeStack::Cleanup {
1869 llvm::Value *Ptr;
1870 const FunctionDecl *OperatorDelete;
1871 QualType ElementType;
1872
1873 CallObjectDelete(llvm::Value *Ptr, const FunctionDecl *OperatorDelete,
1874 QualType ElementType)
1875 : Ptr(Ptr), OperatorDelete(OperatorDelete), ElementType(ElementType) {}
1876
1877 void Emit(CodeGenFunction &CGF, Flags flags) override {
1878 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
1879 }
1880};
1881} // namespace
1882
1884 const FunctionDecl *OperatorDelete, llvm::Value *CompletePtr,
1885 QualType ElementType) {
1886 EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup, CompletePtr,
1887 OperatorDelete, ElementType);
1888}
1889
1890/// Emit the code for deleting a single object with a destroying operator
1891/// delete. If the element type has a non-virtual destructor, Ptr has already
1892/// been converted to the type of the parameter of 'operator delete'. Otherwise
1893/// Ptr points to an object of the static type.
1895 const CXXDeleteExpr *DE, Address Ptr,
1896 QualType ElementType) {
1897 auto *Dtor = ElementType->getAsCXXRecordDecl()->getDestructor();
1898 if (Dtor && Dtor->isVirtual())
1899 CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1900 Dtor);
1901 else
1903 ElementType);
1904}
1905
1907 CXXDestructorDecl *Dtor,
1908 const LangOptions &LO) {
1909 assert(Dtor && Dtor->isVirtual() && "virtual dtor is expected");
1910 const Expr *DBase = E->getArgument();
1911 if (auto *MaybeDevirtualizedDtor = dyn_cast_or_null<CXXDestructorDecl>(
1912 Dtor->getDevirtualizedMethod(DBase, LO.AppleKext))) {
1913 const CXXRecordDecl *DevirtualizedClass =
1914 MaybeDevirtualizedDtor->getParent();
1915 if (declaresSameEntity(getCXXRecord(DBase), DevirtualizedClass)) {
1916 // Devirtualized to the class of the base type (the type of the
1917 // whole expression).
1918 return MaybeDevirtualizedDtor;
1919 }
1920 // Devirtualized to some other type. Would need to cast the this
1921 // pointer to that type but we don't have support for that yet, so
1922 // do a virtual call. FIXME: handle the case where it is
1923 // devirtualized to the derived type (the type of the inner
1924 // expression) as in EmitCXXMemberOrOperatorMemberCallExpr.
1925 }
1926 return nullptr;
1927}
1928
1929/// Emit the code for deleting a single object.
1930/// \return \c true if we started emitting UnconditionalDeleteBlock, \c false
1931/// if not.
1933 Address Ptr, QualType ElementType,
1934 llvm::BasicBlock *UnconditionalDeleteBlock) {
1935 // C++11 [expr.delete]p3:
1936 // If the static type of the object to be deleted is different from its
1937 // dynamic type, the static type shall be a base class of the dynamic type
1938 // of the object to be deleted and the static type shall have a virtual
1939 // destructor or the behavior is undefined.
1941 ElementType);
1942
1943 const FunctionDecl *OperatorDelete = DE->getOperatorDelete();
1944 assert(!OperatorDelete->isDestroyingOperatorDelete());
1945
1946 // Find the destructor for the type, if applicable. If the
1947 // destructor is virtual, we'll just emit the vcall and return.
1948 CXXDestructorDecl *Dtor = nullptr;
1949 if (const auto *RD = ElementType->getAsCXXRecordDecl()) {
1950 if (RD->hasDefinition() && !RD->hasTrivialDestructor()) {
1951 Dtor = RD->getDestructor();
1952
1953 if (Dtor->isVirtual()) {
1954 if (auto *DevirtualizedDtor =
1955 TryDevirtualizeDtorCall(DE, Dtor, CGF.CGM.getLangOpts())) {
1956 Dtor = DevirtualizedDtor;
1957 } else {
1958 CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1959 Dtor);
1960 return false;
1961 }
1962 }
1963 }
1964 }
1965
1966 // Make sure that we call delete even if the dtor throws.
1967 // This doesn't have to a conditional cleanup because we're going
1968 // to pop it off in a second.
1969 CGF.EHStack.pushCleanup<CallObjectDelete>(
1970 NormalAndEHCleanup, Ptr.emitRawPointer(CGF), OperatorDelete, ElementType);
1971
1972 if (Dtor)
1974 /*ForVirtualBase=*/false,
1975 /*Delegating=*/false, Ptr, ElementType);
1976 else if (auto Lifetime = ElementType.getObjCLifetime()) {
1977 switch (Lifetime) {
1981 break;
1982
1985 break;
1986
1988 CGF.EmitARCDestroyWeak(Ptr);
1989 break;
1990 }
1991 }
1992
1993 // When optimizing for size, call 'operator delete' unconditionally.
1994 if (CGF.CGM.getCodeGenOpts().OptimizeSize > 1) {
1995 CGF.EmitBlock(UnconditionalDeleteBlock);
1996 CGF.PopCleanupBlock();
1997 return true;
1998 }
1999
2000 CGF.PopCleanupBlock();
2001 return false;
2002}
2003
2004namespace {
2005/// Calls the given 'operator delete' on an array of objects.
2006struct CallArrayDelete final : EHScopeStack::Cleanup {
2007 llvm::Value *Ptr;
2008 const FunctionDecl *OperatorDelete;
2009 llvm::Value *NumElements;
2010 QualType ElementType;
2011 CharUnits CookieSize;
2012
2013 CallArrayDelete(llvm::Value *Ptr, const FunctionDecl *OperatorDelete,
2014 llvm::Value *NumElements, QualType ElementType,
2015 CharUnits CookieSize)
2016 : Ptr(Ptr), OperatorDelete(OperatorDelete), NumElements(NumElements),
2017 ElementType(ElementType), CookieSize(CookieSize) {}
2018
2019 void Emit(CodeGenFunction &CGF, Flags flags) override {
2020 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType, NumElements,
2021 CookieSize);
2022 }
2023};
2024} // namespace
2025
2026/// Emit the code for deleting an array of objects.
2028 Address deletedPtr, QualType elementType) {
2029 llvm::Value *numElements = nullptr;
2030 llvm::Value *allocatedPtr = nullptr;
2031 CharUnits cookieSize;
2032 CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
2033 numElements, allocatedPtr, cookieSize);
2034
2035 assert(allocatedPtr && "ReadArrayCookie didn't set allocated pointer");
2036
2037 // Make sure that we call delete even if one of the dtors throws.
2038 const FunctionDecl *operatorDelete = E->getOperatorDelete();
2039 CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup, allocatedPtr,
2040 operatorDelete, numElements,
2041 elementType, cookieSize);
2042
2043 // Destroy the elements.
2044 if (QualType::DestructionKind dtorKind = elementType.isDestructedType()) {
2045 assert(numElements && "no element count for a type with a destructor!");
2046
2047 CharUnits elementSize = CGF.getContext().getTypeSizeInChars(elementType);
2048 CharUnits elementAlign =
2049 deletedPtr.getAlignment().alignmentOfArrayElement(elementSize);
2050
2051 llvm::Value *arrayBegin = deletedPtr.emitRawPointer(CGF);
2052 llvm::Value *arrayEnd = CGF.Builder.CreateInBoundsGEP(
2053 deletedPtr.getElementType(), arrayBegin, numElements, "delete.end");
2054
2055 // Note that it is legal to allocate a zero-length array, and we
2056 // can never fold the check away because the length should always
2057 // come from a cookie.
2058 CGF.emitArrayDestroy(arrayBegin, arrayEnd, elementType, elementAlign,
2059 CGF.getDestroyer(dtorKind),
2060 /*checkZeroLength*/ true,
2061 CGF.needsEHCleanup(dtorKind));
2062 }
2063
2064 // Pop the cleanup block.
2065 CGF.PopCleanupBlock();
2066}
2067
2069 const Expr *Arg = E->getArgument();
2071
2072 // Null check the pointer.
2073 //
2074 // We could avoid this null check if we can determine that the object
2075 // destruction is trivial and doesn't require an array cookie; we can
2076 // unconditionally perform the operator delete call in that case. For now, we
2077 // assume that deleted pointers are null rarely enough that it's better to
2078 // keep the branch. This might be worth revisiting for a -O0 code size win.
2079 llvm::BasicBlock *DeleteNotNull = createBasicBlock("delete.notnull");
2080 llvm::BasicBlock *DeleteEnd = createBasicBlock("delete.end");
2081
2082 llvm::Value *IsNull = Builder.CreateIsNull(Ptr, "isnull");
2083
2084 Builder.CreateCondBr(IsNull, DeleteEnd, DeleteNotNull);
2085 EmitBlock(DeleteNotNull);
2086 Ptr.setKnownNonNull();
2087
2088 QualType DeleteTy = E->getDestroyedType();
2089
2090 // A destroying operator delete overrides the entire operation of the
2091 // delete expression.
2093 EmitDestroyingObjectDelete(*this, E, Ptr, DeleteTy);
2094 EmitBlock(DeleteEnd);
2095 return;
2096 }
2097
2098 // We might be deleting a pointer to array.
2099 DeleteTy = getContext().getBaseElementType(DeleteTy);
2100 Ptr = Ptr.withElementType(ConvertTypeForMem(DeleteTy));
2101
2102 if (E->isArrayForm() &&
2103 CGM.getContext().getTargetInfo().emitVectorDeletingDtors(
2104 CGM.getContext().getLangOpts())) {
2105 if (auto *RD = DeleteTy->getAsCXXRecordDecl()) {
2106 auto *Dtor = RD->getDestructor();
2107 if (Dtor && Dtor->isVirtual()) {
2108 // Emit normal loop over the array elements if we can easily
2109 // devirtualize destructor call.
2110 // Emit virtual call to vector deleting destructor otherwise.
2111 if (!TryDevirtualizeDtorCall(E, Dtor, CGM.getLangOpts())) {
2112 llvm::Value *NumElements = nullptr;
2113 llvm::Value *AllocatedPtr = nullptr;
2114 CharUnits CookieSize;
2115 llvm::BasicBlock *BodyBB = createBasicBlock("vdtor.call");
2116 llvm::BasicBlock *DoneBB = createBasicBlock("vdtor.nocall");
2117 // Check array cookie to see if the array has length 0. Don't call
2118 // the destructor in that case.
2119 CGM.getCXXABI().ReadArrayCookie(*this, Ptr, E, DeleteTy, NumElements,
2120 AllocatedPtr, CookieSize);
2121
2122 auto *CondTy = cast<llvm::IntegerType>(NumElements->getType());
2123 llvm::Value *IsEmpty = Builder.CreateICmpEQ(
2124 NumElements, llvm::ConstantInt::get(CondTy, 0));
2125 Builder.CreateCondBr(IsEmpty, DoneBB, BodyBB);
2126
2127 // Delete cookie for empty array.
2128 const FunctionDecl *OperatorDelete = E->getOperatorDelete();
2129 EmitBlock(DoneBB);
2130 EmitDeleteCall(OperatorDelete, AllocatedPtr, DeleteTy, NumElements,
2131 CookieSize);
2132 EmitBranch(DeleteEnd);
2133
2134 EmitBlock(BodyBB);
2135 CGM.getCXXABI().emitVirtualObjectDelete(*this, E, Ptr, DeleteTy,
2136 Dtor);
2137 EmitBlock(DeleteEnd);
2138 return;
2139 }
2140 }
2141 }
2142 }
2143
2144 if (E->isArrayForm()) {
2145 EmitArrayDelete(*this, E, Ptr, DeleteTy);
2146 EmitBlock(DeleteEnd);
2147 } else {
2148 if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd))
2149 EmitBlock(DeleteEnd);
2150 }
2151}
2152
2153static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E,
2154 llvm::Type *StdTypeInfoPtrTy,
2155 bool HasNullCheck) {
2156 // Get the vtable pointer.
2157 Address ThisPtr = CGF.EmitLValue(E).getAddress();
2158
2159 QualType SrcRecordTy = E->getType();
2160
2161 // C++ [class.cdtor]p4:
2162 // If the operand of typeid refers to the object under construction or
2163 // destruction and the static type of the operand is neither the constructor
2164 // or destructor’s class nor one of its bases, the behavior is undefined.
2166 ThisPtr, SrcRecordTy);
2167
2168 // Whether we need an explicit null pointer check. For example, with the
2169 // Microsoft ABI, if this is a call to __RTtypeid, the null pointer check and
2170 // exception throw is inside the __RTtypeid(nullptr) call
2171 if (HasNullCheck &&
2172 CGF.CGM.getCXXABI().shouldTypeidBeNullChecked(SrcRecordTy)) {
2173 llvm::BasicBlock *BadTypeidBlock =
2174 CGF.createBasicBlock("typeid.bad_typeid");
2175 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("typeid.end");
2176
2177 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ThisPtr);
2178 CGF.Builder.CreateCondBr(IsNull, BadTypeidBlock, EndBlock);
2179
2180 CGF.EmitBlock(BadTypeidBlock);
2181 CGF.CGM.getCXXABI().EmitBadTypeidCall(CGF);
2182 CGF.EmitBlock(EndBlock);
2183 }
2184
2185 return CGF.CGM.getCXXABI().EmitTypeid(CGF, SrcRecordTy, ThisPtr,
2186 StdTypeInfoPtrTy);
2187}
2188
2190 // Ideally, we would like to use GlobalsInt8PtrTy here, however, we cannot,
2191 // primarily because the result of applying typeid is a value of type
2192 // type_info, which is declared & defined by the standard library
2193 // implementation and expects to operate on the generic (default) AS.
2194 // https://reviews.llvm.org/D157452 has more context, and a possible solution.
2195 llvm::Type *PtrTy = Int8PtrTy;
2196 LangAS GlobAS = CGM.GetGlobalVarAddressSpace(nullptr);
2197
2198 auto MaybeASCast = [=](llvm::Constant *TypeInfo) {
2199 if (GlobAS == LangAS::Default)
2200 return TypeInfo;
2201 return CGM.performAddrSpaceCast(TypeInfo, PtrTy);
2202 };
2203
2204 if (E->isTypeOperand()) {
2205 llvm::Constant *TypeInfo =
2206 CGM.GetAddrOfRTTIDescriptor(E->getTypeOperand(getContext()));
2207 return MaybeASCast(TypeInfo);
2208 }
2209
2210 // C++ [expr.typeid]p2:
2211 // When typeid is applied to a glvalue expression whose type is a
2212 // polymorphic class type, the result refers to a std::type_info object
2213 // representing the type of the most derived object (that is, the dynamic
2214 // type) to which the glvalue refers.
2215 // If the operand is already most derived object, no need to look up vtable.
2217 return EmitTypeidFromVTable(*this, E->getExprOperand(), PtrTy,
2218 E->hasNullCheck());
2219
2220 QualType OperandTy = E->getExprOperand()->getType();
2221 return MaybeASCast(CGM.GetAddrOfRTTIDescriptor(OperandTy));
2222}
2223
2225 QualType DestTy) {
2226 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
2227 if (DestTy->isPointerType())
2228 return llvm::Constant::getNullValue(DestLTy);
2229
2230 /// C++ [expr.dynamic.cast]p9:
2231 /// A failed cast to reference type throws std::bad_cast
2232 if (!CGF.CGM.getCXXABI().EmitBadCastCall(CGF))
2233 return nullptr;
2234
2235 CGF.Builder.ClearInsertionPoint();
2236 return llvm::PoisonValue::get(DestLTy);
2237}
2238
2240 const CXXDynamicCastExpr *DCE) {
2241 CGM.EmitExplicitCastExprType(DCE, this);
2242 QualType DestTy = DCE->getTypeAsWritten();
2243
2244 QualType SrcTy = DCE->getSubExpr()->getType();
2245
2246 // C++ [expr.dynamic.cast]p7:
2247 // If T is "pointer to cv void," then the result is a pointer to the most
2248 // derived object pointed to by v.
2249 bool IsDynamicCastToVoid = DestTy->isVoidPointerType();
2250 QualType SrcRecordTy;
2251 QualType DestRecordTy;
2252 if (IsDynamicCastToVoid) {
2253 SrcRecordTy = SrcTy->getPointeeType();
2254 // No DestRecordTy.
2255 } else if (const PointerType *DestPTy = DestTy->getAs<PointerType>()) {
2256 SrcRecordTy = SrcTy->castAs<PointerType>()->getPointeeType();
2257 DestRecordTy = DestPTy->getPointeeType();
2258 } else {
2259 SrcRecordTy = SrcTy;
2260 DestRecordTy = DestTy->castAs<ReferenceType>()->getPointeeType();
2261 }
2262
2263 // C++ [class.cdtor]p5:
2264 // If the operand of the dynamic_cast refers to the object under
2265 // construction or destruction and the static type of the operand is not a
2266 // pointer to or object of the constructor or destructor’s own class or one
2267 // of its bases, the dynamic_cast results in undefined behavior.
2268 EmitTypeCheck(TCK_DynamicOperation, DCE->getExprLoc(), ThisAddr, SrcRecordTy);
2269
2270 if (DCE->isAlwaysNull()) {
2271 if (llvm::Value *T = EmitDynamicCastToNull(*this, DestTy)) {
2272 // Expression emission is expected to retain a valid insertion point.
2273 if (!Builder.GetInsertBlock())
2274 EmitBlock(createBasicBlock("dynamic_cast.unreachable"));
2275 return T;
2276 }
2277 }
2278
2279 assert(SrcRecordTy->isRecordType() && "source type must be a record type!");
2280
2281 // If the destination is effectively final, the cast succeeds if and only
2282 // if the dynamic type of the pointer is exactly the destination type.
2283 bool IsExact = !IsDynamicCastToVoid &&
2284 CGM.getCodeGenOpts().OptimizationLevel > 0 &&
2285 DestRecordTy->getAsCXXRecordDecl()->isEffectivelyFinal() &&
2286 CGM.getCXXABI().shouldEmitExactDynamicCast(DestRecordTy);
2287
2288 std::optional<CGCXXABI::ExactDynamicCastInfo> ExactCastInfo;
2289 if (IsExact) {
2290 ExactCastInfo = CGM.getCXXABI().getExactDynamicCastInfo(SrcRecordTy, DestTy,
2291 DestRecordTy);
2292 if (!ExactCastInfo) {
2293 llvm::Value *NullValue = EmitDynamicCastToNull(*this, DestTy);
2294 if (!Builder.GetInsertBlock())
2295 EmitBlock(createBasicBlock("dynamic_cast.unreachable"));
2296 return NullValue;
2297 }
2298 }
2299
2300 // C++ [expr.dynamic.cast]p4:
2301 // If the value of v is a null pointer value in the pointer case, the result
2302 // is the null pointer value of type T.
2303 bool ShouldNullCheckSrcValue =
2304 IsExact || CGM.getCXXABI().shouldDynamicCastCallBeNullChecked(
2305 SrcTy->isPointerType(), SrcRecordTy);
2306
2307 llvm::BasicBlock *CastNull = nullptr;
2308 llvm::BasicBlock *CastNotNull = nullptr;
2309 llvm::BasicBlock *CastEnd = createBasicBlock("dynamic_cast.end");
2310
2311 if (ShouldNullCheckSrcValue) {
2312 CastNull = createBasicBlock("dynamic_cast.null");
2313 CastNotNull = createBasicBlock("dynamic_cast.notnull");
2314
2315 llvm::Value *IsNull = Builder.CreateIsNull(ThisAddr);
2316 Builder.CreateCondBr(IsNull, CastNull, CastNotNull);
2317 EmitBlock(CastNotNull);
2318 }
2319
2320 llvm::Value *Value;
2321 if (IsDynamicCastToVoid) {
2322 Value = CGM.getCXXABI().emitDynamicCastToVoid(*this, ThisAddr, SrcRecordTy);
2323 } else if (IsExact) {
2324 // If the destination type is effectively final, this pointer points to the
2325 // right type if and only if its vptr has the right value.
2326 Value = CGM.getCXXABI().emitExactDynamicCast(
2327 *this, ThisAddr, SrcRecordTy, DestTy, DestRecordTy, *ExactCastInfo,
2328 CastEnd, CastNull);
2329 } else {
2330 assert(DestRecordTy->isRecordType() &&
2331 "destination type must be a record type!");
2332 Value = CGM.getCXXABI().emitDynamicCastCall(*this, ThisAddr, SrcRecordTy,
2333 DestTy, DestRecordTy, CastEnd);
2334 }
2335 CastNotNull = Builder.GetInsertBlock();
2336
2337 llvm::Value *NullValue = nullptr;
2338 if (ShouldNullCheckSrcValue) {
2339 EmitBranch(CastEnd);
2340
2341 EmitBlock(CastNull);
2342 NullValue = EmitDynamicCastToNull(*this, DestTy);
2343 CastNull = Builder.GetInsertBlock();
2344
2345 EmitBranch(CastEnd);
2346 }
2347
2348 EmitBlock(CastEnd);
2349
2350 if (CastNull) {
2351 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType(), 2);
2352 PHI->addIncoming(Value, CastNotNull);
2353 PHI->addIncoming(NullValue, CastNull);
2354
2355 Value = PHI;
2356 }
2357
2358 return Value;
2359}
#define V(N, I)
static MemberCallInfo commonEmitCXXMemberOrOperatorCall(CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *CE, CallArgList &Args, CallArgList *RtlArgs)
Definition CGExprCXX.cpp:36
static llvm::Value * EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E, llvm::Type *StdTypeInfoPtrTy, bool HasNullCheck)
static llvm::Value * EmitDynamicCastToNull(CodeGenFunction &CGF, QualType DestTy)
static RValue EmitNewDeleteCall(CodeGenFunction &CGF, const FunctionDecl *CalleeDecl, const FunctionProtoType *CalleeType, const CallArgList &Args)
Emit a call to an operator new or operator delete function, as implicitly created by new-expressions ...
static CXXDestructorDecl * TryDevirtualizeDtorCall(const CXXDeleteExpr *E, CXXDestructorDecl *Dtor, const LangOptions &LO)
static void EmitDestroyingObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, Address Ptr, QualType ElementType)
Emit the code for deleting a single object with a destroying operator delete.
static void EmitNullBaseClassInitialization(CodeGenFunction &CGF, Address DestPtr, const CXXRecordDecl *Base)
static bool EmitObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, Address Ptr, QualType ElementType, llvm::BasicBlock *UnconditionalDeleteBlock)
Emit the code for deleting a single object.
static CXXRecordDecl * getCXXRecord(const Expr *E)
static void EnterNewDeleteCleanup(CodeGenFunction &CGF, const CXXNewExpr *E, RValue TypeIdentity, Address NewPtr, llvm::Value *AllocSize, CharUnits AllocAlign, const CallArgList &NewArgs)
Enter a cleanup to call 'operator delete' if the initializer in a new-expression throws.
static CharUnits CalculateCookiePadding(CodeGenFunction &CGF, const CXXNewExpr *E)
static void EmitArrayDelete(CodeGenFunction &CGF, const CXXDeleteExpr *E, Address deletedPtr, QualType elementType)
Emit the code for deleting an array of objects.
static void StoreAnyExprIntoOneUnit(CodeGenFunction &CGF, const Expr *Init, QualType AllocType, Address NewPtr, AggValueSlot::Overlap_t MayOverlap)
static void EmitNewInitializer(CodeGenFunction &CGF, const CXXNewExpr *E, QualType ElementType, llvm::Type *ElementTy, Address NewPtr, llvm::Value *NumElements, llvm::Value *AllocSizeWithoutCookie)
static llvm::Value * EmitCXXNewAllocSize(CodeGenFunction &CGF, const CXXNewExpr *e, unsigned minElements, llvm::Value *&numElements, llvm::Value *&sizeWithoutCookie)
static QualType getPointeeType(const MemRegion *R)
a trap message and trap category.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:226
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
DeclarationNameTable DeclarationNames
Definition ASTContext.h:802
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getNonVirtualAlignment() const
getNonVirtualAlignment - Get the non-virtual alignment (in chars) of an object, which is the alignmen...
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3772
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4041
Expr * getLHS() const
Definition Expr.h:4091
Expr * getRHS() const
Definition Expr.h:4093
Opcode getOpcode() const
Definition Expr.h:4086
Represents a call to a CUDA kernel function.
Definition ExprCXX.h:235
Represents a call to a C++ constructor.
Definition ExprCXX.h:1549
bool isElidable() const
Whether this construction is elidable.
Definition ExprCXX.h:1618
Expr * getArg(unsigned Arg)
Return the specified argument.
Definition ExprCXX.h:1692
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
Definition ExprCXX.h:1651
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition ExprCXX.h:1612
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Definition ExprCXX.h:1660
Represents a C++ constructor within a class.
Definition DeclCXX.h:2611
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
Definition DeclCXX.cpp:3017
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2627
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2666
bool isArrayForm() const
Definition ExprCXX.h:2653
QualType getDestroyedType() const
Retrieve the type being destroyed.
Definition ExprCXX.cpp:338
Represents a C++ destructor within a class.
Definition DeclCXX.h:2876
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition ExprCXX.h:482
bool isAlwaysNull() const
isAlwaysNull - Return whether the result of the dynamic_cast is proven to always be null.
Definition ExprCXX.cpp:838
Represents a call to a member function that may be written either with member call syntax (e....
Definition ExprCXX.h:180
SourceLocation getExprLoc() const LLVM_READONLY
Definition ExprCXX.h:221
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2136
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
Definition DeclCXX.cpp:2728
bool isVirtual() const
Definition DeclCXX.h:2191
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2262
QualType getThisType() const
Return the type of the this pointer.
Definition DeclCXX.cpp:2827
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Definition DeclCXX.cpp:2753
Qualifiers getMethodQualifiers() const
Definition DeclCXX.h:2297
CXXMethodDecl * getDevirtualizedMethod(const Expr *Base, bool IsAppleKext)
If it's possible to devirtualize a call to this method, return the called function.
Definition DeclCXX.cpp:2526
CXXMethodDecl * getCorrespondingMethodInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find the method in RD that corresponds to this one.
Definition DeclCXX.cpp:2472
bool isStatic() const
Definition DeclCXX.cpp:2419
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
Definition DeclCXX.cpp:2732
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2356
bool isArray() const
Definition ExprCXX.h:2465
llvm::iterator_range< arg_iterator > placement_arguments()
Definition ExprCXX.h:2573
QualType getAllocatedType() const
Definition ExprCXX.h:2435
unsigned getNumImplicitArgs() const
Definition ExprCXX.h:2512
std::optional< Expr * > getArraySize()
This might return std::nullopt even if isArray() returns true, since there might not be an array size...
Definition ExprCXX.h:2470
ImplicitAllocationParameters implicitAllocationParameters() const
Provides the full set of information about expected implicit parameters in this call.
Definition ExprCXX.h:2563
bool hasInitializer() const
Whether this new-expression has any initializer at all.
Definition ExprCXX.h:2525
bool shouldNullCheckAllocation() const
True if the allocation result needs to be null-checked.
Definition ExprCXX.cpp:326
bool passAlignment() const
Indicates whether the required alignment should be implicitly passed to the allocation function.
Definition ExprCXX.h:2552
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2462
unsigned getNumPlacementArgs() const
Definition ExprCXX.h:2495
TypeSourceInfo * getAllocatedTypeSourceInfo() const
Definition ExprCXX.h:2439
FunctionDecl * getOperatorNew() const
Definition ExprCXX.h:2460
Expr * getInitializer()
The initializer of this new-expression.
Definition ExprCXX.h:2534
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:85
Represents a list-initialization with parenthesis.
Definition ExprCXX.h:5142
MutableArrayRef< Expr * > getInitExprs()
Definition ExprCXX.h:5182
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition ExprCXX.h:2746
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
Definition ExprCXX.h:2810
QualType getDestroyedType() const
Retrieve the type being destroyed.
Definition ExprCXX.cpp:385
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool isEffectivelyFinal() const
Determine whether it's impossible for a class to be derived from this class.
Definition DeclCXX.cpp:2343
bool isDynamicClass() const
Definition DeclCXX.h:574
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
Definition DeclCXX.h:1186
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Definition DeclCXX.cpp:2131
An expression "T()" which creates an rvalue of a non-class type T.
Definition ExprCXX.h:2197
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:849
bool isTypeOperand() const
Definition ExprCXX.h:885
QualType getTypeOperand(const ASTContext &Context) const
Retrieves the type operand of this typeid() expression after various required adjustments (removing r...
Definition ExprCXX.cpp:161
Expr * getExprOperand() const
Definition ExprCXX.h:896
bool isMostDerived(const ASTContext &Context) const
Best-effort check if the expression operand refers to a most derived object.
Definition ExprCXX.cpp:149
bool isPotentiallyEvaluated() const
Determine whether this typeid has a type operand which is potentially evaluated, per C++11 [expr....
Definition ExprCXX.cpp:134
bool hasNullCheck() const
Whether this is of a form like "typeid(*ptr)" that can throw a std::bad_typeid if a pointer is a null...
Definition ExprCXX.cpp:200
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2946
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3150
SourceLocation getBeginLoc() const
Definition Expr.h:3280
arg_iterator arg_begin()
Definition Expr.h:3203
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
Definition Expr.h:3129
Expr * getCallee()
Definition Expr.h:3093
arg_range arguments()
Definition Expr.h:3198
Expr * getSubExpr()
Definition Expr.h:3729
CharUnits - This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
CharUnits alignmentAtOffset(CharUnits offset) const
Given that this is a non-zero alignment value, what is the alignment at the given offset?
Definition CharUnits.h:207
bool isNegative() const
isNegative - Test whether the quantity is less than zero.
Definition CharUnits.h:131
bool isZero() const
isZero - Test whether the quantity equals zero.
Definition CharUnits.h:122
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
Definition CharUnits.h:189
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition CharUnits.h:185
CharUnits alignmentOfArrayElement(CharUnits elementSize) const
Given that this is the alignment of the first element of an array, return the minimum alignment of an...
Definition CharUnits.h:214
bool isOne() const
isOne - Test whether the quantity equals one.
Definition CharUnits.h:125
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Definition CharUnits.h:53
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
Definition Address.h:128
static Address invalid()
Definition Address.h:176
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
Definition Address.h:253
CharUnits getAlignment() const
Definition Address.h:194
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Definition Address.h:209
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Definition Address.h:276
Address setKnownNonNull()
Definition Address.h:238
void setAlignment(CharUnits Value)
Definition Address.h:196
bool isValid() const
Definition Address.h:177
llvm::PointerType * getType() const
Return the type of the pointer value.
Definition Address.h:204
An aggregate value slot.
Definition CGValue.h:551
bool isSanitizerChecked() const
Definition CGValue.h:709
Address getAddress() const
Definition CGValue.h:691
IsZeroed_t isZeroed() const
Definition CGValue.h:722
static AggValueSlot forAddr(Address addr, Qualifiers quals, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
forAddr - Make a slot for an aggregate value.
Definition CGValue.h:634
A scoped helper to set the current debug location to the specified location or preferred location of ...
Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Given a pointer to i8, adjust it by a given constant offset.
Definition CGBuilder.h:315
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
Definition CGBuilder.h:366
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Definition CGBuilder.h:408
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
Definition CGBuilder.h:375
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition CGBuilder.h:356
virtual std::vector< CharUnits > getVBPtrOffsets(const CXXRecordDecl *RD)
Gets the offsets of all the virtual base pointers in a given class.
Definition CGCXXABI.cpp:350
virtual void ReadArrayCookie(CodeGenFunction &CGF, Address Ptr, const CXXDeleteExpr *expr, QualType ElementType, llvm::Value *&NumElements, llvm::Value *&AllocPtr, CharUnits &CookieSize)
Reads the array cookie associated with the given pointer, if it has one.
Definition CGCXXABI.cpp:249
virtual bool shouldTypeidBeNullChecked(QualType SrcRecordTy)=0
virtual void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE, Address Ptr, QualType ElementType, const CXXDestructorDecl *Dtor)=0
virtual const CXXRecordDecl * getThisArgumentTypeForMethod(GlobalDecl GD)
Get the type of the implicit "this" parameter used by a method.
Definition CGCXXABI.h:395
virtual bool EmitBadCastCall(CodeGenFunction &CGF)=0
virtual llvm::Value * EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy, Address ThisPtr, llvm::Type *StdTypeInfoPtrTy)=0
virtual CharUnits GetArrayCookieSize(const CXXNewExpr *expr)
Returns the extra size required in order to store the array cookie for the given new-expression.
Definition CGCXXABI.cpp:209
virtual void EmitBadTypeidCall(CodeGenFunction &CGF)=0
All available information about a concrete callee.
Definition CGCall.h:63
static CGCallee forVirtual(const CallExpr *CE, GlobalDecl MD, Address Addr, llvm::FunctionType *FTy)
Definition CGCall.h:147
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
Definition CGCall.h:137
CGFunctionInfo - Class to encapsulate the information about a function definition.
CallArgList - Type for representing both the value and type of arguments in a call.
Definition CGCall.h:274
void add(RValue rvalue, QualType type)
Definition CGCall.h:302
void addFrom(const CallArgList &other)
Add all the arguments from another CallArgList to this one.
Definition CGCall.h:311
An abstract representation of regular/ObjC call/message targets.
An object to manage conditionally-evaluated expressions.
Enters a new scope for capturing cleanups, all of which will be executed once the scope is exited.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void emitArrayDestroy(llvm::Value *begin, llvm::Value *end, QualType elementType, CharUnits elementAlign, Destroyer *destroyer, bool checkZeroLength, bool useEHCleanup)
emitArrayDestroy - Destroys all the elements of the given array, beginning from last to first.
Definition CGDecl.cpp:2456
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
llvm::Value * performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy)
SanitizerSet SanOpts
Sanitizers enabled for this function.
void EmitNullInitialization(Address DestPtr, QualType Ty)
EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
llvm::Type * ConvertType(QualType T)
RValue EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E)
RValue EmitCXXMemberOrOperatorMemberCallExpr(const CallExpr *CE, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, bool HasQualifier, NestedNameSpecifier Qualifier, bool IsArrow, const Expr *Base, llvm::CallBase **CallOrInvoke)
void EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, SourceLocation Loc)
EmitVTablePtrCheckForCall - Virtual method MD is being called via VTable.
Definition CGClass.cpp:2965
void EmitARCDestroyWeak(Address addr)
void @objc_destroyWeak(i8** addr) Essentially objc_storeWeak(addr, nil).
Definition CGObjC.cpp:2699
void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin, llvm::Value *arrayEnd, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
pushRegularPartialArrayCleanup - Push an EH cleanup to destroy already-constructed elements of the gi...
Definition CGDecl.cpp:2616
void EmitSynthesizedCXXCopyCtor(Address Dest, Address Src, const Expr *Exp)
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void EmitCXXDeleteExpr(const CXXDeleteExpr *E)
const LangOptions & getLangOpts() const
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
Definition CGDecl.cpp:787
void EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, const ArrayType *ArrayTy, Address ArrayPtr, const CXXConstructExpr *E, bool NewPointerIsChecked, bool ZeroInitialization=false)
EmitCXXAggrConstructorCall - Emit a loop to call a particular constructor for each of several members...
Definition CGClass.cpp:2146
@ TCK_ConstructorCall
Checking the 'this' pointer for a constructor call.
@ TCK_MemberCall
Checking the 'this' pointer for a call to a non-static member function.
@ TCK_DynamicOperation
Checking the operand of a dynamic_cast or a typeid expression.
llvm::Value * EmitCXXNewExpr(const CXXNewExpr *E)
void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type, bool ForVirtualBase, bool Delegating, Address This, QualType ThisTy)
Definition CGClass.cpp:2661
void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin, Address arrayEndPointer, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
pushIrregularPartialArrayCleanup - Push a NormalAndEHCleanup to destroy already-constructed elements ...
Definition CGDecl.cpp:2600
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
Definition CGDecl.cpp:2273
void EmitAggregateAssign(LValue Dest, LValue Src, QualType EltTy)
Emit an aggregate assignment.
void EmitARCRelease(llvm::Value *value, ARCPreciseLifetime_t precise)
Release the given object.
Definition CGObjC.cpp:2499
void pushCallObjectDeleteCleanup(const FunctionDecl *OperatorDelete, llvm::Value *CompletePtr, QualType ElementType)
RValue EmitCXXMemberOrOperatorCall(const CXXMethodDecl *Method, const CGCallee &Callee, ReturnValueSlot ReturnValue, llvm::Value *This, llvm::Value *ImplicitParam, QualType ImplicitParamTy, const CallExpr *E, CallArgList *RtlArgs, llvm::CallBase **CallOrInvoke)
Definition CGExprCXX.cpp:85
@ ForceRightToLeft
! Language semantics require right-to-left evaluation.
RValue EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
void initFullExprCleanup()
Set up the last cleanup that was pushed as a conditional full-expression cleanup.
bool isInConditionalBranch() const
isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
Definition CGExpr.cpp:251
void EmitARCDestroyStrong(Address addr, ARCPreciseLifetime_t precise)
Destroy a __strong variable.
Definition CGObjC.cpp:2528
void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
DeactivateCleanupBlock - Deactivates the given cleanup block.
void EmitCXXConstructorCall(const CXXConstructorDecl *D, CXXCtorType Type, bool ForVirtualBase, bool Delegating, AggValueSlot ThisAVS, const CXXConstructExpr *E)
Definition CGClass.cpp:2284
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
Definition CGExpr.cpp:153
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
Definition CGCall.cpp:5340
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
Definition CGExpr.cpp:292
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType)
Emit and set additional metadata used by the AllocToken instrumentation.
Definition CGExpr.cpp:1330
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
RValue EmitBuiltinNewDeleteCall(const FunctionProtoType *Type, const CallExpr *TheCallExpr, bool IsDelete)
llvm::Type * ConvertTypeForMem(QualType T)
void EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D, Address This, Address Src, const CXXConstructExpr *E)
Definition CGClass.cpp:2551
void EmitDeleteCall(const FunctionDecl *DeleteFD, llvm::Value *Ptr, QualType DeleteTy, llvm::Value *NumElements=nullptr, CharUnits CookieSize=CharUnits())
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
Definition CGExpr.cpp:1591
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
Definition CGStmt.cpp:660
CGCallee BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier Qual, llvm::Type *Ty)
BuildAppleKextVirtualCall - This routine is to support gcc's kext ABI making indirect call to virtual...
Definition CGCXX.cpp:314
RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
Definition CGExpr.cpp:742
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
static bool IsWrappedCXXThis(const Expr *E)
Check if E is a C++ "this" pointer wrapped in value-preserving casts.
Definition CGExpr.cpp:1649
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
EmitCallArgs - Emit call arguments for a function.
Definition CGCall.cpp:4777
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
Definition CGExpr.cpp:1707
void EmitNewArrayInitializer(const CXXNewExpr *E, QualType elementType, llvm::Type *ElementTy, Address NewPtr, llvm::Value *NumElements, llvm::Value *AllocSizeWithoutCookie)
RValue EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
void PopCleanupBlock(bool FallThroughIsBranchThrough=false, bool ForDeactivation=false)
PopCleanupBlock - Will pop the cleanup entry on the stack and process all branch fixups.
llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
Definition CGStmt.cpp:640
llvm::Value * EmitCXXTypeidExpr(const CXXTypeidExpr *E)
llvm::Module & getModule() const
llvm::Constant * EmitNullConstantForBase(const CXXRecordDecl *Record)
Return a null constant appropriate for zero-initializing a base class with the given type.
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
const LangOptions & getLangOpts() const
const CodeGenOptions & getCodeGenOpts() const
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
llvm::ConstantInt * getSize(CharUnits numChars)
Emit the given number of characters as a value of type size_t.
llvm::Type * ConvertType(QualType T)
ConvertType - Convert type T into a llvm::Type.
CanQualType DeriveThisType(const CXXRecordDecl *RD, const CXXMethodDecl *MD)
Derives the 'this' type for codegen purposes, i.e.
Definition CGCall.cpp:129
const CGFunctionInfo & arrangeFreeFunctionCall(const CallArgList &Args, const FunctionType *Ty, bool ChainCall)
Figure out the rules for calling a function with the given formal type using the given arguments.
Definition CGCall.cpp:702
llvm::Constant * tryEmitAbstract(const Expr *E, QualType T)
Try to emit the result of the given expression as an abstract constant.
A saved depth on the scope stack.
T * pushCleanupWithExtra(CleanupKind Kind, size_t N, As... A)
Push a cleanup with non-constant storage requirements on the stack.
LValue - This represents an lvalue references.
Definition CGValue.h:183
Address getAddress() const
Definition CGValue.h:373
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Definition CGValue.h:42
static RValue get(llvm::Value *V)
Definition CGValue.h:99
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
Definition CGValue.h:126
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition CGValue.h:72
A class for recording the number of arguments that a function signature requires.
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
Definition CGCall.h:379
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3810
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
DeclarationName getCXXOperatorName(OverloadedOperatorKind Op)
Get the name of the overloadable C++ operator corresponding to Op.
The name of a declaration.
QualType getIntegerType() const
Return the integer type this enum decl corresponds to.
Definition Decl.h:4201
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Definition Expr.h:3958
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3662
This represents one expression.
Definition Expr.h:112
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3086
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
Definition Expr.cpp:3253
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:277
QualType getType() const
Definition Expr.h:144
Represents a function declaration or definition.
Definition Decl.h:2015
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition Decl.cpp:3552
QualType getReturnType() const
Definition Decl.h:2860
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2392
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions: void *operato...
Definition Decl.h:2609
UsualDeleteParams getUsualDeleteParams() const
Definition Decl.cpp:3568
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Definition Decl.cpp:3404
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2400
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4131
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5357
unsigned getNumParams() const
Definition TypeBase.h:5635
QualType getParamType(unsigned i) const
Definition TypeBase.h:5637
GlobalDecl - represents a global declaration.
Definition GlobalDecl.h:57
const Decl * getDecl() const
Definition GlobalDecl.h:106
Represents an implicitly-generated value initialization of an object of a given type.
Definition Expr.h:6060
Describes an C or C++ initializer list.
Definition Expr.h:5302
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
Definition Expr.cpp:2448
unsigned getNumInits() const
Definition Expr.h:5332
Expr * getArrayFiller()
If this initializer list initializes an array with more elements than there are initializers in the l...
Definition Expr.h:5404
const Expr * getInit(unsigned Init) const
Definition Expr.h:5356
ArrayRef< Expr * > inits()
Definition Expr.h:5352
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3367
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
Definition Expr.h:3478
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition Expr.h:3450
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
Definition Expr.h:3464
Expr * getBase() const
Definition Expr.h:3444
bool isArrow() const
Definition Expr.h:3551
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3703
QualType getPointeeType() const
Definition TypeBase.h:3721
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:441
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3378
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8515
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8557
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8471
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1444
QualType getCanonicalType() const
Definition TypeBase.h:8483
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition TypeBase.h:1551
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
Definition Type.cpp:2739
bool hasStrongOrWeakObjCLifetime() const
Definition TypeBase.h:1452
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
Definition TypeBase.h:361
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
Definition TypeBase.h:354
@ OCL_None
There is no lifetime qualification on this type.
Definition TypeBase.h:350
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Definition TypeBase.h:364
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
Definition TypeBase.h:367
LangAS getAddressSpace() const
Definition TypeBase.h:571
Represents a struct/union/class.
Definition Decl.h:4342
field_range fields() const
Definition Decl.h:4545
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition Decl.cpp:5361
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4530
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3623
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
Encodes a location in the source.
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1802
bool isUnion() const
Definition Decl.h:3943
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
bool isVoidPointerType() const
Definition Type.cpp:714
CXXRecordDecl * castAsCXXRecordDecl() const
Definition Type.h:36
bool isPointerType() const
Definition TypeBase.h:8668
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9328
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:754
EnumDecl * castAsEnumDecl() const
Definition Type.h:59
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
Definition TypeBase.h:9314
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2971
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9261
bool isRecordType() const
Definition TypeBase.h:8795
QualType getType() const
Definition Decl.h:723
QualType getType() const
Definition Value.cpp:237
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
Definition CGValue.h:155
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:146
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
Definition ABI.h:24
@ Ctor_Base
Base object ctor.
Definition ABI.h:26
@ Ctor_Complete
Complete object ctor.
Definition ABI.h:25
bool isa(CodeGen::Address addr)
Definition Address.h:330
AlignedAllocationMode alignedAllocationModeFromBool(bool IsAligned)
Definition ExprCXX.h:2270
bool isAlignedAllocation(AlignedAllocationMode Mode)
Definition ExprCXX.h:2266
AlignedAllocationMode
Definition ExprCXX.h:2264
@ Dtor_Complete
Complete object dtor.
Definition ABI.h:36
@ Type
The name was classified as a type.
Definition Sema.h:564
bool isTypeAwareAllocation(TypeAwareAllocationMode Mode)
Definition ExprCXX.h:2254
LangAS
Defines the address space values used by the address space qualifier of QualType.
TypeAwareAllocationMode
Definition ExprCXX.h:2252
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1288
U cast(CodeGen::Address addr)
Definition Address.h:327
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
A metaprogramming class for ensuring that a value will dominate an arbitrary position in a function.
static saved_type save(CodeGenFunction &CGF, type value)
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
Definition Sanitizers.h:187
TypeAwareAllocationMode TypeAwareDelete
Definition ExprCXX.h:2346
AlignedAllocationMode Alignment
Definition ExprCXX.h:2349