clang 22.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}
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 = getTargetHooks().performAddrSpaceCast(*this, This, SrcAS, 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
129 const CXXPseudoDestructorExpr *E) {
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
158 EmitARCRelease(Builder.CreateLoad(BaseValue,
159 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.
320 ? TrivialAssignmentRHS
321 : EmitLValue(*CE->arg_begin());
322 EmitAggregateAssign(This, RHS, CE->getType());
323 return RValue::get(This.getPointer(*this));
324 }
325
326 assert(MD->getParent()->mayInsertExtraPadding() &&
327 "unknown trivial member function");
328 }
329
330 // Compute the function type we're calling.
331 const CXXMethodDecl *CalleeDecl =
332 DevirtualizedMethod ? DevirtualizedMethod : MD;
333 const CGFunctionInfo *FInfo = nullptr;
334 if (const auto *Dtor = dyn_cast<CXXDestructorDecl>(CalleeDecl))
335 FInfo = &CGM.getTypes().arrangeCXXStructorDeclaration(
337 else
338 FInfo = &CGM.getTypes().arrangeCXXMethodDeclaration(CalleeDecl);
339
340 llvm::FunctionType *Ty = CGM.getTypes().GetFunctionType(*FInfo);
341
342 // C++11 [class.mfct.non-static]p2:
343 // If a non-static member function of a class X is called for an object that
344 // is not of type X, or of a type derived from X, the behavior is undefined.
345 SourceLocation CallLoc;
347 if (CE)
348 CallLoc = CE->getExprLoc();
349
350 SanitizerSet SkippedChecks;
351 if (const auto *CMCE = dyn_cast<CXXMemberCallExpr>(CE)) {
352 auto *IOA = CMCE->getImplicitObjectArgument();
353 bool IsImplicitObjectCXXThis = IsWrappedCXXThis(IOA);
354 if (IsImplicitObjectCXXThis)
355 SkippedChecks.set(SanitizerKind::Alignment, true);
356 if (IsImplicitObjectCXXThis || isa<DeclRefExpr>(IOA))
357 SkippedChecks.set(SanitizerKind::Null, true);
358 }
359
362 This.emitRawPointer(*this),
363 C.getCanonicalTagType(CalleeDecl->getParent()),
364 /*Alignment=*/CharUnits::Zero(), SkippedChecks);
365
366 // C++ [class.virtual]p12:
367 // Explicit qualification with the scope operator (5.1) suppresses the
368 // virtual call mechanism.
369 //
370 // We also don't emit a virtual call if the base expression has a record type
371 // because then we know what the type is.
372 bool UseVirtualCall = CanUseVirtualCall && !DevirtualizedMethod;
373
374 if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(CalleeDecl)) {
375 assert(CE->arguments().empty() &&
376 "Destructor shouldn't have explicit parameters");
377 assert(ReturnValue.isNull() && "Destructor shouldn't have return value");
378 if (UseVirtualCall) {
379 CGM.getCXXABI().EmitVirtualDestructorCall(
380 *this, Dtor, Dtor_Complete, This.getAddress(),
381 cast<CXXMemberCallExpr>(CE), CallOrInvoke);
382 } else {
383 GlobalDecl GD(Dtor, Dtor_Complete);
384 CGCallee Callee;
385 if (getLangOpts().AppleKext && Dtor->isVirtual() && HasQualifier)
386 Callee = BuildAppleKextVirtualCall(Dtor, Qualifier, Ty);
387 else if (!DevirtualizedMethod)
388 Callee =
389 CGCallee::forDirect(CGM.getAddrOfCXXStructor(GD, FInfo, Ty), GD);
390 else {
391 Callee = CGCallee::forDirect(CGM.GetAddrOfFunction(GD, Ty), GD);
392 }
393
394 QualType ThisTy =
395 IsArrow ? Base->getType()->getPointeeType() : Base->getType();
396 EmitCXXDestructorCall(GD, Callee, This.getPointer(*this), ThisTy,
397 /*ImplicitParam=*/nullptr,
398 /*ImplicitParamTy=*/QualType(), CE, CallOrInvoke);
399 }
400 return RValue::get(nullptr);
401 }
402
403 // FIXME: Uses of 'MD' past this point need to be audited. We may need to use
404 // 'CalleeDecl' instead.
405
406 CGCallee Callee;
407 if (UseVirtualCall) {
408 Callee = CGCallee::forVirtual(CE, MD, This.getAddress(), Ty);
409 } else {
410 if (SanOpts.has(SanitizerKind::CFINVCall) &&
411 MD->getParent()->isDynamicClass()) {
412 llvm::Value *VTable;
413 const CXXRecordDecl *RD;
414 std::tie(VTable, RD) = CGM.getCXXABI().LoadVTablePtr(
415 *this, This.getAddress(), CalleeDecl->getParent());
417 }
418
419 if (getLangOpts().AppleKext && MD->isVirtual() && HasQualifier)
420 Callee = BuildAppleKextVirtualCall(MD, Qualifier, Ty);
421 else if (!DevirtualizedMethod)
422 Callee =
423 CGCallee::forDirect(CGM.GetAddrOfFunction(MD, Ty), GlobalDecl(MD));
424 else {
425 Callee =
426 CGCallee::forDirect(CGM.GetAddrOfFunction(DevirtualizedMethod, Ty),
427 GlobalDecl(DevirtualizedMethod));
428 }
429 }
430
431 if (MD->isVirtual()) {
432 Address NewThisAddr =
433 CGM.getCXXABI().adjustThisArgumentForVirtualFunctionCall(
434 *this, CalleeDecl, This.getAddress(), UseVirtualCall);
435 This.setAddress(NewThisAddr);
436 }
437
439 CalleeDecl, Callee, ReturnValue, This.getPointer(*this),
440 /*ImplicitParam=*/nullptr, QualType(), CE, RtlArgs, CallOrInvoke);
441}
442
443RValue
446 llvm::CallBase **CallOrInvoke) {
447 const BinaryOperator *BO =
449 const Expr *BaseExpr = BO->getLHS();
450 const Expr *MemFnExpr = BO->getRHS();
451
452 const auto *MPT = MemFnExpr->getType()->castAs<MemberPointerType>();
453 const auto *FPT = MPT->getPointeeType()->castAs<FunctionProtoType>();
454 const auto *RD = MPT->getMostRecentCXXRecordDecl();
455
456 // Emit the 'this' pointer.
458 if (BO->getOpcode() == BO_PtrMemI)
459 This = EmitPointerWithAlignment(BaseExpr, nullptr, nullptr, KnownNonNull);
460 else
461 This = EmitLValue(BaseExpr, KnownNonNull).getAddress();
462
463 CanQualType ClassType = CGM.getContext().getCanonicalTagType(RD);
464 EmitTypeCheck(TCK_MemberCall, E->getExprLoc(), This.emitRawPointer(*this),
465 ClassType);
466
467 // Get the member function pointer.
468 llvm::Value *MemFnPtr = EmitScalarExpr(MemFnExpr);
469
470 // Ask the ABI to load the callee. Note that This is modified.
471 llvm::Value *ThisPtrForCall = nullptr;
472 CGCallee Callee =
473 CGM.getCXXABI().EmitLoadOfMemberFunctionPointer(*this, BO, This,
474 ThisPtrForCall, MemFnPtr, MPT);
475
476 CallArgList Args;
477
478 QualType ThisType = getContext().getPointerType(ClassType);
479
480 // Push the this ptr.
481 Args.add(RValue::get(ThisPtrForCall), ThisType);
482
484
485 // And the rest of the call args
486 EmitCallArgs(Args, FPT, E->arguments());
487 return EmitCall(CGM.getTypes().arrangeCXXMethodCall(Args, FPT, required,
488 /*PrefixSize=*/0),
489 Callee, ReturnValue, Args, CallOrInvoke, E == MustTailCall,
490 E->getExprLoc());
491}
492
494 const CXXOperatorCallExpr *E, const CXXMethodDecl *MD,
495 ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke) {
496 assert(MD->isImplicitObjectMemberFunction() &&
497 "Trying to emit a member call expr on a static method!");
499 E, MD, ReturnValue, /*HasQualifier=*/false, /*Qualifier=*/std::nullopt,
500 /*IsArrow=*/false, E->getArg(0), CallOrInvoke);
501}
502
505 llvm::CallBase **CallOrInvoke) {
506 return CGM.getCUDARuntime().EmitCUDAKernelCallExpr(*this, E, ReturnValue,
507 CallOrInvoke);
508}
509
511 Address DestPtr,
512 const CXXRecordDecl *Base) {
513 if (Base->isEmpty())
514 return;
515
516 DestPtr = DestPtr.withElementType(CGF.Int8Ty);
517
518 const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
519 CharUnits NVSize = Layout.getNonVirtualSize();
520
521 // We cannot simply zero-initialize the entire base sub-object if vbptrs are
522 // present, they are initialized by the most derived class before calling the
523 // constructor.
525 Stores.emplace_back(CharUnits::Zero(), NVSize);
526
527 // Each store is split by the existence of a vbptr.
528 CharUnits VBPtrWidth = CGF.getPointerSize();
529 std::vector<CharUnits> VBPtrOffsets =
531 for (CharUnits VBPtrOffset : VBPtrOffsets) {
532 // Stop before we hit any virtual base pointers located in virtual bases.
533 if (VBPtrOffset >= NVSize)
534 break;
535 std::pair<CharUnits, CharUnits> LastStore = Stores.pop_back_val();
536 CharUnits LastStoreOffset = LastStore.first;
537 CharUnits LastStoreSize = LastStore.second;
538
539 CharUnits SplitBeforeOffset = LastStoreOffset;
540 CharUnits SplitBeforeSize = VBPtrOffset - SplitBeforeOffset;
541 assert(!SplitBeforeSize.isNegative() && "negative store size!");
542 if (!SplitBeforeSize.isZero())
543 Stores.emplace_back(SplitBeforeOffset, SplitBeforeSize);
544
545 CharUnits SplitAfterOffset = VBPtrOffset + VBPtrWidth;
546 CharUnits SplitAfterSize = LastStoreSize - SplitAfterOffset;
547 assert(!SplitAfterSize.isNegative() && "negative store size!");
548 if (!SplitAfterSize.isZero())
549 Stores.emplace_back(SplitAfterOffset, SplitAfterSize);
550 }
551
552 // If the type contains a pointer to data member we can't memset it to zero.
553 // Instead, create a null constant and copy it to the destination.
554 // TODO: there are other patterns besides zero that we can usefully memset,
555 // like -1, which happens to be the pattern used by member-pointers.
556 // TODO: isZeroInitializable can be over-conservative in the case where a
557 // virtual base contains a member pointer.
558 llvm::Constant *NullConstantForBase = CGF.CGM.EmitNullConstantForBase(Base);
559 if (!NullConstantForBase->isNullValue()) {
560 llvm::GlobalVariable *NullVariable = new llvm::GlobalVariable(
561 CGF.CGM.getModule(), NullConstantForBase->getType(),
562 /*isConstant=*/true, llvm::GlobalVariable::PrivateLinkage,
563 NullConstantForBase, Twine());
564
565 CharUnits Align =
566 std::max(Layout.getNonVirtualAlignment(), DestPtr.getAlignment());
567 NullVariable->setAlignment(Align.getAsAlign());
568
569 Address SrcPtr(NullVariable, CGF.Int8Ty, Align);
570
571 // Get and call the appropriate llvm.memcpy overload.
572 for (std::pair<CharUnits, CharUnits> Store : Stores) {
573 CharUnits StoreOffset = Store.first;
574 CharUnits StoreSize = Store.second;
575 llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
577 CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
578 CGF.Builder.CreateConstInBoundsByteGEP(SrcPtr, StoreOffset),
579 StoreSizeVal);
580 }
581
582 // Otherwise, just memset the whole thing to zero. This is legal
583 // because in LLVM, all default initializers (other than the ones we just
584 // handled above) are guaranteed to have a bit pattern of all zeros.
585 } else {
586 for (std::pair<CharUnits, CharUnits> Store : Stores) {
587 CharUnits StoreOffset = Store.first;
588 CharUnits StoreSize = Store.second;
589 llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
591 CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
592 CGF.Builder.getInt8(0), StoreSizeVal);
593 }
594 }
595}
596
597void
599 AggValueSlot Dest) {
600 assert(!Dest.isIgnored() && "Must have a destination!");
601 const CXXConstructorDecl *CD = E->getConstructor();
602
603 // If we require zero initialization before (or instead of) calling the
604 // constructor, as can be the case with a non-user-provided default
605 // constructor, emit the zero initialization now, unless destination is
606 // already zeroed.
607 if (E->requiresZeroInitialization() && !Dest.isZeroed()) {
608 switch (E->getConstructionKind()) {
612 break;
616 CD->getParent());
617 break;
618 }
619 }
620
621 // If this is a call to a trivial default constructor, do nothing.
622 if (CD->isTrivial() && CD->isDefaultConstructor())
623 return;
624
625 // Elide the constructor if we're constructing from a temporary.
626 if (getLangOpts().ElideConstructors && E->isElidable()) {
627 // FIXME: This only handles the simplest case, where the source object
628 // is passed directly as the first argument to the constructor.
629 // This should also handle stepping though implicit casts and
630 // conversion sequences which involve two steps, with a
631 // conversion operator followed by a converting constructor.
632 const Expr *SrcObj = E->getArg(0);
633 assert(SrcObj->isTemporaryObject(getContext(), CD->getParent()));
634 assert(
635 getContext().hasSameUnqualifiedType(E->getType(), SrcObj->getType()));
636 EmitAggExpr(SrcObj, Dest);
637 return;
638 }
639
640 if (const ArrayType *arrayType
641 = 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 = llvm::ConstantInt::get(CGF.SizeTy,
796 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(numElements,
863 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(numElements,
876 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(hasOverflow,
882 CGF.Builder.CreateICmpULT(numElements,
883 llvm::ConstantInt::get(CGF.SizeTy, minElements)));
884 }
885 }
886
887 size = numElements;
888
889 // Multiply by the type size if necessary. This multiplier
890 // includes all the factors for nested arrays.
891 //
892 // This step also causes numElements to be scaled up by the
893 // nested-array factor if necessary. Overflow on this computation
894 // can be ignored because the result shouldn't be used if
895 // allocation fails.
896 if (typeSizeMultiplier != 1) {
897 llvm::Function *umul_with_overflow
898 = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
899
900 llvm::Value *tsmV =
901 llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
902 llvm::Value *result =
903 CGF.Builder.CreateCall(umul_with_overflow, {size, tsmV});
904
905 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
906 if (hasOverflow)
907 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
908 else
909 hasOverflow = overflowed;
910
911 size = CGF.Builder.CreateExtractValue(result, 0);
912
913 // Also scale up numElements by the array size multiplier.
914 if (arraySizeMultiplier != 1) {
915 // If the base element type size is 1, then we can re-use the
916 // multiply we just did.
917 if (typeSize.isOne()) {
918 assert(arraySizeMultiplier == typeSizeMultiplier);
919 numElements = size;
920
921 // Otherwise we need a separate multiply.
922 } else {
923 llvm::Value *asmV =
924 llvm::ConstantInt::get(CGF.SizeTy, arraySizeMultiplier);
925 numElements = CGF.Builder.CreateMul(numElements, asmV);
926 }
927 }
928 } else {
929 // numElements doesn't need to be scaled.
930 assert(arraySizeMultiplier == 1);
931 }
932
933 // Add in the cookie size if necessary.
934 if (cookieSize != 0) {
935 sizeWithoutCookie = size;
936
937 llvm::Function *uadd_with_overflow
938 = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
939
940 llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
941 llvm::Value *result =
942 CGF.Builder.CreateCall(uadd_with_overflow, {size, cookieSizeV});
943
944 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
945 if (hasOverflow)
946 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
947 else
948 hasOverflow = overflowed;
949
950 size = CGF.Builder.CreateExtractValue(result, 0);
951 }
952
953 // If we had any possibility of dynamic overflow, make a select to
954 // overwrite 'size' with an all-ones value, which should cause
955 // operator new to throw.
956 if (hasOverflow)
957 size = CGF.Builder.CreateSelect(hasOverflow,
958 llvm::Constant::getAllOnesValue(CGF.SizeTy),
959 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,
977 CGF.MakeAddrLValue(NewPtr, AllocType), false);
978 return;
979 case TEK_Complex:
980 CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType),
981 /*isInit*/ true);
982 return;
983 case TEK_Aggregate: {
984 AggValueSlot Slot
985 = AggValueSlot::forAddr(NewPtr, AllocType.getQualifiers(),
989 MayOverlap, AggValueSlot::IsNotZeroed,
991 CGF.EmitAggExpr(Init, Slot);
992 return;
993 }
994 }
995 llvm_unreachable("bad evaluation kind");
996}
997
999 const CXXNewExpr *E, QualType ElementType, llvm::Type *ElementTy,
1000 Address BeginPtr, llvm::Value *NumElements,
1001 llvm::Value *AllocSizeWithoutCookie) {
1002 // If we have a type with trivial initialization and no initializer,
1003 // there's nothing to do.
1004 if (!E->hasInitializer())
1005 return;
1006
1007 Address CurPtr = BeginPtr;
1008
1009 unsigned InitListElements = 0;
1010
1011 const Expr *Init = E->getInitializer();
1012 Address EndOfInit = Address::invalid();
1013 QualType::DestructionKind DtorKind = ElementType.isDestructedType();
1014 CleanupDeactivationScope deactivation(*this);
1015 bool pushedCleanup = false;
1016
1017 CharUnits ElementSize = getContext().getTypeSizeInChars(ElementType);
1018 CharUnits ElementAlign =
1019 BeginPtr.getAlignment().alignmentOfArrayElement(ElementSize);
1020
1021 // Attempt to perform zero-initialization using memset.
1022 auto TryMemsetInitialization = [&]() -> bool {
1023 // FIXME: If the type is a pointer-to-data-member under the Itanium ABI,
1024 // we can initialize with a memset to -1.
1025 if (!CGM.getTypes().isZeroInitializable(ElementType))
1026 return false;
1027
1028 // Optimization: since zero initialization will just set the memory
1029 // to all zeroes, generate a single memset to do it in one shot.
1030
1031 // Subtract out the size of any elements we've already initialized.
1032 auto *RemainingSize = AllocSizeWithoutCookie;
1033 if (InitListElements) {
1034 // We know this can't overflow; we check this when doing the allocation.
1035 auto *InitializedSize = llvm::ConstantInt::get(
1036 RemainingSize->getType(),
1037 getContext().getTypeSizeInChars(ElementType).getQuantity() *
1038 InitListElements);
1039 RemainingSize = Builder.CreateSub(RemainingSize, InitializedSize);
1040 }
1041
1042 // Create the memset.
1043 Builder.CreateMemSet(CurPtr, Builder.getInt8(0), RemainingSize, false);
1044 return true;
1045 };
1046
1047 const InitListExpr *ILE = dyn_cast<InitListExpr>(Init);
1048 const CXXParenListInitExpr *CPLIE = nullptr;
1049 const StringLiteral *SL = nullptr;
1050 const ObjCEncodeExpr *OCEE = nullptr;
1051 const Expr *IgnoreParen = nullptr;
1052 if (!ILE) {
1053 IgnoreParen = Init->IgnoreParenImpCasts();
1054 CPLIE = dyn_cast<CXXParenListInitExpr>(IgnoreParen);
1055 SL = dyn_cast<StringLiteral>(IgnoreParen);
1056 OCEE = dyn_cast<ObjCEncodeExpr>(IgnoreParen);
1057 }
1058
1059 // If the initializer is an initializer list, first do the explicit elements.
1060 if (ILE || CPLIE || SL || OCEE) {
1061 // Initializing from a (braced) string literal is a special case; the init
1062 // list element does not initialize a (single) array element.
1063 if ((ILE && ILE->isStringLiteralInit()) || SL || OCEE) {
1064 if (!ILE)
1065 Init = IgnoreParen;
1066 // Initialize the initial portion of length equal to that of the string
1067 // literal. The allocation must be for at least this much; we emitted a
1068 // check for that earlier.
1069 AggValueSlot Slot =
1070 AggValueSlot::forAddr(CurPtr, ElementType.getQualifiers(),
1077 EmitAggExpr(ILE ? ILE->getInit(0) : Init, Slot);
1078
1079 // Move past these elements.
1080 InitListElements =
1081 cast<ConstantArrayType>(Init->getType()->getAsArrayTypeUnsafe())
1082 ->getZExtSize();
1083 CurPtr = Builder.CreateConstInBoundsGEP(
1084 CurPtr, InitListElements, "string.init.end");
1085
1086 // Zero out the rest, if any remain.
1087 llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);
1088 if (!ConstNum || !ConstNum->equalsInt(InitListElements)) {
1089 bool OK = TryMemsetInitialization();
1090 (void)OK;
1091 assert(OK && "couldn't memset character type?");
1092 }
1093 return;
1094 }
1095
1096 ArrayRef<const Expr *> InitExprs =
1097 ILE ? ILE->inits() : CPLIE->getInitExprs();
1098 InitListElements = InitExprs.size();
1099
1100 // If this is a multi-dimensional array new, we will initialize multiple
1101 // elements with each init list element.
1102 QualType AllocType = E->getAllocatedType();
1103 if (const ConstantArrayType *CAT = dyn_cast_or_null<ConstantArrayType>(
1104 AllocType->getAsArrayTypeUnsafe())) {
1105 ElementTy = ConvertTypeForMem(AllocType);
1106 CurPtr = CurPtr.withElementType(ElementTy);
1107 InitListElements *= getContext().getConstantArrayElementCount(CAT);
1108 }
1109
1110 // Enter a partial-destruction Cleanup if necessary.
1111 if (DtorKind) {
1112 AllocaTrackerRAII AllocaTracker(*this);
1113 // In principle we could tell the Cleanup where we are more
1114 // directly, but the control flow can get so varied here that it
1115 // would actually be quite complex. Therefore we go through an
1116 // alloca.
1117 llvm::Instruction *DominatingIP =
1118 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(Int8PtrTy));
1119 EndOfInit = CreateTempAlloca(BeginPtr.getType(), getPointerAlign(),
1120 "array.init.end");
1122 EndOfInit, ElementType, ElementAlign,
1123 getDestroyer(DtorKind));
1124 cast<EHCleanupScope>(*EHStack.find(EHStack.stable_begin()))
1125 .AddAuxAllocas(AllocaTracker.Take());
1127 {EHStack.stable_begin(), DominatingIP});
1128 pushedCleanup = true;
1129 }
1130
1131 CharUnits StartAlign = CurPtr.getAlignment();
1132 unsigned i = 0;
1133 for (const Expr *IE : InitExprs) {
1134 // Tell the cleanup that it needs to destroy up to this
1135 // element. TODO: some of these stores can be trivially
1136 // observed to be unnecessary.
1137 if (EndOfInit.isValid()) {
1138 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1139 }
1140 // FIXME: If the last initializer is an incomplete initializer list for
1141 // an array, and we have an array filler, we can fold together the two
1142 // initialization loops.
1143 StoreAnyExprIntoOneUnit(*this, IE, IE->getType(), CurPtr,
1145 CurPtr = Address(Builder.CreateInBoundsGEP(CurPtr.getElementType(),
1146 CurPtr.emitRawPointer(*this),
1147 Builder.getSize(1),
1148 "array.exp.next"),
1149 CurPtr.getElementType(),
1150 StartAlign.alignmentAtOffset((++i) * ElementSize));
1151 }
1152
1153 // The remaining elements are filled with the array filler expression.
1154 Init = ILE ? ILE->getArrayFiller() : CPLIE->getArrayFiller();
1155
1156 // Extract the initializer for the individual array elements by pulling
1157 // out the array filler from all the nested initializer lists. This avoids
1158 // generating a nested loop for the initialization.
1159 while (Init && Init->getType()->isConstantArrayType()) {
1160 auto *SubILE = dyn_cast<InitListExpr>(Init);
1161 if (!SubILE)
1162 break;
1163 assert(SubILE->getNumInits() == 0 && "explicit inits in array filler?");
1164 Init = SubILE->getArrayFiller();
1165 }
1166
1167 // Switch back to initializing one base element at a time.
1168 CurPtr = CurPtr.withElementType(BeginPtr.getElementType());
1169 }
1170
1171 // If all elements have already been initialized, skip any further
1172 // initialization.
1173 llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);
1174 if (ConstNum && ConstNum->getZExtValue() <= InitListElements) {
1175 return;
1176 }
1177
1178 assert(Init && "have trailing elements to initialize but no initializer");
1179
1180 // If this is a constructor call, try to optimize it out, and failing that
1181 // emit a single loop to initialize all remaining elements.
1182 if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) {
1183 CXXConstructorDecl *Ctor = CCE->getConstructor();
1184 if (Ctor->isTrivial()) {
1185 // If new expression did not specify value-initialization, then there
1186 // is no initialization.
1187 if (!CCE->requiresZeroInitialization() || Ctor->getParent()->isEmpty())
1188 return;
1189
1190 if (TryMemsetInitialization())
1191 return;
1192 }
1193
1194 // Store the new Cleanup position for irregular Cleanups.
1195 //
1196 // FIXME: Share this cleanup with the constructor call emission rather than
1197 // having it create a cleanup of its own.
1198 if (EndOfInit.isValid())
1199 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1200
1201 // Emit a constructor call loop to initialize the remaining elements.
1202 if (InitListElements)
1203 NumElements = Builder.CreateSub(
1204 NumElements,
1205 llvm::ConstantInt::get(NumElements->getType(), InitListElements));
1206 EmitCXXAggrConstructorCall(Ctor, NumElements, CurPtr, CCE,
1207 /*NewPointerIsChecked*/true,
1208 CCE->requiresZeroInitialization());
1209 return;
1210 }
1211
1212 // If this is value-initialization, we can usually use memset.
1213 ImplicitValueInitExpr IVIE(ElementType);
1215 if (TryMemsetInitialization())
1216 return;
1217
1218 // Switch to an ImplicitValueInitExpr for the element type. This handles
1219 // only one case: multidimensional array new of pointers to members. In
1220 // all other cases, we already have an initializer for the array element.
1221 Init = &IVIE;
1222 }
1223
1224 // At this point we should have found an initializer for the individual
1225 // elements of the array.
1226 assert(getContext().hasSameUnqualifiedType(ElementType, Init->getType()) &&
1227 "got wrong type of element to initialize");
1228
1229 // If we have an empty initializer list, we can usually use memset.
1230 if (auto *ILE = dyn_cast<InitListExpr>(Init))
1231 if (ILE->getNumInits() == 0 && TryMemsetInitialization())
1232 return;
1233
1234 // If we have a struct whose every field is value-initialized, we can
1235 // usually use memset.
1236 if (auto *ILE = dyn_cast<InitListExpr>(Init)) {
1237 if (const RecordType *RType =
1238 ILE->getType()->getAsCanonical<RecordType>()) {
1239 if (RType->getOriginalDecl()->isStruct()) {
1240 const RecordDecl *RD = RType->getOriginalDecl()->getDefinitionOrSelf();
1241 unsigned NumElements = 0;
1242 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1243 NumElements = CXXRD->getNumBases();
1244 for (auto *Field : RD->fields())
1245 if (!Field->isUnnamedBitField())
1246 ++NumElements;
1247 // FIXME: Recurse into nested InitListExprs.
1248 if (ILE->getNumInits() == NumElements)
1249 for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i)
1250 if (!isa<ImplicitValueInitExpr>(ILE->getInit(i)))
1251 --NumElements;
1252 if (ILE->getNumInits() == NumElements && TryMemsetInitialization())
1253 return;
1254 }
1255 }
1256 }
1257
1258 // Create the loop blocks.
1259 llvm::BasicBlock *EntryBB = Builder.GetInsertBlock();
1260 llvm::BasicBlock *LoopBB = createBasicBlock("new.loop");
1261 llvm::BasicBlock *ContBB = createBasicBlock("new.loop.end");
1262
1263 // Find the end of the array, hoisted out of the loop.
1264 llvm::Value *EndPtr = Builder.CreateInBoundsGEP(
1265 BeginPtr.getElementType(), BeginPtr.emitRawPointer(*this), NumElements,
1266 "array.end");
1267
1268 // If the number of elements isn't constant, we have to now check if there is
1269 // anything left to initialize.
1270 if (!ConstNum) {
1271 llvm::Value *IsEmpty = Builder.CreateICmpEQ(CurPtr.emitRawPointer(*this),
1272 EndPtr, "array.isempty");
1273 Builder.CreateCondBr(IsEmpty, ContBB, LoopBB);
1274 }
1275
1276 // Enter the loop.
1277 EmitBlock(LoopBB);
1278
1279 // Set up the current-element phi.
1280 llvm::PHINode *CurPtrPhi =
1281 Builder.CreatePHI(CurPtr.getType(), 2, "array.cur");
1282 CurPtrPhi->addIncoming(CurPtr.emitRawPointer(*this), EntryBB);
1283
1284 CurPtr = Address(CurPtrPhi, CurPtr.getElementType(), ElementAlign);
1285
1286 // Store the new Cleanup position for irregular Cleanups.
1287 if (EndOfInit.isValid())
1288 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1289
1290 // Enter a partial-destruction Cleanup if necessary.
1291 if (!pushedCleanup && needsEHCleanup(DtorKind)) {
1292 llvm::Instruction *DominatingIP =
1293 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(Int8PtrTy));
1295 CurPtr.emitRawPointer(*this), ElementType,
1296 ElementAlign, getDestroyer(DtorKind));
1298 {EHStack.stable_begin(), DominatingIP});
1299 }
1300
1301 // Emit the initializer into this element.
1302 StoreAnyExprIntoOneUnit(*this, Init, Init->getType(), CurPtr,
1304
1305 // Leave the Cleanup if we entered one.
1306 deactivation.ForceDeactivate();
1307
1308 // Advance to the next element by adjusting the pointer type as necessary.
1309 llvm::Value *NextPtr = Builder.CreateConstInBoundsGEP1_32(
1310 ElementTy, CurPtr.emitRawPointer(*this), 1, "array.next");
1311
1312 // Check whether we've gotten to the end of the array and, if so,
1313 // exit the loop.
1314 llvm::Value *IsEnd = Builder.CreateICmpEQ(NextPtr, EndPtr, "array.atend");
1315 Builder.CreateCondBr(IsEnd, ContBB, LoopBB);
1316 CurPtrPhi->addIncoming(NextPtr, Builder.GetInsertBlock());
1317
1318 EmitBlock(ContBB);
1319}
1320
1322 QualType ElementType, llvm::Type *ElementTy,
1323 Address NewPtr, llvm::Value *NumElements,
1324 llvm::Value *AllocSizeWithoutCookie) {
1325 ApplyDebugLocation DL(CGF, E);
1326 if (E->isArray())
1327 CGF.EmitNewArrayInitializer(E, ElementType, ElementTy, NewPtr, NumElements,
1328 AllocSizeWithoutCookie);
1329 else if (const Expr *Init = E->getInitializer())
1332}
1333
1334/// Emit a call to an operator new or operator delete function, as implicitly
1335/// created by new-expressions and delete-expressions.
1337 const FunctionDecl *CalleeDecl,
1338 const FunctionProtoType *CalleeType,
1339 const CallArgList &Args) {
1340 llvm::CallBase *CallOrInvoke;
1341 llvm::Constant *CalleePtr = CGF.CGM.GetAddrOfFunction(CalleeDecl);
1342 CGCallee Callee = CGCallee::forDirect(CalleePtr, GlobalDecl(CalleeDecl));
1343 RValue RV =
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() &&
1355 Fn && 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();
1370 .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.
1391 template<typename Traits>
1392 class 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
1415 public:
1416 static size_t getExtraSize(size_t NumPlacementArgs) {
1417 return NumPlacementArgs * sizeof(PlacementArg);
1418 }
1419
1420 CallDeleteDuringNew(size_t NumPlacementArgs,
1421 const FunctionDecl *OperatorDelete,
1422 RValueTy TypeIdentity, ValueTy Ptr, ValueTy AllocSize,
1423 const ImplicitAllocationParameters &IAP,
1424 CharUnits AllocAlign)
1425 : NumPlacementArgs(NumPlacementArgs),
1426 PassAlignmentToPlacementDelete(
1427 isAlignedAllocation(IAP.PassAlignment)),
1428 OperatorDelete(OperatorDelete), TypeIdentity(TypeIdentity), Ptr(Ptr),
1429 AllocSize(AllocSize), AllocAlign(AllocAlign) {}
1430
1431 void setPlacementArg(unsigned I, RValueTy Arg, QualType Type) {
1432 assert(I < NumPlacementArgs && "index out of range");
1433 getPlacementArgs()[I] = {Arg, Type};
1434 }
1435
1436 void Emit(CodeGenFunction &CGF, Flags flags) override {
1437 const auto *FPT = OperatorDelete->getType()->castAs<FunctionProtoType>();
1438 CallArgList DeleteArgs;
1439 unsigned FirstNonTypeArg = 0;
1440 TypeAwareAllocationMode TypeAwareDeallocation =
1441 TypeAwareAllocationMode::No;
1442 if (OperatorDelete->isTypeAwareOperatorNewOrDelete()) {
1443 TypeAwareDeallocation = TypeAwareAllocationMode::Yes;
1444 QualType SpecializedTypeIdentity = FPT->getParamType(0);
1445 ++FirstNonTypeArg;
1446 DeleteArgs.add(Traits::get(CGF, TypeIdentity), SpecializedTypeIdentity);
1447 }
1448 // The first argument after type-identity parameter (if any) is always
1449 // a void* (or C* for a destroying operator delete for class type C).
1450 DeleteArgs.add(Traits::get(CGF, Ptr), FPT->getParamType(FirstNonTypeArg));
1451
1452 // Figure out what other parameters we should be implicitly passing.
1453 UsualDeleteParams Params;
1454 if (NumPlacementArgs) {
1455 // A placement deallocation function is implicitly passed an alignment
1456 // if the placement allocation function was, but is never passed a size.
1457 Params.Alignment =
1458 alignedAllocationModeFromBool(PassAlignmentToPlacementDelete);
1459 Params.TypeAwareDelete = TypeAwareDeallocation;
1461 } else {
1462 // For a non-placement new-expression, 'operator delete' can take a
1463 // size and/or an alignment if it has the right parameters.
1464 Params = OperatorDelete->getUsualDeleteParams();
1465 }
1466
1467 assert(!Params.DestroyingDelete &&
1468 "should not call destroying delete in a new-expression");
1469
1470 // The second argument can be a std::size_t (for non-placement delete).
1471 if (Params.Size)
1472 DeleteArgs.add(Traits::get(CGF, AllocSize),
1473 CGF.getContext().getSizeType());
1474
1475 // The next (second or third) argument can be a std::align_val_t, which
1476 // is an enum whose underlying type is std::size_t.
1477 // FIXME: Use the right type as the parameter type. Note that in a call
1478 // to operator delete(size_t, ...), we may not have it available.
1479 if (isAlignedAllocation(Params.Alignment))
1480 DeleteArgs.add(RValue::get(llvm::ConstantInt::get(
1481 CGF.SizeTy, AllocAlign.getQuantity())),
1482 CGF.getContext().getSizeType());
1483
1484 // Pass the rest of the arguments, which must match exactly.
1485 for (unsigned I = 0; I != NumPlacementArgs; ++I) {
1486 auto Arg = getPlacementArgs()[I];
1487 DeleteArgs.add(Traits::get(CGF, Arg.ArgValue), Arg.ArgType);
1488 }
1489
1490 // Call 'operator delete'.
1491 EmitNewDeleteCall(CGF, OperatorDelete, FPT, DeleteArgs);
1492 }
1493 };
1494}
1495
1496/// Enter a cleanup to call 'operator delete' if the initializer in a
1497/// new-expression throws.
1499 RValue TypeIdentity, Address NewPtr,
1500 llvm::Value *AllocSize, CharUnits AllocAlign,
1501 const CallArgList &NewArgs) {
1502 unsigned NumNonPlacementArgs = E->getNumImplicitArgs();
1503
1504 // If we're not inside a conditional branch, then the cleanup will
1505 // dominate and we can do the easier (and more efficient) thing.
1506 if (!CGF.isInConditionalBranch()) {
1507 struct DirectCleanupTraits {
1508 typedef llvm::Value *ValueTy;
1509 typedef RValue RValueTy;
1510 static RValue get(CodeGenFunction &, ValueTy V) { return RValue::get(V); }
1511 static RValue get(CodeGenFunction &, RValueTy V) { return V; }
1512 };
1513
1514 typedef CallDeleteDuringNew<DirectCleanupTraits> DirectCleanup;
1515
1516 DirectCleanup *Cleanup = CGF.EHStack.pushCleanupWithExtra<DirectCleanup>(
1518 TypeIdentity, NewPtr.emitRawPointer(CGF), AllocSize,
1519 E->implicitAllocationParameters(), AllocAlign);
1520 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1521 auto &Arg = NewArgs[I + NumNonPlacementArgs];
1522 Cleanup->setPlacementArg(I, Arg.getRValue(CGF), Arg.Ty);
1523 }
1524
1525 return;
1526 }
1527
1528 // Otherwise, we need to save all this stuff.
1530 DominatingValue<RValue>::save(CGF, RValue::get(NewPtr, CGF));
1533 DominatingValue<RValue>::saved_type SavedTypeIdentity =
1534 DominatingValue<RValue>::save(CGF, TypeIdentity);
1535 struct ConditionalCleanupTraits {
1537 typedef DominatingValue<RValue>::saved_type RValueTy;
1538 static RValue get(CodeGenFunction &CGF, ValueTy V) {
1539 return V.restore(CGF);
1540 }
1541 };
1542 typedef CallDeleteDuringNew<ConditionalCleanupTraits> ConditionalCleanup;
1543
1544 ConditionalCleanup *Cleanup =
1545 CGF.EHStack.pushCleanupWithExtra<ConditionalCleanup>(
1547 SavedTypeIdentity, SavedNewPtr, SavedAllocSize,
1548 E->implicitAllocationParameters(), AllocAlign);
1549 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1550 auto &Arg = NewArgs[I + NumNonPlacementArgs];
1551 Cleanup->setPlacementArg(
1552 I, DominatingValue<RValue>::save(CGF, Arg.getRValue(CGF)), Arg.Ty);
1553 }
1554
1555 CGF.initFullExprCleanup();
1556}
1557
1559 // The element type being allocated.
1561
1562 // 1. Build a call to the allocation function.
1563 FunctionDecl *allocator = E->getOperatorNew();
1564
1565 // If there is a brace-initializer or C++20 parenthesized initializer, cannot
1566 // allocate fewer elements than inits.
1567 unsigned minElements = 0;
1568 unsigned IndexOfAlignArg = 1;
1569 if (E->isArray() && E->hasInitializer()) {
1570 const Expr *Init = E->getInitializer();
1571 const InitListExpr *ILE = dyn_cast<InitListExpr>(Init);
1572 const CXXParenListInitExpr *CPLIE = dyn_cast<CXXParenListInitExpr>(Init);
1573 const Expr *IgnoreParen = Init->IgnoreParenImpCasts();
1574 if ((ILE && ILE->isStringLiteralInit()) ||
1575 isa<StringLiteral>(IgnoreParen) || isa<ObjCEncodeExpr>(IgnoreParen)) {
1576 minElements =
1577 cast<ConstantArrayType>(Init->getType()->getAsArrayTypeUnsafe())
1578 ->getZExtSize();
1579 } else if (ILE || CPLIE) {
1580 minElements = ILE ? ILE->getNumInits() : CPLIE->getInitExprs().size();
1581 }
1582 }
1583
1584 llvm::Value *numElements = nullptr;
1585 llvm::Value *allocSizeWithoutCookie = nullptr;
1586 llvm::Value *allocSize =
1587 EmitCXXNewAllocSize(*this, E, minElements, numElements,
1588 allocSizeWithoutCookie);
1589 CharUnits allocAlign = getContext().getTypeAlignInChars(allocType);
1590
1591 // Emit the allocation call. If the allocator is a global placement
1592 // operator, just "inline" it directly.
1593 Address allocation = Address::invalid();
1594 CallArgList allocatorArgs;
1595 RValue TypeIdentityArg;
1596 if (allocator->isReservedGlobalPlacementOperator()) {
1597 assert(E->getNumPlacementArgs() == 1);
1598 const Expr *arg = *E->placement_arguments().begin();
1599
1600 LValueBaseInfo BaseInfo;
1601 allocation = EmitPointerWithAlignment(arg, &BaseInfo);
1602
1603 // The pointer expression will, in many cases, be an opaque void*.
1604 // In these cases, discard the computed alignment and use the
1605 // formal alignment of the allocated type.
1606 if (BaseInfo.getAlignmentSource() != AlignmentSource::Decl)
1607 allocation.setAlignment(allocAlign);
1608
1609 // Set up allocatorArgs for the call to operator delete if it's not
1610 // the reserved global operator.
1611 if (E->getOperatorDelete() &&
1613 allocatorArgs.add(RValue::get(allocSize), getContext().getSizeType());
1614 allocatorArgs.add(RValue::get(allocation, *this), arg->getType());
1615 }
1616
1617 } else {
1618 const FunctionProtoType *allocatorType =
1619 allocator->getType()->castAs<FunctionProtoType>();
1621 unsigned ParamsToSkip = 0;
1622 if (isTypeAwareAllocation(IAP.PassTypeIdentity)) {
1623 QualType SpecializedTypeIdentity = allocatorType->getParamType(0);
1624 CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr,
1625 SourceLocation());
1626 TypeIdentityArg = EmitAnyExprToTemp(&TypeIdentityParam);
1627 allocatorArgs.add(TypeIdentityArg, SpecializedTypeIdentity);
1628 ++ParamsToSkip;
1629 ++IndexOfAlignArg;
1630 }
1631 // The allocation size is the first argument.
1632 QualType sizeType = getContext().getSizeType();
1633 allocatorArgs.add(RValue::get(allocSize), sizeType);
1634 ++ParamsToSkip;
1635
1636 if (allocSize != allocSizeWithoutCookie) {
1637 CharUnits cookieAlign = getSizeAlign(); // FIXME: Ask the ABI.
1638 allocAlign = std::max(allocAlign, cookieAlign);
1639 }
1640
1641 // The allocation alignment may be passed as the second argument.
1642 if (isAlignedAllocation(IAP.PassAlignment)) {
1643 QualType AlignValT = sizeType;
1644 if (allocatorType->getNumParams() > IndexOfAlignArg) {
1645 AlignValT = allocatorType->getParamType(IndexOfAlignArg);
1646 assert(getContext().hasSameUnqualifiedType(
1647 AlignValT->castAsEnumDecl()->getIntegerType(), sizeType) &&
1648 "wrong type for alignment parameter");
1649 ++ParamsToSkip;
1650 } else {
1651 // Corner case, passing alignment to 'operator new(size_t, ...)'.
1652 assert(allocator->isVariadic() && "can't pass alignment to allocator");
1653 }
1654 allocatorArgs.add(
1655 RValue::get(llvm::ConstantInt::get(SizeTy, allocAlign.getQuantity())),
1656 AlignValT);
1657 }
1658
1659 // FIXME: Why do we not pass a CalleeDecl here?
1660 EmitCallArgs(allocatorArgs, allocatorType, E->placement_arguments(),
1661 /*AC*/AbstractCallee(), /*ParamsToSkip*/ParamsToSkip);
1662
1663 RValue RV =
1664 EmitNewDeleteCall(*this, allocator, allocatorType, allocatorArgs);
1665
1666 if (auto *newCall = dyn_cast<llvm::CallBase>(RV.getScalarVal())) {
1667 if (auto *CGDI = getDebugInfo()) {
1668 // Set !heapallocsite metadata on the call to operator new.
1669 CGDI->addHeapAllocSiteMetadata(newCall, allocType, E->getExprLoc());
1670 }
1671 if (SanOpts.has(SanitizerKind::AllocToken)) {
1672 // Set !alloc_token metadata.
1673 EmitAllocToken(newCall, allocType);
1674 }
1675 }
1676
1677 // If this was a call to a global replaceable allocation function that does
1678 // not take an alignment argument, the allocator is known to produce
1679 // storage that's suitably aligned for any object that fits, up to a known
1680 // threshold. Otherwise assume it's suitably aligned for the allocated type.
1681 CharUnits allocationAlign = allocAlign;
1682 if (!E->passAlignment() &&
1683 allocator->isReplaceableGlobalAllocationFunction()) {
1684 unsigned AllocatorAlign = llvm::bit_floor(std::min<uint64_t>(
1685 Target.getNewAlign(), getContext().getTypeSize(allocType)));
1686 allocationAlign = std::max(
1687 allocationAlign, getContext().toCharUnitsFromBits(AllocatorAlign));
1688 }
1689
1690 allocation = Address(RV.getScalarVal(), Int8Ty, allocationAlign);
1691 }
1692
1693 // Emit a null check on the allocation result if the allocation
1694 // function is allowed to return null (because it has a non-throwing
1695 // exception spec or is the reserved placement new) and we have an
1696 // interesting initializer will be running sanitizers on the initialization.
1697 bool nullCheck = E->shouldNullCheckAllocation() &&
1698 (!allocType.isPODType(getContext()) || E->hasInitializer() ||
1700
1701 llvm::BasicBlock *nullCheckBB = nullptr;
1702 llvm::BasicBlock *contBB = nullptr;
1703
1704 // The null-check means that the initializer is conditionally
1705 // evaluated.
1706 ConditionalEvaluation conditional(*this);
1707
1708 if (nullCheck) {
1709 conditional.begin(*this);
1710
1711 nullCheckBB = Builder.GetInsertBlock();
1712 llvm::BasicBlock *notNullBB = createBasicBlock("new.notnull");
1713 contBB = createBasicBlock("new.cont");
1714
1715 llvm::Value *isNull = Builder.CreateIsNull(allocation, "new.isnull");
1716 Builder.CreateCondBr(isNull, contBB, notNullBB);
1717 EmitBlock(notNullBB);
1718 }
1719
1720 // If there's an operator delete, enter a cleanup to call it if an
1721 // exception is thrown.
1722 EHScopeStack::stable_iterator operatorDeleteCleanup;
1723 llvm::Instruction *cleanupDominator = nullptr;
1724 if (E->getOperatorDelete() &&
1726 EnterNewDeleteCleanup(*this, E, TypeIdentityArg, allocation, allocSize,
1727 allocAlign, allocatorArgs);
1728 operatorDeleteCleanup = EHStack.stable_begin();
1729 cleanupDominator = Builder.CreateUnreachable();
1730 }
1731
1732 assert((allocSize == allocSizeWithoutCookie) ==
1733 CalculateCookiePadding(*this, E).isZero());
1734 if (allocSize != allocSizeWithoutCookie) {
1735 assert(E->isArray());
1736 allocation = CGM.getCXXABI().InitializeArrayCookie(*this, allocation,
1737 numElements,
1738 E, allocType);
1739 }
1740
1741 llvm::Type *elementTy = ConvertTypeForMem(allocType);
1742 Address result = allocation.withElementType(elementTy);
1743
1744 // Passing pointer through launder.invariant.group to avoid propagation of
1745 // vptrs information which may be included in previous type.
1746 // To not break LTO with different optimizations levels, we do it regardless
1747 // of optimization level.
1748 if (CGM.getCodeGenOpts().StrictVTablePointers &&
1749 allocator->isReservedGlobalPlacementOperator())
1750 result = Builder.CreateLaunderInvariantGroup(result);
1751
1752 // Emit sanitizer checks for pointer value now, so that in the case of an
1753 // array it was checked only once and not at each constructor call. We may
1754 // have already checked that the pointer is non-null.
1755 // FIXME: If we have an array cookie and a potentially-throwing allocator,
1756 // we'll null check the wrong pointer here.
1757 SanitizerSet SkippedChecks;
1758 SkippedChecks.set(SanitizerKind::Null, nullCheck);
1761 result, allocType, result.getAlignment(), SkippedChecks,
1762 numElements);
1763
1764 EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
1765 allocSizeWithoutCookie);
1766 llvm::Value *resultPtr = result.emitRawPointer(*this);
1767
1768 // Deactivate the 'operator delete' cleanup if we finished
1769 // initialization.
1770 if (operatorDeleteCleanup.isValid()) {
1771 DeactivateCleanupBlock(operatorDeleteCleanup, cleanupDominator);
1772 cleanupDominator->eraseFromParent();
1773 }
1774
1775 if (nullCheck) {
1776 conditional.end(*this);
1777
1778 llvm::BasicBlock *notNullBB = Builder.GetInsertBlock();
1779 EmitBlock(contBB);
1780
1781 llvm::PHINode *PHI = Builder.CreatePHI(resultPtr->getType(), 2);
1782 PHI->addIncoming(resultPtr, notNullBB);
1783 PHI->addIncoming(llvm::Constant::getNullValue(resultPtr->getType()),
1784 nullCheckBB);
1785
1786 resultPtr = PHI;
1787 }
1788
1789 return resultPtr;
1790}
1791
1793 llvm::Value *DeletePtr, QualType DeleteTy,
1794 llvm::Value *NumElements,
1795 CharUnits CookieSize) {
1796 assert((!NumElements && CookieSize.isZero()) ||
1797 DeleteFD->getOverloadedOperator() == OO_Array_Delete);
1798
1799 const auto *DeleteFTy = DeleteFD->getType()->castAs<FunctionProtoType>();
1800 CallArgList DeleteArgs;
1801
1802 auto Params = DeleteFD->getUsualDeleteParams();
1803 auto ParamTypeIt = DeleteFTy->param_type_begin();
1804
1805 std::optional<llvm::AllocaInst *> TagAlloca;
1806 auto EmitTag = [&](QualType TagType, const char *TagName) {
1807 assert(!TagAlloca);
1808 llvm::Type *Ty = getTypes().ConvertType(TagType);
1809 CharUnits Align = CGM.getNaturalTypeAlignment(TagType);
1810 llvm::AllocaInst *TagAllocation = CreateTempAlloca(Ty, TagName);
1811 TagAllocation->setAlignment(Align.getAsAlign());
1812 DeleteArgs.add(RValue::getAggregate(Address(TagAllocation, Ty, Align)),
1813 TagType);
1814 TagAlloca = TagAllocation;
1815 };
1816
1817 // Pass std::type_identity tag if present
1819 EmitTag(*ParamTypeIt++, "typeaware.delete.tag");
1820
1821 // Pass the pointer itself.
1822 QualType ArgTy = *ParamTypeIt++;
1823 DeleteArgs.add(RValue::get(DeletePtr), ArgTy);
1824
1825 // Pass the std::destroying_delete tag if present.
1826 if (Params.DestroyingDelete)
1827 EmitTag(*ParamTypeIt++, "destroying.delete.tag");
1828
1829 // Pass the size if the delete function has a size_t parameter.
1830 if (Params.Size) {
1831 QualType SizeType = *ParamTypeIt++;
1832 CharUnits DeleteTypeSize = getContext().getTypeSizeInChars(DeleteTy);
1833 llvm::Value *Size = llvm::ConstantInt::get(ConvertType(SizeType),
1834 DeleteTypeSize.getQuantity());
1835
1836 // For array new, multiply by the number of elements.
1837 if (NumElements)
1838 Size = Builder.CreateMul(Size, NumElements);
1839
1840 // If there is a cookie, add the cookie size.
1841 if (!CookieSize.isZero())
1842 Size = Builder.CreateAdd(
1843 Size, llvm::ConstantInt::get(SizeTy, CookieSize.getQuantity()));
1844
1845 DeleteArgs.add(RValue::get(Size), SizeType);
1846 }
1847
1848 // Pass the alignment if the delete function has an align_val_t parameter.
1849 if (isAlignedAllocation(Params.Alignment)) {
1850 QualType AlignValType = *ParamTypeIt++;
1851 CharUnits DeleteTypeAlign =
1852 getContext().toCharUnitsFromBits(getContext().getTypeAlignIfKnown(
1853 DeleteTy, true /* NeedsPreferredAlignment */));
1854 llvm::Value *Align = llvm::ConstantInt::get(ConvertType(AlignValType),
1855 DeleteTypeAlign.getQuantity());
1856 DeleteArgs.add(RValue::get(Align), AlignValType);
1857 }
1858
1859 assert(ParamTypeIt == DeleteFTy->param_type_end() &&
1860 "unknown parameter to usual delete function");
1861
1862 // Emit the call to delete.
1863 EmitNewDeleteCall(*this, DeleteFD, DeleteFTy, DeleteArgs);
1864
1865 // If call argument lowering didn't use a generated tag argument alloca we
1866 // remove them
1867 if (TagAlloca && (*TagAlloca)->use_empty())
1868 (*TagAlloca)->eraseFromParent();
1869}
1870namespace {
1871 /// Calls the given 'operator delete' on a single object.
1872 struct CallObjectDelete final : EHScopeStack::Cleanup {
1873 llvm::Value *Ptr;
1874 const FunctionDecl *OperatorDelete;
1875 QualType ElementType;
1876
1877 CallObjectDelete(llvm::Value *Ptr,
1878 const FunctionDecl *OperatorDelete,
1879 QualType ElementType)
1880 : Ptr(Ptr), OperatorDelete(OperatorDelete), ElementType(ElementType) {}
1881
1882 void Emit(CodeGenFunction &CGF, Flags flags) override {
1883 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
1884 }
1885 };
1886}
1887
1888void
1890 llvm::Value *CompletePtr,
1891 QualType ElementType) {
1892 EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup, CompletePtr,
1893 OperatorDelete, ElementType);
1894}
1895
1896/// Emit the code for deleting a single object with a destroying operator
1897/// delete. If the element type has a non-virtual destructor, Ptr has already
1898/// been converted to the type of the parameter of 'operator delete'. Otherwise
1899/// Ptr points to an object of the static type.
1901 const CXXDeleteExpr *DE, Address Ptr,
1902 QualType ElementType) {
1903 auto *Dtor = ElementType->getAsCXXRecordDecl()->getDestructor();
1904 if (Dtor && Dtor->isVirtual())
1905 CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1906 Dtor);
1907 else
1909 ElementType);
1910}
1911
1912/// Emit the code for deleting a single object.
1913/// \return \c true if we started emitting UnconditionalDeleteBlock, \c false
1914/// if not.
1916 const CXXDeleteExpr *DE,
1917 Address Ptr,
1918 QualType ElementType,
1919 llvm::BasicBlock *UnconditionalDeleteBlock) {
1920 // C++11 [expr.delete]p3:
1921 // If the static type of the object to be deleted is different from its
1922 // dynamic type, the static type shall be a base class of the dynamic type
1923 // of the object to be deleted and the static type shall have a virtual
1924 // destructor or the behavior is undefined.
1926 ElementType);
1927
1928 const FunctionDecl *OperatorDelete = DE->getOperatorDelete();
1929 assert(!OperatorDelete->isDestroyingOperatorDelete());
1930
1931 // Find the destructor for the type, if applicable. If the
1932 // destructor is virtual, we'll just emit the vcall and return.
1933 const CXXDestructorDecl *Dtor = nullptr;
1934 if (const auto *RD = ElementType->getAsCXXRecordDecl()) {
1935 if (RD->hasDefinition() && !RD->hasTrivialDestructor()) {
1936 Dtor = RD->getDestructor();
1937
1938 if (Dtor->isVirtual()) {
1939 bool UseVirtualCall = true;
1940 const Expr *Base = DE->getArgument();
1941 if (auto *DevirtualizedDtor =
1942 dyn_cast_or_null<const CXXDestructorDecl>(
1944 Base, CGF.CGM.getLangOpts().AppleKext))) {
1945 UseVirtualCall = false;
1946 const CXXRecordDecl *DevirtualizedClass =
1947 DevirtualizedDtor->getParent();
1948 if (declaresSameEntity(getCXXRecord(Base), DevirtualizedClass)) {
1949 // Devirtualized to the class of the base type (the type of the
1950 // whole expression).
1951 Dtor = DevirtualizedDtor;
1952 } else {
1953 // Devirtualized to some other type. Would need to cast the this
1954 // pointer to that type but we don't have support for that yet, so
1955 // do a virtual call. FIXME: handle the case where it is
1956 // devirtualized to the derived type (the type of the inner
1957 // expression) as in EmitCXXMemberOrOperatorMemberCallExpr.
1958 UseVirtualCall = true;
1959 }
1960 }
1961 if (UseVirtualCall) {
1962 CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1963 Dtor);
1964 return false;
1965 }
1966 }
1967 }
1968 }
1969
1970 // Make sure that we call delete even if the dtor throws.
1971 // This doesn't have to a conditional cleanup because we're going
1972 // to pop it off in a second.
1973 CGF.EHStack.pushCleanup<CallObjectDelete>(
1974 NormalAndEHCleanup, Ptr.emitRawPointer(CGF), OperatorDelete, ElementType);
1975
1976 if (Dtor)
1978 /*ForVirtualBase=*/false,
1979 /*Delegating=*/false,
1980 Ptr, ElementType);
1981 else if (auto Lifetime = ElementType.getObjCLifetime()) {
1982 switch (Lifetime) {
1986 break;
1987
1990 break;
1991
1993 CGF.EmitARCDestroyWeak(Ptr);
1994 break;
1995 }
1996 }
1997
1998 // When optimizing for size, call 'operator delete' unconditionally.
1999 if (CGF.CGM.getCodeGenOpts().OptimizeSize > 1) {
2000 CGF.EmitBlock(UnconditionalDeleteBlock);
2001 CGF.PopCleanupBlock();
2002 return true;
2003 }
2004
2005 CGF.PopCleanupBlock();
2006 return false;
2007}
2008
2009namespace {
2010 /// Calls the given 'operator delete' on an array of objects.
2011 struct CallArrayDelete final : EHScopeStack::Cleanup {
2012 llvm::Value *Ptr;
2013 const FunctionDecl *OperatorDelete;
2014 llvm::Value *NumElements;
2015 QualType ElementType;
2016 CharUnits CookieSize;
2017
2018 CallArrayDelete(llvm::Value *Ptr,
2019 const FunctionDecl *OperatorDelete,
2020 llvm::Value *NumElements,
2021 QualType ElementType,
2022 CharUnits CookieSize)
2023 : Ptr(Ptr), OperatorDelete(OperatorDelete), NumElements(NumElements),
2024 ElementType(ElementType), CookieSize(CookieSize) {}
2025
2026 void Emit(CodeGenFunction &CGF, Flags flags) override {
2027 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType, NumElements,
2028 CookieSize);
2029 }
2030 };
2031}
2032
2033/// Emit the code for deleting an array of objects.
2035 const CXXDeleteExpr *E,
2036 Address deletedPtr,
2037 QualType elementType) {
2038 llvm::Value *numElements = nullptr;
2039 llvm::Value *allocatedPtr = nullptr;
2040 CharUnits cookieSize;
2041 CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
2042 numElements, allocatedPtr, cookieSize);
2043
2044 assert(allocatedPtr && "ReadArrayCookie didn't set allocated pointer");
2045
2046 // Make sure that we call delete even if one of the dtors throws.
2047 const FunctionDecl *operatorDelete = E->getOperatorDelete();
2048 CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup,
2049 allocatedPtr, operatorDelete,
2050 numElements, elementType,
2051 cookieSize);
2052
2053 // Destroy the elements.
2054 if (QualType::DestructionKind dtorKind = elementType.isDestructedType()) {
2055 assert(numElements && "no element count for a type with a destructor!");
2056
2057 CharUnits elementSize = CGF.getContext().getTypeSizeInChars(elementType);
2058 CharUnits elementAlign =
2059 deletedPtr.getAlignment().alignmentOfArrayElement(elementSize);
2060
2061 llvm::Value *arrayBegin = deletedPtr.emitRawPointer(CGF);
2062 llvm::Value *arrayEnd = CGF.Builder.CreateInBoundsGEP(
2063 deletedPtr.getElementType(), arrayBegin, numElements, "delete.end");
2064
2065 // Note that it is legal to allocate a zero-length array, and we
2066 // can never fold the check away because the length should always
2067 // come from a cookie.
2068 CGF.emitArrayDestroy(arrayBegin, arrayEnd, elementType, elementAlign,
2069 CGF.getDestroyer(dtorKind),
2070 /*checkZeroLength*/ true,
2071 CGF.needsEHCleanup(dtorKind));
2072 }
2073
2074 // Pop the cleanup block.
2075 CGF.PopCleanupBlock();
2076}
2077
2079 const Expr *Arg = E->getArgument();
2081
2082 // Null check the pointer.
2083 //
2084 // We could avoid this null check if we can determine that the object
2085 // destruction is trivial and doesn't require an array cookie; we can
2086 // unconditionally perform the operator delete call in that case. For now, we
2087 // assume that deleted pointers are null rarely enough that it's better to
2088 // keep the branch. This might be worth revisiting for a -O0 code size win.
2089 llvm::BasicBlock *DeleteNotNull = createBasicBlock("delete.notnull");
2090 llvm::BasicBlock *DeleteEnd = createBasicBlock("delete.end");
2091
2092 llvm::Value *IsNull = Builder.CreateIsNull(Ptr, "isnull");
2093
2094 Builder.CreateCondBr(IsNull, DeleteEnd, DeleteNotNull);
2095 EmitBlock(DeleteNotNull);
2096 Ptr.setKnownNonNull();
2097
2098 QualType DeleteTy = E->getDestroyedType();
2099
2100 // A destroying operator delete overrides the entire operation of the
2101 // delete expression.
2103 EmitDestroyingObjectDelete(*this, E, Ptr, DeleteTy);
2104 EmitBlock(DeleteEnd);
2105 return;
2106 }
2107
2108 // We might be deleting a pointer to array.
2109 DeleteTy = getContext().getBaseElementType(DeleteTy);
2110 Ptr = Ptr.withElementType(ConvertTypeForMem(DeleteTy));
2111
2112 if (E->isArrayForm()) {
2113 EmitArrayDelete(*this, E, Ptr, DeleteTy);
2114 EmitBlock(DeleteEnd);
2115 } else {
2116 if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd))
2117 EmitBlock(DeleteEnd);
2118 }
2119}
2120
2121static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E,
2122 llvm::Type *StdTypeInfoPtrTy,
2123 bool HasNullCheck) {
2124 // Get the vtable pointer.
2125 Address ThisPtr = CGF.EmitLValue(E).getAddress();
2126
2127 QualType SrcRecordTy = E->getType();
2128
2129 // C++ [class.cdtor]p4:
2130 // If the operand of typeid refers to the object under construction or
2131 // destruction and the static type of the operand is neither the constructor
2132 // or destructor’s class nor one of its bases, the behavior is undefined.
2134 ThisPtr, SrcRecordTy);
2135
2136 // Whether we need an explicit null pointer check. For example, with the
2137 // Microsoft ABI, if this is a call to __RTtypeid, the null pointer check and
2138 // exception throw is inside the __RTtypeid(nullptr) call
2139 if (HasNullCheck &&
2140 CGF.CGM.getCXXABI().shouldTypeidBeNullChecked(SrcRecordTy)) {
2141 llvm::BasicBlock *BadTypeidBlock =
2142 CGF.createBasicBlock("typeid.bad_typeid");
2143 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("typeid.end");
2144
2145 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ThisPtr);
2146 CGF.Builder.CreateCondBr(IsNull, BadTypeidBlock, EndBlock);
2147
2148 CGF.EmitBlock(BadTypeidBlock);
2149 CGF.CGM.getCXXABI().EmitBadTypeidCall(CGF);
2150 CGF.EmitBlock(EndBlock);
2151 }
2152
2153 return CGF.CGM.getCXXABI().EmitTypeid(CGF, SrcRecordTy, ThisPtr,
2154 StdTypeInfoPtrTy);
2155}
2156
2158 // Ideally, we would like to use GlobalsInt8PtrTy here, however, we cannot,
2159 // primarily because the result of applying typeid is a value of type
2160 // type_info, which is declared & defined by the standard library
2161 // implementation and expects to operate on the generic (default) AS.
2162 // https://reviews.llvm.org/D157452 has more context, and a possible solution.
2163 llvm::Type *PtrTy = Int8PtrTy;
2164 LangAS GlobAS = CGM.GetGlobalVarAddressSpace(nullptr);
2165
2166 auto MaybeASCast = [=](auto &&TypeInfo) {
2167 if (GlobAS == LangAS::Default)
2168 return TypeInfo;
2169 return getTargetHooks().performAddrSpaceCast(CGM, TypeInfo, GlobAS, PtrTy);
2170 };
2171
2172 if (E->isTypeOperand()) {
2173 llvm::Constant *TypeInfo =
2174 CGM.GetAddrOfRTTIDescriptor(E->getTypeOperand(getContext()));
2175 return MaybeASCast(TypeInfo);
2176 }
2177
2178 // C++ [expr.typeid]p2:
2179 // When typeid is applied to a glvalue expression whose type is a
2180 // polymorphic class type, the result refers to a std::type_info object
2181 // representing the type of the most derived object (that is, the dynamic
2182 // type) to which the glvalue refers.
2183 // If the operand is already most derived object, no need to look up vtable.
2185 return EmitTypeidFromVTable(*this, E->getExprOperand(), PtrTy,
2186 E->hasNullCheck());
2187
2188 QualType OperandTy = E->getExprOperand()->getType();
2189 return MaybeASCast(CGM.GetAddrOfRTTIDescriptor(OperandTy));
2190}
2191
2193 QualType DestTy) {
2194 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
2195 if (DestTy->isPointerType())
2196 return llvm::Constant::getNullValue(DestLTy);
2197
2198 /// C++ [expr.dynamic.cast]p9:
2199 /// A failed cast to reference type throws std::bad_cast
2200 if (!CGF.CGM.getCXXABI().EmitBadCastCall(CGF))
2201 return nullptr;
2202
2203 CGF.Builder.ClearInsertionPoint();
2204 return llvm::PoisonValue::get(DestLTy);
2205}
2206
2208 const CXXDynamicCastExpr *DCE) {
2209 CGM.EmitExplicitCastExprType(DCE, this);
2210 QualType DestTy = DCE->getTypeAsWritten();
2211
2212 QualType SrcTy = DCE->getSubExpr()->getType();
2213
2214 // C++ [expr.dynamic.cast]p7:
2215 // If T is "pointer to cv void," then the result is a pointer to the most
2216 // derived object pointed to by v.
2217 bool IsDynamicCastToVoid = DestTy->isVoidPointerType();
2218 QualType SrcRecordTy;
2219 QualType DestRecordTy;
2220 if (IsDynamicCastToVoid) {
2221 SrcRecordTy = SrcTy->getPointeeType();
2222 // No DestRecordTy.
2223 } else if (const PointerType *DestPTy = DestTy->getAs<PointerType>()) {
2224 SrcRecordTy = SrcTy->castAs<PointerType>()->getPointeeType();
2225 DestRecordTy = DestPTy->getPointeeType();
2226 } else {
2227 SrcRecordTy = SrcTy;
2228 DestRecordTy = DestTy->castAs<ReferenceType>()->getPointeeType();
2229 }
2230
2231 // C++ [class.cdtor]p5:
2232 // If the operand of the dynamic_cast refers to the object under
2233 // construction or destruction and the static type of the operand is not a
2234 // pointer to or object of the constructor or destructor’s own class or one
2235 // of its bases, the dynamic_cast results in undefined behavior.
2236 EmitTypeCheck(TCK_DynamicOperation, DCE->getExprLoc(), ThisAddr, SrcRecordTy);
2237
2238 if (DCE->isAlwaysNull()) {
2239 if (llvm::Value *T = EmitDynamicCastToNull(*this, DestTy)) {
2240 // Expression emission is expected to retain a valid insertion point.
2241 if (!Builder.GetInsertBlock())
2242 EmitBlock(createBasicBlock("dynamic_cast.unreachable"));
2243 return T;
2244 }
2245 }
2246
2247 assert(SrcRecordTy->isRecordType() && "source type must be a record type!");
2248
2249 // If the destination is effectively final, the cast succeeds if and only
2250 // if the dynamic type of the pointer is exactly the destination type.
2251 bool IsExact = !IsDynamicCastToVoid &&
2252 CGM.getCodeGenOpts().OptimizationLevel > 0 &&
2253 DestRecordTy->getAsCXXRecordDecl()->isEffectivelyFinal() &&
2254 CGM.getCXXABI().shouldEmitExactDynamicCast(DestRecordTy);
2255
2256 std::optional<CGCXXABI::ExactDynamicCastInfo> ExactCastInfo;
2257 if (IsExact) {
2258 ExactCastInfo = CGM.getCXXABI().getExactDynamicCastInfo(SrcRecordTy, DestTy,
2259 DestRecordTy);
2260 if (!ExactCastInfo) {
2261 llvm::Value *NullValue = EmitDynamicCastToNull(*this, DestTy);
2262 if (!Builder.GetInsertBlock())
2263 EmitBlock(createBasicBlock("dynamic_cast.unreachable"));
2264 return NullValue;
2265 }
2266 }
2267
2268 // C++ [expr.dynamic.cast]p4:
2269 // If the value of v is a null pointer value in the pointer case, the result
2270 // is the null pointer value of type T.
2271 bool ShouldNullCheckSrcValue =
2272 IsExact || CGM.getCXXABI().shouldDynamicCastCallBeNullChecked(
2273 SrcTy->isPointerType(), SrcRecordTy);
2274
2275 llvm::BasicBlock *CastNull = nullptr;
2276 llvm::BasicBlock *CastNotNull = nullptr;
2277 llvm::BasicBlock *CastEnd = createBasicBlock("dynamic_cast.end");
2278
2279 if (ShouldNullCheckSrcValue) {
2280 CastNull = createBasicBlock("dynamic_cast.null");
2281 CastNotNull = createBasicBlock("dynamic_cast.notnull");
2282
2283 llvm::Value *IsNull = Builder.CreateIsNull(ThisAddr);
2284 Builder.CreateCondBr(IsNull, CastNull, CastNotNull);
2285 EmitBlock(CastNotNull);
2286 }
2287
2288 llvm::Value *Value;
2289 if (IsDynamicCastToVoid) {
2290 Value = CGM.getCXXABI().emitDynamicCastToVoid(*this, ThisAddr, SrcRecordTy);
2291 } else if (IsExact) {
2292 // If the destination type is effectively final, this pointer points to the
2293 // right type if and only if its vptr has the right value.
2294 Value = CGM.getCXXABI().emitExactDynamicCast(
2295 *this, ThisAddr, SrcRecordTy, DestTy, DestRecordTy, *ExactCastInfo,
2296 CastEnd, CastNull);
2297 } else {
2298 assert(DestRecordTy->isRecordType() &&
2299 "destination type must be a record type!");
2300 Value = CGM.getCXXABI().emitDynamicCastCall(*this, ThisAddr, SrcRecordTy,
2301 DestTy, DestRecordTy, CastEnd);
2302 }
2303 CastNotNull = Builder.GetInsertBlock();
2304
2305 llvm::Value *NullValue = nullptr;
2306 if (ShouldNullCheckSrcValue) {
2307 EmitBranch(CastEnd);
2308
2309 EmitBlock(CastNull);
2310 NullValue = EmitDynamicCastToNull(*this, DestTy);
2311 CastNull = Builder.GetInsertBlock();
2312
2313 EmitBranch(CastEnd);
2314 }
2315
2316 EmitBlock(CastEnd);
2317
2318 if (CastNull) {
2319 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType(), 2);
2320 PHI->addIncoming(Value, CastNotNull);
2321 PHI->addIncoming(NullValue, CastNull);
2322
2323 Value = PHI;
2324 }
2325
2326 return Value;
2327}
#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 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:220
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:776
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
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.
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:3722
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:3972
Expr * getLHS() const
Definition Expr.h:4022
Expr * getRHS() const
Definition Expr.h:4024
Opcode getOpcode() const
Definition Expr.h:4017
Represents a call to a CUDA kernel function.
Definition ExprCXX.h:234
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:2604
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
Definition DeclCXX.cpp:2999
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2628
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2667
bool isArrayForm() const
Definition ExprCXX.h:2654
QualType getDestroyedType() const
Retrieve the type being destroyed.
Definition ExprCXX.cpp:338
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
A C++ dynamic_cast expression (C++ [expr.dynamic.cast]).
Definition ExprCXX.h:481
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:179
SourceLocation getExprLoc() const LLVM_READONLY
Definition ExprCXX.h:220
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
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:2710
bool isVirtual() const
Definition DeclCXX.h:2184
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2255
QualType getThisType() const
Return the type of the this pointer.
Definition DeclCXX.cpp:2809
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Definition DeclCXX.cpp:2735
Qualifiers getMethodQualifiers() const
Definition DeclCXX.h:2290
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:2508
CXXMethodDecl * getCorrespondingMethodInClass(const CXXRecordDecl *RD, bool MayBeBase=false)
Find the method in RD that corresponds to this one.
Definition DeclCXX.cpp:2454
bool isStatic() const
Definition DeclCXX.cpp:2401
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
Definition DeclCXX.cpp:2714
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2357
bool isArray() const
Definition ExprCXX.h:2466
llvm::iterator_range< arg_iterator > placement_arguments()
Definition ExprCXX.h:2574
QualType getAllocatedType() const
Definition ExprCXX.h:2436
unsigned getNumImplicitArgs() const
Definition ExprCXX.h:2513
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:2471
ImplicitAllocationParameters implicitAllocationParameters() const
Provides the full set of information about expected implicit parameters in this call.
Definition ExprCXX.h:2564
bool hasInitializer() const
Whether this new-expression has any initializer at all.
Definition ExprCXX.h:2526
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:2553
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2463
unsigned getNumPlacementArgs() const
Definition ExprCXX.h:2496
TypeSourceInfo * getAllocatedTypeSourceInfo() const
Definition ExprCXX.h:2440
FunctionDecl * getOperatorNew() const
Definition ExprCXX.h:2461
Expr * getInitializer()
The initializer of this new-expression.
Definition ExprCXX.h:2535
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:84
Represents a list-initialization with parenthesis.
Definition ExprCXX.h:5143
MutableArrayRef< Expr * > getInitExprs()
Definition ExprCXX.h:5183
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition ExprCXX.h:2747
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
Definition ExprCXX.h:2811
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:2325
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:2121
An expression "T()" which creates an rvalue of a non-class type T.
Definition ExprCXX.h:2198
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:848
bool isTypeOperand() const
Definition ExprCXX.h:884
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:895
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:2877
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3081
SourceLocation getBeginLoc() const
Definition Expr.h:3211
arg_iterator arg_begin()
Definition Expr.h:3134
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
Definition Expr.h:3060
Expr * getCallee()
Definition Expr.h:3024
arg_range arguments()
Definition Expr.h:3129
Expr * getSubExpr()
Definition Expr.h:3660
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:504
bool isSanitizerChecked() const
Definition CGValue.h:662
Address getAddress() const
Definition CGValue.h:644
IsZeroed_t isZeroed() const
Definition CGValue.h:675
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:587
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:309
llvm::Value * CreateIsNull(Address Addr, const Twine &Name="")
Definition CGBuilder.h:360
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Definition CGBuilder.h:402
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
Definition CGBuilder.h:369
Address CreateInBoundsGEP(Address Addr, ArrayRef< llvm::Value * > IdxList, llvm::Type *ElementType, CharUnits Align, const Twine &Name="")
Definition CGBuilder.h:350
virtual std::vector< CharUnits > getVBPtrOffsets(const CXXRecordDecl *RD)
Gets the offsets of all the virtual base pointers in a given class.
Definition CGCXXABI.cpp:337
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:250
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:210
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:2434
GlobalDecl CurGD
CurGD - The GlobalDecl for the current function being compiled.
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
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:2876
void EmitARCDestroyWeak(Address addr)
void @objc_destroyWeak(i8** addr) Essentially objc_storeWeak(addr, nil).
Definition CGObjC.cpp:2681
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:2594
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:2049
@ 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:2577
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:2578
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
Definition CGDecl.cpp:2251
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:2481
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:243
void EmitARCDestroyStrong(Address addr, ARCPreciseLifetime_t precise)
Destroy a __strong variable.
Definition CGObjC.cpp:2510
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:2189
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:152
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:5233
const TargetCodeGenInfo & getTargetHooks() const
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
Definition CGExpr.cpp:284
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType)
Emit additional metadata used by the AllocToken instrumentation.
Definition CGExpr.cpp:1325
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:2460
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:1706
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
Definition CGStmt.cpp:675
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:279
RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
Definition CGExpr.cpp:735
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:1764
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:4673
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:1822
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:655
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:126
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:699
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:182
Address getAddress() const
Definition CGValue.h:361
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:98
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
Definition CGValue.h:125
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition CGValue.h:71
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
Address performAddrSpaceCast(CodeGen::CodeGenFunction &CGF, Address Addr, LangAS SrcAddr, llvm::Type *DestTy, bool IsNonNull=false) const
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3760
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:4171
QualType getTypeAsWritten() const
getTypeAsWritten - Returns the type that this expression is casting to, as written in the source code...
Definition Expr.h:3889
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
Definition ExprCXX.h:3663
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:3081
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:3248
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:273
QualType getType() const
Definition Expr.h:144
Represents a function declaration or definition.
Definition Decl.h:2000
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition Decl.cpp:3543
QualType getReturnType() const
Definition Decl.h:2845
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2377
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:2594
UsualDeleteParams getUsualDeleteParams() const
Definition Decl.cpp:3559
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Definition Decl.cpp:3395
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4122
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5266
unsigned getNumParams() const
Definition TypeBase.h:5544
QualType getParamType(unsigned i) const
Definition TypeBase.h:5546
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:5991
Describes an C or C++ initializer list.
Definition Expr.h:5233
bool isStringLiteralInit() const
Is this an initializer for an array of characters, initialized by a string literal or an @encode?
Definition Expr.cpp:2443
unsigned getNumInits() const
Definition Expr.h:5263
Expr * getArrayFiller()
If this initializer list initializes an array with more elements than there are initializers in the l...
Definition Expr.h:5335
const Expr * getInit(unsigned Init) const
Definition Expr.h:5287
ArrayRef< Expr * > inits()
Definition Expr.h:5283
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3298
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
Definition Expr.h:3409
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition Expr.h:3381
bool hasQualifier() const
Determines whether this member expression actually had a C++ nested-name-specifier prior to the name ...
Definition Expr.h:3395
Expr * getBase() const
Definition Expr.h:3375
bool isArrow() const
Definition Expr.h:3482
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3653
QualType getPointeeType() const
Definition TypeBase.h:3671
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:409
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3328
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8374
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:8416
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8330
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1438
QualType getCanonicalType() const
Definition TypeBase.h:8342
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition TypeBase.h:1545
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
Definition Type.cpp:2695
bool hasStrongOrWeakObjCLifetime() const
Definition TypeBase.h:1446
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:4312
field_range fields() const
Definition Decl.h:4515
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition Decl.cpp:5283
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4500
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3573
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:1799
bool isUnion() const
Definition Decl.h:3922
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:712
bool isPointerType() const
Definition TypeBase.h:8527
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9170
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
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:9156
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2921
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9103
bool isRecordType() const
Definition TypeBase.h:8654
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:154
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:145
@ 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:2271
bool isAlignedAllocation(AlignedAllocationMode Mode)
Definition ExprCXX.h:2267
AlignedAllocationMode
Definition ExprCXX.h:2265
const FunctionProtoType * T
@ Dtor_Complete
Complete object dtor.
Definition ABI.h:36
@ Type
The name was classified as a type.
Definition Sema.h:562
bool isTypeAwareAllocation(TypeAwareAllocationMode Mode)
Definition ExprCXX.h:2255
LangAS
Defines the address space values used by the address space qualifier of QualType.
TypeAwareAllocationMode
Definition ExprCXX.h:2253
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:2347
AlignedAllocationMode Alignment
Definition ExprCXX.h:2350