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 // Emit as a device kernel call if CUDA device code is to be generated.
507 // TODO: implement for HIP
508 if (!getLangOpts().HIP && getLangOpts().CUDAIsDevice)
509 return CGM.getCUDARuntime().EmitCUDADeviceKernelCallExpr(
510 *this, E, ReturnValue, CallOrInvoke);
511 return CGM.getCUDARuntime().EmitCUDAKernelCallExpr(*this, E, ReturnValue,
512 CallOrInvoke);
513}
514
516 Address DestPtr,
517 const CXXRecordDecl *Base) {
518 if (Base->isEmpty())
519 return;
520
521 DestPtr = DestPtr.withElementType(CGF.Int8Ty);
522
523 const ASTRecordLayout &Layout = CGF.getContext().getASTRecordLayout(Base);
524 CharUnits NVSize = Layout.getNonVirtualSize();
525
526 // We cannot simply zero-initialize the entire base sub-object if vbptrs are
527 // present, they are initialized by the most derived class before calling the
528 // constructor.
530 Stores.emplace_back(CharUnits::Zero(), NVSize);
531
532 // Each store is split by the existence of a vbptr.
533 CharUnits VBPtrWidth = CGF.getPointerSize();
534 std::vector<CharUnits> VBPtrOffsets =
536 for (CharUnits VBPtrOffset : VBPtrOffsets) {
537 // Stop before we hit any virtual base pointers located in virtual bases.
538 if (VBPtrOffset >= NVSize)
539 break;
540 std::pair<CharUnits, CharUnits> LastStore = Stores.pop_back_val();
541 CharUnits LastStoreOffset = LastStore.first;
542 CharUnits LastStoreSize = LastStore.second;
543
544 CharUnits SplitBeforeOffset = LastStoreOffset;
545 CharUnits SplitBeforeSize = VBPtrOffset - SplitBeforeOffset;
546 assert(!SplitBeforeSize.isNegative() && "negative store size!");
547 if (!SplitBeforeSize.isZero())
548 Stores.emplace_back(SplitBeforeOffset, SplitBeforeSize);
549
550 CharUnits SplitAfterOffset = VBPtrOffset + VBPtrWidth;
551 CharUnits SplitAfterSize = LastStoreSize - SplitAfterOffset;
552 assert(!SplitAfterSize.isNegative() && "negative store size!");
553 if (!SplitAfterSize.isZero())
554 Stores.emplace_back(SplitAfterOffset, SplitAfterSize);
555 }
556
557 // If the type contains a pointer to data member we can't memset it to zero.
558 // Instead, create a null constant and copy it to the destination.
559 // TODO: there are other patterns besides zero that we can usefully memset,
560 // like -1, which happens to be the pattern used by member-pointers.
561 // TODO: isZeroInitializable can be over-conservative in the case where a
562 // virtual base contains a member pointer.
563 llvm::Constant *NullConstantForBase = CGF.CGM.EmitNullConstantForBase(Base);
564 if (!NullConstantForBase->isNullValue()) {
565 llvm::GlobalVariable *NullVariable = new llvm::GlobalVariable(
566 CGF.CGM.getModule(), NullConstantForBase->getType(),
567 /*isConstant=*/true, llvm::GlobalVariable::PrivateLinkage,
568 NullConstantForBase, Twine());
569
570 CharUnits Align =
571 std::max(Layout.getNonVirtualAlignment(), DestPtr.getAlignment());
572 NullVariable->setAlignment(Align.getAsAlign());
573
574 Address SrcPtr(NullVariable, CGF.Int8Ty, Align);
575
576 // Get and call the appropriate llvm.memcpy overload.
577 for (std::pair<CharUnits, CharUnits> Store : Stores) {
578 CharUnits StoreOffset = Store.first;
579 CharUnits StoreSize = Store.second;
580 llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
582 CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
583 CGF.Builder.CreateConstInBoundsByteGEP(SrcPtr, StoreOffset),
584 StoreSizeVal);
585 }
586
587 // Otherwise, just memset the whole thing to zero. This is legal
588 // because in LLVM, all default initializers (other than the ones we just
589 // handled above) are guaranteed to have a bit pattern of all zeros.
590 } else {
591 for (std::pair<CharUnits, CharUnits> Store : Stores) {
592 CharUnits StoreOffset = Store.first;
593 CharUnits StoreSize = Store.second;
594 llvm::Value *StoreSizeVal = CGF.CGM.getSize(StoreSize);
596 CGF.Builder.CreateConstInBoundsByteGEP(DestPtr, StoreOffset),
597 CGF.Builder.getInt8(0), StoreSizeVal);
598 }
599 }
600}
601
602void
604 AggValueSlot Dest) {
605 assert(!Dest.isIgnored() && "Must have a destination!");
606 const CXXConstructorDecl *CD = E->getConstructor();
607
608 // If we require zero initialization before (or instead of) calling the
609 // constructor, as can be the case with a non-user-provided default
610 // constructor, emit the zero initialization now, unless destination is
611 // already zeroed.
612 if (E->requiresZeroInitialization() && !Dest.isZeroed()) {
613 switch (E->getConstructionKind()) {
617 break;
621 CD->getParent());
622 break;
623 }
624 }
625
626 // If this is a call to a trivial default constructor, do nothing.
627 if (CD->isTrivial() && CD->isDefaultConstructor())
628 return;
629
630 // Elide the constructor if we're constructing from a temporary.
631 if (getLangOpts().ElideConstructors && E->isElidable()) {
632 // FIXME: This only handles the simplest case, where the source object
633 // is passed directly as the first argument to the constructor.
634 // This should also handle stepping though implicit casts and
635 // conversion sequences which involve two steps, with a
636 // conversion operator followed by a converting constructor.
637 const Expr *SrcObj = E->getArg(0);
638 assert(SrcObj->isTemporaryObject(getContext(), CD->getParent()));
639 assert(
640 getContext().hasSameUnqualifiedType(E->getType(), SrcObj->getType()));
641 EmitAggExpr(SrcObj, Dest);
642 return;
643 }
644
645 if (const ArrayType *arrayType
646 = getContext().getAsArrayType(E->getType())) {
648 Dest.isSanitizerChecked());
649 } else {
651 bool ForVirtualBase = false;
652 bool Delegating = false;
653
654 switch (E->getConstructionKind()) {
656 // We should be emitting a constructor; GlobalDecl will assert this
657 Type = CurGD.getCtorType();
658 Delegating = true;
659 break;
660
663 break;
664
666 ForVirtualBase = true;
667 [[fallthrough]];
668
670 Type = Ctor_Base;
671 }
672
673 // Call the constructor.
674 EmitCXXConstructorCall(CD, Type, ForVirtualBase, Delegating, Dest, E);
675 }
676}
677
679 const Expr *Exp) {
680 if (const ExprWithCleanups *E = dyn_cast<ExprWithCleanups>(Exp))
681 Exp = E->getSubExpr();
682 assert(isa<CXXConstructExpr>(Exp) &&
683 "EmitSynthesizedCXXCopyCtor - unknown copy ctor expr");
685 const CXXConstructorDecl *CD = E->getConstructor();
686 RunCleanupsScope Scope(*this);
687
688 // If we require zero initialization before (or instead of) calling the
689 // constructor, as can be the case with a non-user-provided default
690 // constructor, emit the zero initialization now.
691 // FIXME. Do I still need this for a copy ctor synthesis?
694
695 assert(!getContext().getAsConstantArrayType(E->getType())
696 && "EmitSynthesizedCXXCopyCtor - Copied-in Array");
697 EmitSynthesizedCXXCopyCtorCall(CD, Dest, Src, E);
698}
699
701 const CXXNewExpr *E) {
702 if (!E->isArray())
703 return CharUnits::Zero();
704
705 // No cookie is required if the operator new[] being used is the
706 // reserved placement operator new[].
708 return CharUnits::Zero();
709
710 return CGF.CGM.getCXXABI().GetArrayCookieSize(E);
711}
712
713static llvm::Value *EmitCXXNewAllocSize(CodeGenFunction &CGF,
714 const CXXNewExpr *e,
715 unsigned minElements,
716 llvm::Value *&numElements,
717 llvm::Value *&sizeWithoutCookie) {
719
720 if (!e->isArray()) {
722 sizeWithoutCookie
723 = llvm::ConstantInt::get(CGF.SizeTy, typeSize.getQuantity());
724 return sizeWithoutCookie;
725 }
726
727 // The width of size_t.
728 unsigned sizeWidth = CGF.SizeTy->getBitWidth();
729
730 // Figure out the cookie size.
731 llvm::APInt cookieSize(sizeWidth,
732 CalculateCookiePadding(CGF, e).getQuantity());
733
734 // Emit the array size expression.
735 // We multiply the size of all dimensions for NumElements.
736 // e.g for 'int[2][3]', ElemType is 'int' and NumElements is 6.
737 numElements = ConstantEmitter(CGF).tryEmitAbstract(
738 *e->getArraySize(), (*e->getArraySize())->getType());
739 if (!numElements)
740 numElements = CGF.EmitScalarExpr(*e->getArraySize());
741 assert(isa<llvm::IntegerType>(numElements->getType()));
742
743 // The number of elements can be have an arbitrary integer type;
744 // essentially, we need to multiply it by a constant factor, add a
745 // cookie size, and verify that the result is representable as a
746 // size_t. That's just a gloss, though, and it's wrong in one
747 // important way: if the count is negative, it's an error even if
748 // the cookie size would bring the total size >= 0.
749 bool isSigned
750 = (*e->getArraySize())->getType()->isSignedIntegerOrEnumerationType();
751 llvm::IntegerType *numElementsType
752 = cast<llvm::IntegerType>(numElements->getType());
753 unsigned numElementsWidth = numElementsType->getBitWidth();
754
755 // Compute the constant factor.
756 llvm::APInt arraySizeMultiplier(sizeWidth, 1);
757 while (const ConstantArrayType *CAT
759 type = CAT->getElementType();
760 arraySizeMultiplier *= CAT->getSize();
761 }
762
764 llvm::APInt typeSizeMultiplier(sizeWidth, typeSize.getQuantity());
765 typeSizeMultiplier *= arraySizeMultiplier;
766
767 // This will be a size_t.
768 llvm::Value *size;
769
770 // If someone is doing 'new int[42]' there is no need to do a dynamic check.
771 // Don't bloat the -O0 code.
772 if (llvm::ConstantInt *numElementsC =
773 dyn_cast<llvm::ConstantInt>(numElements)) {
774 const llvm::APInt &count = numElementsC->getValue();
775
776 bool hasAnyOverflow = false;
777
778 // If 'count' was a negative number, it's an overflow.
779 if (isSigned && count.isNegative())
780 hasAnyOverflow = true;
781
782 // We want to do all this arithmetic in size_t. If numElements is
783 // wider than that, check whether it's already too big, and if so,
784 // overflow.
785 else if (numElementsWidth > sizeWidth &&
786 numElementsWidth - sizeWidth > count.countl_zero())
787 hasAnyOverflow = true;
788
789 // Okay, compute a count at the right width.
790 llvm::APInt adjustedCount = count.zextOrTrunc(sizeWidth);
791
792 // If there is a brace-initializer, we cannot allocate fewer elements than
793 // there are initializers. If we do, that's treated like an overflow.
794 if (adjustedCount.ult(minElements))
795 hasAnyOverflow = true;
796
797 // Scale numElements by that. This might overflow, but we don't
798 // care because it only overflows if allocationSize does, too, and
799 // if that overflows then we shouldn't use this.
800 numElements = llvm::ConstantInt::get(CGF.SizeTy,
801 adjustedCount * arraySizeMultiplier);
802
803 // Compute the size before cookie, and track whether it overflowed.
804 bool overflow;
805 llvm::APInt allocationSize
806 = adjustedCount.umul_ov(typeSizeMultiplier, overflow);
807 hasAnyOverflow |= overflow;
808
809 // Add in the cookie, and check whether it's overflowed.
810 if (cookieSize != 0) {
811 // Save the current size without a cookie. This shouldn't be
812 // used if there was overflow.
813 sizeWithoutCookie = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
814
815 allocationSize = allocationSize.uadd_ov(cookieSize, overflow);
816 hasAnyOverflow |= overflow;
817 }
818
819 // On overflow, produce a -1 so operator new will fail.
820 if (hasAnyOverflow) {
821 size = llvm::Constant::getAllOnesValue(CGF.SizeTy);
822 } else {
823 size = llvm::ConstantInt::get(CGF.SizeTy, allocationSize);
824 }
825
826 // Otherwise, we might need to use the overflow intrinsics.
827 } else {
828 // There are up to five conditions we need to test for:
829 // 1) if isSigned, we need to check whether numElements is negative;
830 // 2) if numElementsWidth > sizeWidth, we need to check whether
831 // numElements is larger than something representable in size_t;
832 // 3) if minElements > 0, we need to check whether numElements is smaller
833 // than that.
834 // 4) we need to compute
835 // sizeWithoutCookie := numElements * typeSizeMultiplier
836 // and check whether it overflows; and
837 // 5) if we need a cookie, we need to compute
838 // size := sizeWithoutCookie + cookieSize
839 // and check whether it overflows.
840
841 llvm::Value *hasOverflow = nullptr;
842
843 // If numElementsWidth > sizeWidth, then one way or another, we're
844 // going to have to do a comparison for (2), and this happens to
845 // take care of (1), too.
846 if (numElementsWidth > sizeWidth) {
847 llvm::APInt threshold =
848 llvm::APInt::getOneBitSet(numElementsWidth, sizeWidth);
849
850 llvm::Value *thresholdV
851 = llvm::ConstantInt::get(numElementsType, threshold);
852
853 hasOverflow = CGF.Builder.CreateICmpUGE(numElements, thresholdV);
854 numElements = CGF.Builder.CreateTrunc(numElements, CGF.SizeTy);
855
856 // Otherwise, if we're signed, we want to sext up to size_t.
857 } else if (isSigned) {
858 if (numElementsWidth < sizeWidth)
859 numElements = CGF.Builder.CreateSExt(numElements, CGF.SizeTy);
860
861 // If there's a non-1 type size multiplier, then we can do the
862 // signedness check at the same time as we do the multiply
863 // because a negative number times anything will cause an
864 // unsigned overflow. Otherwise, we have to do it here. But at least
865 // in this case, we can subsume the >= minElements check.
866 if (typeSizeMultiplier == 1)
867 hasOverflow = CGF.Builder.CreateICmpSLT(numElements,
868 llvm::ConstantInt::get(CGF.SizeTy, minElements));
869
870 // Otherwise, zext up to size_t if necessary.
871 } else if (numElementsWidth < sizeWidth) {
872 numElements = CGF.Builder.CreateZExt(numElements, CGF.SizeTy);
873 }
874
875 assert(numElements->getType() == CGF.SizeTy);
876
877 if (minElements) {
878 // Don't allow allocation of fewer elements than we have initializers.
879 if (!hasOverflow) {
880 hasOverflow = CGF.Builder.CreateICmpULT(numElements,
881 llvm::ConstantInt::get(CGF.SizeTy, minElements));
882 } else if (numElementsWidth > sizeWidth) {
883 // The other existing overflow subsumes this check.
884 // We do an unsigned comparison, since any signed value < -1 is
885 // taken care of either above or below.
886 hasOverflow = CGF.Builder.CreateOr(hasOverflow,
887 CGF.Builder.CreateICmpULT(numElements,
888 llvm::ConstantInt::get(CGF.SizeTy, minElements)));
889 }
890 }
891
892 size = numElements;
893
894 // Multiply by the type size if necessary. This multiplier
895 // includes all the factors for nested arrays.
896 //
897 // This step also causes numElements to be scaled up by the
898 // nested-array factor if necessary. Overflow on this computation
899 // can be ignored because the result shouldn't be used if
900 // allocation fails.
901 if (typeSizeMultiplier != 1) {
902 llvm::Function *umul_with_overflow
903 = CGF.CGM.getIntrinsic(llvm::Intrinsic::umul_with_overflow, CGF.SizeTy);
904
905 llvm::Value *tsmV =
906 llvm::ConstantInt::get(CGF.SizeTy, typeSizeMultiplier);
907 llvm::Value *result =
908 CGF.Builder.CreateCall(umul_with_overflow, {size, tsmV});
909
910 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
911 if (hasOverflow)
912 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
913 else
914 hasOverflow = overflowed;
915
916 size = CGF.Builder.CreateExtractValue(result, 0);
917
918 // Also scale up numElements by the array size multiplier.
919 if (arraySizeMultiplier != 1) {
920 // If the base element type size is 1, then we can re-use the
921 // multiply we just did.
922 if (typeSize.isOne()) {
923 assert(arraySizeMultiplier == typeSizeMultiplier);
924 numElements = size;
925
926 // Otherwise we need a separate multiply.
927 } else {
928 llvm::Value *asmV =
929 llvm::ConstantInt::get(CGF.SizeTy, arraySizeMultiplier);
930 numElements = CGF.Builder.CreateMul(numElements, asmV);
931 }
932 }
933 } else {
934 // numElements doesn't need to be scaled.
935 assert(arraySizeMultiplier == 1);
936 }
937
938 // Add in the cookie size if necessary.
939 if (cookieSize != 0) {
940 sizeWithoutCookie = size;
941
942 llvm::Function *uadd_with_overflow
943 = CGF.CGM.getIntrinsic(llvm::Intrinsic::uadd_with_overflow, CGF.SizeTy);
944
945 llvm::Value *cookieSizeV = llvm::ConstantInt::get(CGF.SizeTy, cookieSize);
946 llvm::Value *result =
947 CGF.Builder.CreateCall(uadd_with_overflow, {size, cookieSizeV});
948
949 llvm::Value *overflowed = CGF.Builder.CreateExtractValue(result, 1);
950 if (hasOverflow)
951 hasOverflow = CGF.Builder.CreateOr(hasOverflow, overflowed);
952 else
953 hasOverflow = overflowed;
954
955 size = CGF.Builder.CreateExtractValue(result, 0);
956 }
957
958 // If we had any possibility of dynamic overflow, make a select to
959 // overwrite 'size' with an all-ones value, which should cause
960 // operator new to throw.
961 if (hasOverflow)
962 size = CGF.Builder.CreateSelect(hasOverflow,
963 llvm::Constant::getAllOnesValue(CGF.SizeTy),
964 size);
965 }
966
967 if (cookieSize == 0)
968 sizeWithoutCookie = size;
969 else
970 assert(sizeWithoutCookie && "didn't set sizeWithoutCookie?");
971
972 return size;
973}
974
976 QualType AllocType, Address NewPtr,
977 AggValueSlot::Overlap_t MayOverlap) {
978 // FIXME: Refactor with EmitExprAsInit.
979 switch (CGF.getEvaluationKind(AllocType)) {
980 case TEK_Scalar:
981 CGF.EmitScalarInit(Init, nullptr,
982 CGF.MakeAddrLValue(NewPtr, AllocType), false);
983 return;
984 case TEK_Complex:
985 CGF.EmitComplexExprIntoLValue(Init, CGF.MakeAddrLValue(NewPtr, AllocType),
986 /*isInit*/ true);
987 return;
988 case TEK_Aggregate: {
989 AggValueSlot Slot
990 = AggValueSlot::forAddr(NewPtr, AllocType.getQualifiers(),
994 MayOverlap, AggValueSlot::IsNotZeroed,
996 CGF.EmitAggExpr(Init, Slot);
997 return;
998 }
999 }
1000 llvm_unreachable("bad evaluation kind");
1001}
1002
1004 const CXXNewExpr *E, QualType ElementType, llvm::Type *ElementTy,
1005 Address BeginPtr, llvm::Value *NumElements,
1006 llvm::Value *AllocSizeWithoutCookie) {
1007 // If we have a type with trivial initialization and no initializer,
1008 // there's nothing to do.
1009 if (!E->hasInitializer())
1010 return;
1011
1012 Address CurPtr = BeginPtr;
1013
1014 unsigned InitListElements = 0;
1015
1016 const Expr *Init = E->getInitializer();
1017 Address EndOfInit = Address::invalid();
1018 QualType::DestructionKind DtorKind = ElementType.isDestructedType();
1019 CleanupDeactivationScope deactivation(*this);
1020 bool pushedCleanup = false;
1021
1022 CharUnits ElementSize = getContext().getTypeSizeInChars(ElementType);
1023 CharUnits ElementAlign =
1024 BeginPtr.getAlignment().alignmentOfArrayElement(ElementSize);
1025
1026 // Attempt to perform zero-initialization using memset.
1027 auto TryMemsetInitialization = [&]() -> bool {
1028 // FIXME: If the type is a pointer-to-data-member under the Itanium ABI,
1029 // we can initialize with a memset to -1.
1030 if (!CGM.getTypes().isZeroInitializable(ElementType))
1031 return false;
1032
1033 // Optimization: since zero initialization will just set the memory
1034 // to all zeroes, generate a single memset to do it in one shot.
1035
1036 // Subtract out the size of any elements we've already initialized.
1037 auto *RemainingSize = AllocSizeWithoutCookie;
1038 if (InitListElements) {
1039 // We know this can't overflow; we check this when doing the allocation.
1040 auto *InitializedSize = llvm::ConstantInt::get(
1041 RemainingSize->getType(),
1042 getContext().getTypeSizeInChars(ElementType).getQuantity() *
1043 InitListElements);
1044 RemainingSize = Builder.CreateSub(RemainingSize, InitializedSize);
1045 }
1046
1047 // Create the memset.
1048 Builder.CreateMemSet(CurPtr, Builder.getInt8(0), RemainingSize, false);
1049 return true;
1050 };
1051
1052 const InitListExpr *ILE = dyn_cast<InitListExpr>(Init);
1053 const CXXParenListInitExpr *CPLIE = nullptr;
1054 const StringLiteral *SL = nullptr;
1055 const ObjCEncodeExpr *OCEE = nullptr;
1056 const Expr *IgnoreParen = nullptr;
1057 if (!ILE) {
1058 IgnoreParen = Init->IgnoreParenImpCasts();
1059 CPLIE = dyn_cast<CXXParenListInitExpr>(IgnoreParen);
1060 SL = dyn_cast<StringLiteral>(IgnoreParen);
1061 OCEE = dyn_cast<ObjCEncodeExpr>(IgnoreParen);
1062 }
1063
1064 // If the initializer is an initializer list, first do the explicit elements.
1065 if (ILE || CPLIE || SL || OCEE) {
1066 // Initializing from a (braced) string literal is a special case; the init
1067 // list element does not initialize a (single) array element.
1068 if ((ILE && ILE->isStringLiteralInit()) || SL || OCEE) {
1069 if (!ILE)
1070 Init = IgnoreParen;
1071 // Initialize the initial portion of length equal to that of the string
1072 // literal. The allocation must be for at least this much; we emitted a
1073 // check for that earlier.
1074 AggValueSlot Slot =
1075 AggValueSlot::forAddr(CurPtr, ElementType.getQualifiers(),
1082 EmitAggExpr(ILE ? ILE->getInit(0) : Init, Slot);
1083
1084 // Move past these elements.
1085 InitListElements =
1086 cast<ConstantArrayType>(Init->getType()->getAsArrayTypeUnsafe())
1087 ->getZExtSize();
1088 CurPtr = Builder.CreateConstInBoundsGEP(
1089 CurPtr, InitListElements, "string.init.end");
1090
1091 // Zero out the rest, if any remain.
1092 llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);
1093 if (!ConstNum || !ConstNum->equalsInt(InitListElements)) {
1094 bool OK = TryMemsetInitialization();
1095 (void)OK;
1096 assert(OK && "couldn't memset character type?");
1097 }
1098 return;
1099 }
1100
1101 ArrayRef<const Expr *> InitExprs =
1102 ILE ? ILE->inits() : CPLIE->getInitExprs();
1103 InitListElements = InitExprs.size();
1104
1105 // If this is a multi-dimensional array new, we will initialize multiple
1106 // elements with each init list element.
1107 QualType AllocType = E->getAllocatedType();
1108 if (const ConstantArrayType *CAT = dyn_cast_or_null<ConstantArrayType>(
1109 AllocType->getAsArrayTypeUnsafe())) {
1110 ElementTy = ConvertTypeForMem(AllocType);
1111 CurPtr = CurPtr.withElementType(ElementTy);
1112 InitListElements *= getContext().getConstantArrayElementCount(CAT);
1113 }
1114
1115 // Enter a partial-destruction Cleanup if necessary.
1116 if (DtorKind) {
1117 AllocaTrackerRAII AllocaTracker(*this);
1118 // In principle we could tell the Cleanup where we are more
1119 // directly, but the control flow can get so varied here that it
1120 // would actually be quite complex. Therefore we go through an
1121 // alloca.
1122 llvm::Instruction *DominatingIP =
1123 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(Int8PtrTy));
1124 EndOfInit = CreateTempAlloca(BeginPtr.getType(), getPointerAlign(),
1125 "array.init.end");
1127 EndOfInit, ElementType, ElementAlign,
1128 getDestroyer(DtorKind));
1129 cast<EHCleanupScope>(*EHStack.find(EHStack.stable_begin()))
1130 .AddAuxAllocas(AllocaTracker.Take());
1132 {EHStack.stable_begin(), DominatingIP});
1133 pushedCleanup = true;
1134 }
1135
1136 CharUnits StartAlign = CurPtr.getAlignment();
1137 unsigned i = 0;
1138 for (const Expr *IE : InitExprs) {
1139 // Tell the cleanup that it needs to destroy up to this
1140 // element. TODO: some of these stores can be trivially
1141 // observed to be unnecessary.
1142 if (EndOfInit.isValid()) {
1143 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1144 }
1145 // FIXME: If the last initializer is an incomplete initializer list for
1146 // an array, and we have an array filler, we can fold together the two
1147 // initialization loops.
1148 StoreAnyExprIntoOneUnit(*this, IE, IE->getType(), CurPtr,
1150 CurPtr = Address(Builder.CreateInBoundsGEP(CurPtr.getElementType(),
1151 CurPtr.emitRawPointer(*this),
1152 Builder.getSize(1),
1153 "array.exp.next"),
1154 CurPtr.getElementType(),
1155 StartAlign.alignmentAtOffset((++i) * ElementSize));
1156 }
1157
1158 // The remaining elements are filled with the array filler expression.
1159 Init = ILE ? ILE->getArrayFiller() : CPLIE->getArrayFiller();
1160
1161 // Extract the initializer for the individual array elements by pulling
1162 // out the array filler from all the nested initializer lists. This avoids
1163 // generating a nested loop for the initialization.
1164 while (Init && Init->getType()->isConstantArrayType()) {
1165 auto *SubILE = dyn_cast<InitListExpr>(Init);
1166 if (!SubILE)
1167 break;
1168 assert(SubILE->getNumInits() == 0 && "explicit inits in array filler?");
1169 Init = SubILE->getArrayFiller();
1170 }
1171
1172 // Switch back to initializing one base element at a time.
1173 CurPtr = CurPtr.withElementType(BeginPtr.getElementType());
1174 }
1175
1176 // If all elements have already been initialized, skip any further
1177 // initialization.
1178 llvm::ConstantInt *ConstNum = dyn_cast<llvm::ConstantInt>(NumElements);
1179 if (ConstNum && ConstNum->getZExtValue() <= InitListElements) {
1180 return;
1181 }
1182
1183 assert(Init && "have trailing elements to initialize but no initializer");
1184
1185 // If this is a constructor call, try to optimize it out, and failing that
1186 // emit a single loop to initialize all remaining elements.
1187 if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) {
1188 CXXConstructorDecl *Ctor = CCE->getConstructor();
1189 if (Ctor->isTrivial()) {
1190 // If new expression did not specify value-initialization, then there
1191 // is no initialization.
1192 if (!CCE->requiresZeroInitialization() || Ctor->getParent()->isEmpty())
1193 return;
1194
1195 if (TryMemsetInitialization())
1196 return;
1197 }
1198
1199 // Store the new Cleanup position for irregular Cleanups.
1200 //
1201 // FIXME: Share this cleanup with the constructor call emission rather than
1202 // having it create a cleanup of its own.
1203 if (EndOfInit.isValid())
1204 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1205
1206 // Emit a constructor call loop to initialize the remaining elements.
1207 if (InitListElements)
1208 NumElements = Builder.CreateSub(
1209 NumElements,
1210 llvm::ConstantInt::get(NumElements->getType(), InitListElements));
1211 EmitCXXAggrConstructorCall(Ctor, NumElements, CurPtr, CCE,
1212 /*NewPointerIsChecked*/true,
1213 CCE->requiresZeroInitialization());
1214 return;
1215 }
1216
1217 // If this is value-initialization, we can usually use memset.
1218 ImplicitValueInitExpr IVIE(ElementType);
1220 if (TryMemsetInitialization())
1221 return;
1222
1223 // Switch to an ImplicitValueInitExpr for the element type. This handles
1224 // only one case: multidimensional array new of pointers to members. In
1225 // all other cases, we already have an initializer for the array element.
1226 Init = &IVIE;
1227 }
1228
1229 // At this point we should have found an initializer for the individual
1230 // elements of the array.
1231 assert(getContext().hasSameUnqualifiedType(ElementType, Init->getType()) &&
1232 "got wrong type of element to initialize");
1233
1234 // If we have an empty initializer list, we can usually use memset.
1235 if (auto *ILE = dyn_cast<InitListExpr>(Init))
1236 if (ILE->getNumInits() == 0 && TryMemsetInitialization())
1237 return;
1238
1239 // If we have a struct whose every field is value-initialized, we can
1240 // usually use memset.
1241 if (auto *ILE = dyn_cast<InitListExpr>(Init)) {
1242 if (const RecordType *RType =
1243 ILE->getType()->getAsCanonical<RecordType>()) {
1244 if (RType->getDecl()->isStruct()) {
1245 const RecordDecl *RD = RType->getDecl()->getDefinitionOrSelf();
1246 unsigned NumElements = 0;
1247 if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RD))
1248 NumElements = CXXRD->getNumBases();
1249 for (auto *Field : RD->fields())
1250 if (!Field->isUnnamedBitField())
1251 ++NumElements;
1252 // FIXME: Recurse into nested InitListExprs.
1253 if (ILE->getNumInits() == NumElements)
1254 for (unsigned i = 0, e = ILE->getNumInits(); i != e; ++i)
1255 if (!isa<ImplicitValueInitExpr>(ILE->getInit(i)))
1256 --NumElements;
1257 if (ILE->getNumInits() == NumElements && TryMemsetInitialization())
1258 return;
1259 }
1260 }
1261 }
1262
1263 // Create the loop blocks.
1264 llvm::BasicBlock *EntryBB = Builder.GetInsertBlock();
1265 llvm::BasicBlock *LoopBB = createBasicBlock("new.loop");
1266 llvm::BasicBlock *ContBB = createBasicBlock("new.loop.end");
1267
1268 // Find the end of the array, hoisted out of the loop.
1269 llvm::Value *EndPtr = Builder.CreateInBoundsGEP(
1270 BeginPtr.getElementType(), BeginPtr.emitRawPointer(*this), NumElements,
1271 "array.end");
1272
1273 // If the number of elements isn't constant, we have to now check if there is
1274 // anything left to initialize.
1275 if (!ConstNum) {
1276 llvm::Value *IsEmpty = Builder.CreateICmpEQ(CurPtr.emitRawPointer(*this),
1277 EndPtr, "array.isempty");
1278 Builder.CreateCondBr(IsEmpty, ContBB, LoopBB);
1279 }
1280
1281 // Enter the loop.
1282 EmitBlock(LoopBB);
1283
1284 // Set up the current-element phi.
1285 llvm::PHINode *CurPtrPhi =
1286 Builder.CreatePHI(CurPtr.getType(), 2, "array.cur");
1287 CurPtrPhi->addIncoming(CurPtr.emitRawPointer(*this), EntryBB);
1288
1289 CurPtr = Address(CurPtrPhi, CurPtr.getElementType(), ElementAlign);
1290
1291 // Store the new Cleanup position for irregular Cleanups.
1292 if (EndOfInit.isValid())
1293 Builder.CreateStore(CurPtr.emitRawPointer(*this), EndOfInit);
1294
1295 // Enter a partial-destruction Cleanup if necessary.
1296 if (!pushedCleanup && needsEHCleanup(DtorKind)) {
1297 llvm::Instruction *DominatingIP =
1298 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(Int8PtrTy));
1300 CurPtr.emitRawPointer(*this), ElementType,
1301 ElementAlign, getDestroyer(DtorKind));
1303 {EHStack.stable_begin(), DominatingIP});
1304 }
1305
1306 // Emit the initializer into this element.
1307 StoreAnyExprIntoOneUnit(*this, Init, Init->getType(), CurPtr,
1309
1310 // Leave the Cleanup if we entered one.
1311 deactivation.ForceDeactivate();
1312
1313 // Advance to the next element by adjusting the pointer type as necessary.
1314 llvm::Value *NextPtr = Builder.CreateConstInBoundsGEP1_32(
1315 ElementTy, CurPtr.emitRawPointer(*this), 1, "array.next");
1316
1317 // Check whether we've gotten to the end of the array and, if so,
1318 // exit the loop.
1319 llvm::Value *IsEnd = Builder.CreateICmpEQ(NextPtr, EndPtr, "array.atend");
1320 Builder.CreateCondBr(IsEnd, ContBB, LoopBB);
1321 CurPtrPhi->addIncoming(NextPtr, Builder.GetInsertBlock());
1322
1323 EmitBlock(ContBB);
1324}
1325
1327 QualType ElementType, llvm::Type *ElementTy,
1328 Address NewPtr, llvm::Value *NumElements,
1329 llvm::Value *AllocSizeWithoutCookie) {
1330 ApplyDebugLocation DL(CGF, E);
1331 if (E->isArray())
1332 CGF.EmitNewArrayInitializer(E, ElementType, ElementTy, NewPtr, NumElements,
1333 AllocSizeWithoutCookie);
1334 else if (const Expr *Init = E->getInitializer())
1337}
1338
1339/// Emit a call to an operator new or operator delete function, as implicitly
1340/// created by new-expressions and delete-expressions.
1342 const FunctionDecl *CalleeDecl,
1343 const FunctionProtoType *CalleeType,
1344 const CallArgList &Args) {
1345 llvm::CallBase *CallOrInvoke;
1346 llvm::Constant *CalleePtr = CGF.CGM.GetAddrOfFunction(CalleeDecl);
1347 CGCallee Callee = CGCallee::forDirect(CalleePtr, GlobalDecl(CalleeDecl));
1348 RValue RV =
1350 Args, CalleeType, /*ChainCall=*/false),
1351 Callee, ReturnValueSlot(), Args, &CallOrInvoke);
1352
1353 /// C++1y [expr.new]p10:
1354 /// [In a new-expression,] an implementation is allowed to omit a call
1355 /// to a replaceable global allocation function.
1356 ///
1357 /// We model such elidable calls with the 'builtin' attribute.
1358 llvm::Function *Fn = dyn_cast<llvm::Function>(CalleePtr);
1359 if (CalleeDecl->isReplaceableGlobalAllocationFunction() &&
1360 Fn && Fn->hasFnAttribute(llvm::Attribute::NoBuiltin)) {
1361 CallOrInvoke->addFnAttr(llvm::Attribute::Builtin);
1362 }
1363
1364 return RV;
1365}
1366
1368 const CallExpr *TheCall,
1369 bool IsDelete) {
1370 CallArgList Args;
1371 EmitCallArgs(Args, Type, TheCall->arguments());
1372 // Find the allocation or deallocation function that we're calling.
1373 ASTContext &Ctx = getContext();
1375 .getCXXOperatorName(IsDelete ? OO_Delete : OO_New);
1376
1377 for (auto *Decl : Ctx.getTranslationUnitDecl()->lookup(Name))
1378 if (auto *FD = dyn_cast<FunctionDecl>(Decl))
1379 if (Ctx.hasSameType(FD->getType(), QualType(Type, 0))) {
1380 RValue RV = EmitNewDeleteCall(*this, FD, Type, Args);
1381 if (auto *CB = dyn_cast_if_present<llvm::CallBase>(RV.getScalarVal())) {
1382 if (SanOpts.has(SanitizerKind::AllocToken)) {
1383 // Set !alloc_token metadata.
1384 EmitAllocToken(CB, TheCall);
1385 }
1386 }
1387 return RV;
1388 }
1389 llvm_unreachable("predeclared global operator new/delete is missing");
1390}
1391
1392namespace {
1393 /// A cleanup to call the given 'operator delete' function upon abnormal
1394 /// exit from a new expression. Templated on a traits type that deals with
1395 /// ensuring that the arguments dominate the cleanup if necessary.
1396 template<typename Traits>
1397 class CallDeleteDuringNew final : public EHScopeStack::Cleanup {
1398 /// Type used to hold llvm::Value*s.
1399 typedef typename Traits::ValueTy ValueTy;
1400 /// Type used to hold RValues.
1401 typedef typename Traits::RValueTy RValueTy;
1402 struct PlacementArg {
1403 RValueTy ArgValue;
1405 };
1406
1407 unsigned NumPlacementArgs : 30;
1408 LLVM_PREFERRED_TYPE(AlignedAllocationMode)
1409 unsigned PassAlignmentToPlacementDelete : 1;
1410 const FunctionDecl *OperatorDelete;
1411 RValueTy TypeIdentity;
1412 ValueTy Ptr;
1413 ValueTy AllocSize;
1414 CharUnits AllocAlign;
1415
1416 PlacementArg *getPlacementArgs() {
1417 return reinterpret_cast<PlacementArg *>(this + 1);
1418 }
1419
1420 public:
1421 static size_t getExtraSize(size_t NumPlacementArgs) {
1422 return NumPlacementArgs * sizeof(PlacementArg);
1423 }
1424
1425 CallDeleteDuringNew(size_t NumPlacementArgs,
1426 const FunctionDecl *OperatorDelete,
1427 RValueTy TypeIdentity, ValueTy Ptr, ValueTy AllocSize,
1428 const ImplicitAllocationParameters &IAP,
1429 CharUnits AllocAlign)
1430 : NumPlacementArgs(NumPlacementArgs),
1431 PassAlignmentToPlacementDelete(
1432 isAlignedAllocation(IAP.PassAlignment)),
1433 OperatorDelete(OperatorDelete), TypeIdentity(TypeIdentity), Ptr(Ptr),
1434 AllocSize(AllocSize), AllocAlign(AllocAlign) {}
1435
1436 void setPlacementArg(unsigned I, RValueTy Arg, QualType Type) {
1437 assert(I < NumPlacementArgs && "index out of range");
1438 getPlacementArgs()[I] = {Arg, Type};
1439 }
1440
1441 void Emit(CodeGenFunction &CGF, Flags flags) override {
1442 const auto *FPT = OperatorDelete->getType()->castAs<FunctionProtoType>();
1443 CallArgList DeleteArgs;
1444 unsigned FirstNonTypeArg = 0;
1445 TypeAwareAllocationMode TypeAwareDeallocation =
1446 TypeAwareAllocationMode::No;
1447 if (OperatorDelete->isTypeAwareOperatorNewOrDelete()) {
1448 TypeAwareDeallocation = TypeAwareAllocationMode::Yes;
1449 QualType SpecializedTypeIdentity = FPT->getParamType(0);
1450 ++FirstNonTypeArg;
1451 DeleteArgs.add(Traits::get(CGF, TypeIdentity), SpecializedTypeIdentity);
1452 }
1453 // The first argument after type-identity parameter (if any) is always
1454 // a void* (or C* for a destroying operator delete for class type C).
1455 DeleteArgs.add(Traits::get(CGF, Ptr), FPT->getParamType(FirstNonTypeArg));
1456
1457 // Figure out what other parameters we should be implicitly passing.
1458 UsualDeleteParams Params;
1459 if (NumPlacementArgs) {
1460 // A placement deallocation function is implicitly passed an alignment
1461 // if the placement allocation function was, but is never passed a size.
1462 Params.Alignment =
1463 alignedAllocationModeFromBool(PassAlignmentToPlacementDelete);
1464 Params.TypeAwareDelete = TypeAwareDeallocation;
1466 } else {
1467 // For a non-placement new-expression, 'operator delete' can take a
1468 // size and/or an alignment if it has the right parameters.
1469 Params = OperatorDelete->getUsualDeleteParams();
1470 }
1471
1472 assert(!Params.DestroyingDelete &&
1473 "should not call destroying delete in a new-expression");
1474
1475 // The second argument can be a std::size_t (for non-placement delete).
1476 if (Params.Size)
1477 DeleteArgs.add(Traits::get(CGF, AllocSize),
1478 CGF.getContext().getSizeType());
1479
1480 // The next (second or third) argument can be a std::align_val_t, which
1481 // is an enum whose underlying type is std::size_t.
1482 // FIXME: Use the right type as the parameter type. Note that in a call
1483 // to operator delete(size_t, ...), we may not have it available.
1484 if (isAlignedAllocation(Params.Alignment))
1485 DeleteArgs.add(RValue::get(llvm::ConstantInt::get(
1486 CGF.SizeTy, AllocAlign.getQuantity())),
1487 CGF.getContext().getSizeType());
1488
1489 // Pass the rest of the arguments, which must match exactly.
1490 for (unsigned I = 0; I != NumPlacementArgs; ++I) {
1491 auto Arg = getPlacementArgs()[I];
1492 DeleteArgs.add(Traits::get(CGF, Arg.ArgValue), Arg.ArgType);
1493 }
1494
1495 // Call 'operator delete'.
1496 EmitNewDeleteCall(CGF, OperatorDelete, FPT, DeleteArgs);
1497 }
1498 };
1499}
1500
1501/// Enter a cleanup to call 'operator delete' if the initializer in a
1502/// new-expression throws.
1504 RValue TypeIdentity, Address NewPtr,
1505 llvm::Value *AllocSize, CharUnits AllocAlign,
1506 const CallArgList &NewArgs) {
1507 unsigned NumNonPlacementArgs = E->getNumImplicitArgs();
1508
1509 // If we're not inside a conditional branch, then the cleanup will
1510 // dominate and we can do the easier (and more efficient) thing.
1511 if (!CGF.isInConditionalBranch()) {
1512 struct DirectCleanupTraits {
1513 typedef llvm::Value *ValueTy;
1514 typedef RValue RValueTy;
1515 static RValue get(CodeGenFunction &, ValueTy V) { return RValue::get(V); }
1516 static RValue get(CodeGenFunction &, RValueTy V) { return V; }
1517 };
1518
1519 typedef CallDeleteDuringNew<DirectCleanupTraits> DirectCleanup;
1520
1521 DirectCleanup *Cleanup = CGF.EHStack.pushCleanupWithExtra<DirectCleanup>(
1523 TypeIdentity, NewPtr.emitRawPointer(CGF), AllocSize,
1524 E->implicitAllocationParameters(), AllocAlign);
1525 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1526 auto &Arg = NewArgs[I + NumNonPlacementArgs];
1527 Cleanup->setPlacementArg(I, Arg.getRValue(CGF), Arg.Ty);
1528 }
1529
1530 return;
1531 }
1532
1533 // Otherwise, we need to save all this stuff.
1535 DominatingValue<RValue>::save(CGF, RValue::get(NewPtr, CGF));
1538 DominatingValue<RValue>::saved_type SavedTypeIdentity =
1539 DominatingValue<RValue>::save(CGF, TypeIdentity);
1540 struct ConditionalCleanupTraits {
1542 typedef DominatingValue<RValue>::saved_type RValueTy;
1543 static RValue get(CodeGenFunction &CGF, ValueTy V) {
1544 return V.restore(CGF);
1545 }
1546 };
1547 typedef CallDeleteDuringNew<ConditionalCleanupTraits> ConditionalCleanup;
1548
1549 ConditionalCleanup *Cleanup =
1550 CGF.EHStack.pushCleanupWithExtra<ConditionalCleanup>(
1552 SavedTypeIdentity, SavedNewPtr, SavedAllocSize,
1553 E->implicitAllocationParameters(), AllocAlign);
1554 for (unsigned I = 0, N = E->getNumPlacementArgs(); I != N; ++I) {
1555 auto &Arg = NewArgs[I + NumNonPlacementArgs];
1556 Cleanup->setPlacementArg(
1557 I, DominatingValue<RValue>::save(CGF, Arg.getRValue(CGF)), Arg.Ty);
1558 }
1559
1560 CGF.initFullExprCleanup();
1561}
1562
1564 // The element type being allocated.
1566
1567 // 1. Build a call to the allocation function.
1568 FunctionDecl *allocator = E->getOperatorNew();
1569
1570 // If there is a brace-initializer or C++20 parenthesized initializer, cannot
1571 // allocate fewer elements than inits.
1572 unsigned minElements = 0;
1573 unsigned IndexOfAlignArg = 1;
1574 if (E->isArray() && E->hasInitializer()) {
1575 const Expr *Init = E->getInitializer();
1576 const InitListExpr *ILE = dyn_cast<InitListExpr>(Init);
1577 const CXXParenListInitExpr *CPLIE = dyn_cast<CXXParenListInitExpr>(Init);
1578 const Expr *IgnoreParen = Init->IgnoreParenImpCasts();
1579 if ((ILE && ILE->isStringLiteralInit()) ||
1580 isa<StringLiteral>(IgnoreParen) || isa<ObjCEncodeExpr>(IgnoreParen)) {
1581 minElements =
1582 cast<ConstantArrayType>(Init->getType()->getAsArrayTypeUnsafe())
1583 ->getZExtSize();
1584 } else if (ILE || CPLIE) {
1585 minElements = ILE ? ILE->getNumInits() : CPLIE->getInitExprs().size();
1586 }
1587 }
1588
1589 llvm::Value *numElements = nullptr;
1590 llvm::Value *allocSizeWithoutCookie = nullptr;
1591 llvm::Value *allocSize =
1592 EmitCXXNewAllocSize(*this, E, minElements, numElements,
1593 allocSizeWithoutCookie);
1594 CharUnits allocAlign = getContext().getTypeAlignInChars(allocType);
1595
1596 // Emit the allocation call. If the allocator is a global placement
1597 // operator, just "inline" it directly.
1598 Address allocation = Address::invalid();
1599 CallArgList allocatorArgs;
1600 RValue TypeIdentityArg;
1601 if (allocator->isReservedGlobalPlacementOperator()) {
1602 assert(E->getNumPlacementArgs() == 1);
1603 const Expr *arg = *E->placement_arguments().begin();
1604
1605 LValueBaseInfo BaseInfo;
1606 allocation = EmitPointerWithAlignment(arg, &BaseInfo);
1607
1608 // The pointer expression will, in many cases, be an opaque void*.
1609 // In these cases, discard the computed alignment and use the
1610 // formal alignment of the allocated type.
1611 if (BaseInfo.getAlignmentSource() != AlignmentSource::Decl)
1612 allocation.setAlignment(allocAlign);
1613
1614 // Set up allocatorArgs for the call to operator delete if it's not
1615 // the reserved global operator.
1616 if (E->getOperatorDelete() &&
1618 allocatorArgs.add(RValue::get(allocSize), getContext().getSizeType());
1619 allocatorArgs.add(RValue::get(allocation, *this), arg->getType());
1620 }
1621
1622 } else {
1623 const FunctionProtoType *allocatorType =
1624 allocator->getType()->castAs<FunctionProtoType>();
1626 unsigned ParamsToSkip = 0;
1627 if (isTypeAwareAllocation(IAP.PassTypeIdentity)) {
1628 QualType SpecializedTypeIdentity = allocatorType->getParamType(0);
1629 CXXScalarValueInitExpr TypeIdentityParam(SpecializedTypeIdentity, nullptr,
1630 SourceLocation());
1631 TypeIdentityArg = EmitAnyExprToTemp(&TypeIdentityParam);
1632 allocatorArgs.add(TypeIdentityArg, SpecializedTypeIdentity);
1633 ++ParamsToSkip;
1634 ++IndexOfAlignArg;
1635 }
1636 // The allocation size is the first argument.
1637 QualType sizeType = getContext().getSizeType();
1638 allocatorArgs.add(RValue::get(allocSize), sizeType);
1639 ++ParamsToSkip;
1640
1641 if (allocSize != allocSizeWithoutCookie) {
1642 CharUnits cookieAlign = getSizeAlign(); // FIXME: Ask the ABI.
1643 allocAlign = std::max(allocAlign, cookieAlign);
1644 }
1645
1646 // The allocation alignment may be passed as the second argument.
1647 if (isAlignedAllocation(IAP.PassAlignment)) {
1648 QualType AlignValT = sizeType;
1649 if (allocatorType->getNumParams() > IndexOfAlignArg) {
1650 AlignValT = allocatorType->getParamType(IndexOfAlignArg);
1651 assert(getContext().hasSameUnqualifiedType(
1652 AlignValT->castAsEnumDecl()->getIntegerType(), sizeType) &&
1653 "wrong type for alignment parameter");
1654 ++ParamsToSkip;
1655 } else {
1656 // Corner case, passing alignment to 'operator new(size_t, ...)'.
1657 assert(allocator->isVariadic() && "can't pass alignment to allocator");
1658 }
1659 allocatorArgs.add(
1660 RValue::get(llvm::ConstantInt::get(SizeTy, allocAlign.getQuantity())),
1661 AlignValT);
1662 }
1663
1664 // FIXME: Why do we not pass a CalleeDecl here?
1665 EmitCallArgs(allocatorArgs, allocatorType, E->placement_arguments(),
1666 /*AC*/AbstractCallee(), /*ParamsToSkip*/ParamsToSkip);
1667
1668 RValue RV =
1669 EmitNewDeleteCall(*this, allocator, allocatorType, allocatorArgs);
1670
1671 if (auto *newCall = dyn_cast<llvm::CallBase>(RV.getScalarVal())) {
1672 if (auto *CGDI = getDebugInfo()) {
1673 // Set !heapallocsite metadata on the call to operator new.
1674 CGDI->addHeapAllocSiteMetadata(newCall, allocType, E->getExprLoc());
1675 }
1676 if (SanOpts.has(SanitizerKind::AllocToken)) {
1677 // Set !alloc_token metadata.
1678 EmitAllocToken(newCall, allocType);
1679 }
1680 }
1681
1682 // If this was a call to a global replaceable allocation function that does
1683 // not take an alignment argument, the allocator is known to produce
1684 // storage that's suitably aligned for any object that fits, up to a known
1685 // threshold. Otherwise assume it's suitably aligned for the allocated type.
1686 CharUnits allocationAlign = allocAlign;
1687 if (!E->passAlignment() &&
1688 allocator->isReplaceableGlobalAllocationFunction()) {
1689 unsigned AllocatorAlign = llvm::bit_floor(std::min<uint64_t>(
1690 Target.getNewAlign(), getContext().getTypeSize(allocType)));
1691 allocationAlign = std::max(
1692 allocationAlign, getContext().toCharUnitsFromBits(AllocatorAlign));
1693 }
1694
1695 allocation = Address(RV.getScalarVal(), Int8Ty, allocationAlign);
1696 }
1697
1698 // Emit a null check on the allocation result if the allocation
1699 // function is allowed to return null (because it has a non-throwing
1700 // exception spec or is the reserved placement new) and we have an
1701 // interesting initializer will be running sanitizers on the initialization.
1702 bool nullCheck = E->shouldNullCheckAllocation() &&
1703 (!allocType.isPODType(getContext()) || E->hasInitializer() ||
1705
1706 llvm::BasicBlock *nullCheckBB = nullptr;
1707 llvm::BasicBlock *contBB = nullptr;
1708
1709 // The null-check means that the initializer is conditionally
1710 // evaluated.
1711 ConditionalEvaluation conditional(*this);
1712
1713 if (nullCheck) {
1714 conditional.begin(*this);
1715
1716 nullCheckBB = Builder.GetInsertBlock();
1717 llvm::BasicBlock *notNullBB = createBasicBlock("new.notnull");
1718 contBB = createBasicBlock("new.cont");
1719
1720 llvm::Value *isNull = Builder.CreateIsNull(allocation, "new.isnull");
1721 Builder.CreateCondBr(isNull, contBB, notNullBB);
1722 EmitBlock(notNullBB);
1723 }
1724
1725 // If there's an operator delete, enter a cleanup to call it if an
1726 // exception is thrown.
1727 EHScopeStack::stable_iterator operatorDeleteCleanup;
1728 llvm::Instruction *cleanupDominator = nullptr;
1729 if (E->getOperatorDelete() &&
1731 EnterNewDeleteCleanup(*this, E, TypeIdentityArg, allocation, allocSize,
1732 allocAlign, allocatorArgs);
1733 operatorDeleteCleanup = EHStack.stable_begin();
1734 cleanupDominator = Builder.CreateUnreachable();
1735 }
1736
1737 assert((allocSize == allocSizeWithoutCookie) ==
1738 CalculateCookiePadding(*this, E).isZero());
1739 if (allocSize != allocSizeWithoutCookie) {
1740 assert(E->isArray());
1741 allocation = CGM.getCXXABI().InitializeArrayCookie(*this, allocation,
1742 numElements,
1743 E, allocType);
1744 }
1745
1746 llvm::Type *elementTy = ConvertTypeForMem(allocType);
1747 Address result = allocation.withElementType(elementTy);
1748
1749 // Passing pointer through launder.invariant.group to avoid propagation of
1750 // vptrs information which may be included in previous type.
1751 // To not break LTO with different optimizations levels, we do it regardless
1752 // of optimization level.
1753 if (CGM.getCodeGenOpts().StrictVTablePointers &&
1754 allocator->isReservedGlobalPlacementOperator())
1755 result = Builder.CreateLaunderInvariantGroup(result);
1756
1757 // Emit sanitizer checks for pointer value now, so that in the case of an
1758 // array it was checked only once and not at each constructor call. We may
1759 // have already checked that the pointer is non-null.
1760 // FIXME: If we have an array cookie and a potentially-throwing allocator,
1761 // we'll null check the wrong pointer here.
1762 SanitizerSet SkippedChecks;
1763 SkippedChecks.set(SanitizerKind::Null, nullCheck);
1766 result, allocType, result.getAlignment(), SkippedChecks,
1767 numElements);
1768
1769 EmitNewInitializer(*this, E, allocType, elementTy, result, numElements,
1770 allocSizeWithoutCookie);
1771 llvm::Value *resultPtr = result.emitRawPointer(*this);
1772
1773 // Deactivate the 'operator delete' cleanup if we finished
1774 // initialization.
1775 if (operatorDeleteCleanup.isValid()) {
1776 DeactivateCleanupBlock(operatorDeleteCleanup, cleanupDominator);
1777 cleanupDominator->eraseFromParent();
1778 }
1779
1780 if (nullCheck) {
1781 conditional.end(*this);
1782
1783 llvm::BasicBlock *notNullBB = Builder.GetInsertBlock();
1784 EmitBlock(contBB);
1785
1786 llvm::PHINode *PHI = Builder.CreatePHI(resultPtr->getType(), 2);
1787 PHI->addIncoming(resultPtr, notNullBB);
1788 PHI->addIncoming(llvm::Constant::getNullValue(resultPtr->getType()),
1789 nullCheckBB);
1790
1791 resultPtr = PHI;
1792 }
1793
1794 return resultPtr;
1795}
1796
1798 llvm::Value *DeletePtr, QualType DeleteTy,
1799 llvm::Value *NumElements,
1800 CharUnits CookieSize) {
1801 assert((!NumElements && CookieSize.isZero()) ||
1802 DeleteFD->getOverloadedOperator() == OO_Array_Delete);
1803
1804 const auto *DeleteFTy = DeleteFD->getType()->castAs<FunctionProtoType>();
1805 CallArgList DeleteArgs;
1806
1807 auto Params = DeleteFD->getUsualDeleteParams();
1808 auto ParamTypeIt = DeleteFTy->param_type_begin();
1809
1810 std::optional<llvm::AllocaInst *> TagAlloca;
1811 auto EmitTag = [&](QualType TagType, const char *TagName) {
1812 assert(!TagAlloca);
1813 llvm::Type *Ty = getTypes().ConvertType(TagType);
1814 CharUnits Align = CGM.getNaturalTypeAlignment(TagType);
1815 llvm::AllocaInst *TagAllocation = CreateTempAlloca(Ty, TagName);
1816 TagAllocation->setAlignment(Align.getAsAlign());
1817 DeleteArgs.add(RValue::getAggregate(Address(TagAllocation, Ty, Align)),
1818 TagType);
1819 TagAlloca = TagAllocation;
1820 };
1821
1822 // Pass std::type_identity tag if present
1824 EmitTag(*ParamTypeIt++, "typeaware.delete.tag");
1825
1826 // Pass the pointer itself.
1827 QualType ArgTy = *ParamTypeIt++;
1828 DeleteArgs.add(RValue::get(DeletePtr), ArgTy);
1829
1830 // Pass the std::destroying_delete tag if present.
1831 if (Params.DestroyingDelete)
1832 EmitTag(*ParamTypeIt++, "destroying.delete.tag");
1833
1834 // Pass the size if the delete function has a size_t parameter.
1835 if (Params.Size) {
1836 QualType SizeType = *ParamTypeIt++;
1837 CharUnits DeleteTypeSize = getContext().getTypeSizeInChars(DeleteTy);
1838 llvm::Value *Size = llvm::ConstantInt::get(ConvertType(SizeType),
1839 DeleteTypeSize.getQuantity());
1840
1841 // For array new, multiply by the number of elements.
1842 if (NumElements)
1843 Size = Builder.CreateMul(Size, NumElements);
1844
1845 // If there is a cookie, add the cookie size.
1846 if (!CookieSize.isZero())
1847 Size = Builder.CreateAdd(
1848 Size, llvm::ConstantInt::get(SizeTy, CookieSize.getQuantity()));
1849
1850 DeleteArgs.add(RValue::get(Size), SizeType);
1851 }
1852
1853 // Pass the alignment if the delete function has an align_val_t parameter.
1854 if (isAlignedAllocation(Params.Alignment)) {
1855 QualType AlignValType = *ParamTypeIt++;
1856 CharUnits DeleteTypeAlign =
1857 getContext().toCharUnitsFromBits(getContext().getTypeAlignIfKnown(
1858 DeleteTy, true /* NeedsPreferredAlignment */));
1859 llvm::Value *Align = llvm::ConstantInt::get(ConvertType(AlignValType),
1860 DeleteTypeAlign.getQuantity());
1861 DeleteArgs.add(RValue::get(Align), AlignValType);
1862 }
1863
1864 assert(ParamTypeIt == DeleteFTy->param_type_end() &&
1865 "unknown parameter to usual delete function");
1866
1867 // Emit the call to delete.
1868 EmitNewDeleteCall(*this, DeleteFD, DeleteFTy, DeleteArgs);
1869
1870 // If call argument lowering didn't use a generated tag argument alloca we
1871 // remove them
1872 if (TagAlloca && (*TagAlloca)->use_empty())
1873 (*TagAlloca)->eraseFromParent();
1874}
1875namespace {
1876 /// Calls the given 'operator delete' on a single object.
1877 struct CallObjectDelete final : EHScopeStack::Cleanup {
1878 llvm::Value *Ptr;
1879 const FunctionDecl *OperatorDelete;
1880 QualType ElementType;
1881
1882 CallObjectDelete(llvm::Value *Ptr,
1883 const FunctionDecl *OperatorDelete,
1884 QualType ElementType)
1885 : Ptr(Ptr), OperatorDelete(OperatorDelete), ElementType(ElementType) {}
1886
1887 void Emit(CodeGenFunction &CGF, Flags flags) override {
1888 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType);
1889 }
1890 };
1891}
1892
1893void
1895 llvm::Value *CompletePtr,
1896 QualType ElementType) {
1897 EHStack.pushCleanup<CallObjectDelete>(NormalAndEHCleanup, CompletePtr,
1898 OperatorDelete, ElementType);
1899}
1900
1901/// Emit the code for deleting a single object with a destroying operator
1902/// delete. If the element type has a non-virtual destructor, Ptr has already
1903/// been converted to the type of the parameter of 'operator delete'. Otherwise
1904/// Ptr points to an object of the static type.
1906 const CXXDeleteExpr *DE, Address Ptr,
1907 QualType ElementType) {
1908 auto *Dtor = ElementType->getAsCXXRecordDecl()->getDestructor();
1909 if (Dtor && Dtor->isVirtual())
1910 CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1911 Dtor);
1912 else
1914 ElementType);
1915}
1916
1917/// Emit the code for deleting a single object.
1918/// \return \c true if we started emitting UnconditionalDeleteBlock, \c false
1919/// if not.
1921 Address Ptr, QualType ElementType,
1922 llvm::BasicBlock *UnconditionalDeleteBlock) {
1923 // C++11 [expr.delete]p3:
1924 // If the static type of the object to be deleted is different from its
1925 // dynamic type, the static type shall be a base class of the dynamic type
1926 // of the object to be deleted and the static type shall have a virtual
1927 // destructor or the behavior is undefined.
1929 ElementType);
1930
1931 const FunctionDecl *OperatorDelete = DE->getOperatorDelete();
1932 assert(!OperatorDelete->isDestroyingOperatorDelete());
1933
1934 // Find the destructor for the type, if applicable. If the
1935 // destructor is virtual, we'll just emit the vcall and return.
1936 const CXXDestructorDecl *Dtor = nullptr;
1937 if (const auto *RD = ElementType->getAsCXXRecordDecl()) {
1938 if (RD->hasDefinition() && !RD->hasTrivialDestructor()) {
1939 Dtor = RD->getDestructor();
1940
1941 if (Dtor->isVirtual()) {
1942 bool UseVirtualCall = true;
1943 const Expr *Base = DE->getArgument();
1944 if (auto *DevirtualizedDtor =
1945 dyn_cast_or_null<const CXXDestructorDecl>(
1947 Base, CGF.CGM.getLangOpts().AppleKext))) {
1948 UseVirtualCall = false;
1949 const CXXRecordDecl *DevirtualizedClass =
1950 DevirtualizedDtor->getParent();
1951 if (declaresSameEntity(getCXXRecord(Base), DevirtualizedClass)) {
1952 // Devirtualized to the class of the base type (the type of the
1953 // whole expression).
1954 Dtor = DevirtualizedDtor;
1955 } else {
1956 // Devirtualized to some other type. Would need to cast the this
1957 // pointer to that type but we don't have support for that yet, so
1958 // do a virtual call. FIXME: handle the case where it is
1959 // devirtualized to the derived type (the type of the inner
1960 // expression) as in EmitCXXMemberOrOperatorMemberCallExpr.
1961 UseVirtualCall = true;
1962 }
1963 }
1964 if (UseVirtualCall) {
1965 CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1966 Dtor);
1967 return false;
1968 }
1969 }
1970 }
1971 }
1972
1973 // Make sure that we call delete even if the dtor throws.
1974 // This doesn't have to a conditional cleanup because we're going
1975 // to pop it off in a second.
1976 CGF.EHStack.pushCleanup<CallObjectDelete>(
1977 NormalAndEHCleanup, Ptr.emitRawPointer(CGF), OperatorDelete, ElementType);
1978
1979 if (Dtor)
1981 /*ForVirtualBase=*/false,
1982 /*Delegating=*/false,
1983 Ptr, ElementType);
1984 else if (auto Lifetime = ElementType.getObjCLifetime()) {
1985 switch (Lifetime) {
1989 break;
1990
1993 break;
1994
1996 CGF.EmitARCDestroyWeak(Ptr);
1997 break;
1998 }
1999 }
2000
2001 // When optimizing for size, call 'operator delete' unconditionally.
2002 if (CGF.CGM.getCodeGenOpts().OptimizeSize > 1) {
2003 CGF.EmitBlock(UnconditionalDeleteBlock);
2004 CGF.PopCleanupBlock();
2005 return true;
2006 }
2007
2008 CGF.PopCleanupBlock();
2009 return false;
2010}
2011
2012namespace {
2013 /// Calls the given 'operator delete' on an array of objects.
2014 struct CallArrayDelete final : EHScopeStack::Cleanup {
2015 llvm::Value *Ptr;
2016 const FunctionDecl *OperatorDelete;
2017 llvm::Value *NumElements;
2018 QualType ElementType;
2019 CharUnits CookieSize;
2020
2021 CallArrayDelete(llvm::Value *Ptr,
2022 const FunctionDecl *OperatorDelete,
2023 llvm::Value *NumElements,
2024 QualType ElementType,
2025 CharUnits CookieSize)
2026 : Ptr(Ptr), OperatorDelete(OperatorDelete), NumElements(NumElements),
2027 ElementType(ElementType), CookieSize(CookieSize) {}
2028
2029 void Emit(CodeGenFunction &CGF, Flags flags) override {
2030 CGF.EmitDeleteCall(OperatorDelete, Ptr, ElementType, NumElements,
2031 CookieSize);
2032 }
2033 };
2034}
2035
2036/// Emit the code for deleting an array of objects.
2038 const CXXDeleteExpr *E,
2039 Address deletedPtr,
2040 QualType elementType) {
2041 llvm::Value *numElements = nullptr;
2042 llvm::Value *allocatedPtr = nullptr;
2043 CharUnits cookieSize;
2044 CGF.CGM.getCXXABI().ReadArrayCookie(CGF, deletedPtr, E, elementType,
2045 numElements, allocatedPtr, cookieSize);
2046
2047 assert(allocatedPtr && "ReadArrayCookie didn't set allocated pointer");
2048
2049 // Make sure that we call delete even if one of the dtors throws.
2050 const FunctionDecl *operatorDelete = E->getOperatorDelete();
2051 CGF.EHStack.pushCleanup<CallArrayDelete>(NormalAndEHCleanup,
2052 allocatedPtr, operatorDelete,
2053 numElements, elementType,
2054 cookieSize);
2055
2056 // Destroy the elements.
2057 if (QualType::DestructionKind dtorKind = elementType.isDestructedType()) {
2058 assert(numElements && "no element count for a type with a destructor!");
2059
2060 CharUnits elementSize = CGF.getContext().getTypeSizeInChars(elementType);
2061 CharUnits elementAlign =
2062 deletedPtr.getAlignment().alignmentOfArrayElement(elementSize);
2063
2064 llvm::Value *arrayBegin = deletedPtr.emitRawPointer(CGF);
2065 llvm::Value *arrayEnd = CGF.Builder.CreateInBoundsGEP(
2066 deletedPtr.getElementType(), arrayBegin, numElements, "delete.end");
2067
2068 // Note that it is legal to allocate a zero-length array, and we
2069 // can never fold the check away because the length should always
2070 // come from a cookie.
2071 CGF.emitArrayDestroy(arrayBegin, arrayEnd, elementType, elementAlign,
2072 CGF.getDestroyer(dtorKind),
2073 /*checkZeroLength*/ true,
2074 CGF.needsEHCleanup(dtorKind));
2075 }
2076
2077 // Pop the cleanup block.
2078 CGF.PopCleanupBlock();
2079}
2080
2082 const Expr *Arg = E->getArgument();
2084
2085 // Null check the pointer.
2086 //
2087 // We could avoid this null check if we can determine that the object
2088 // destruction is trivial and doesn't require an array cookie; we can
2089 // unconditionally perform the operator delete call in that case. For now, we
2090 // assume that deleted pointers are null rarely enough that it's better to
2091 // keep the branch. This might be worth revisiting for a -O0 code size win.
2092 llvm::BasicBlock *DeleteNotNull = createBasicBlock("delete.notnull");
2093 llvm::BasicBlock *DeleteEnd = createBasicBlock("delete.end");
2094
2095 llvm::Value *IsNull = Builder.CreateIsNull(Ptr, "isnull");
2096
2097 Builder.CreateCondBr(IsNull, DeleteEnd, DeleteNotNull);
2098 EmitBlock(DeleteNotNull);
2099 Ptr.setKnownNonNull();
2100
2101 QualType DeleteTy = E->getDestroyedType();
2102
2103 // A destroying operator delete overrides the entire operation of the
2104 // delete expression.
2106 EmitDestroyingObjectDelete(*this, E, Ptr, DeleteTy);
2107 EmitBlock(DeleteEnd);
2108 return;
2109 }
2110
2111 // We might be deleting a pointer to array.
2112 DeleteTy = getContext().getBaseElementType(DeleteTy);
2113 Ptr = Ptr.withElementType(ConvertTypeForMem(DeleteTy));
2114
2115 if (E->isArrayForm() &&
2116 CGM.getContext().getTargetInfo().emitVectorDeletingDtors(
2117 CGM.getContext().getLangOpts())) {
2118 if (auto *RD = DeleteTy->getAsCXXRecordDecl()) {
2119 auto *Dtor = RD->getDestructor();
2120 if (Dtor && Dtor->isVirtual()) {
2121 llvm::Value *NumElements = nullptr;
2122 llvm::Value *AllocatedPtr = nullptr;
2123 CharUnits CookieSize;
2124 llvm::BasicBlock *BodyBB = createBasicBlock("vdtor.call");
2125 llvm::BasicBlock *DoneBB = createBasicBlock("vdtor.nocall");
2126 // Check array cookie to see if the array has length 0. Don't call
2127 // the destructor in that case.
2128 CGM.getCXXABI().ReadArrayCookie(*this, Ptr, E, DeleteTy, NumElements,
2129 AllocatedPtr, CookieSize);
2130
2131 auto *CondTy = cast<llvm::IntegerType>(NumElements->getType());
2132 llvm::Value *IsEmpty = Builder.CreateICmpEQ(
2133 NumElements, llvm::ConstantInt::get(CondTy, 0));
2134 Builder.CreateCondBr(IsEmpty, DoneBB, BodyBB);
2135
2136 // Delete cookie for empty array.
2137 const FunctionDecl *OperatorDelete = E->getOperatorDelete();
2138 EmitBlock(DoneBB);
2139 EmitDeleteCall(OperatorDelete, AllocatedPtr, DeleteTy, NumElements,
2140 CookieSize);
2141 EmitBranch(DeleteEnd);
2142
2143 EmitBlock(BodyBB);
2144 if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd))
2145 EmitBlock(DeleteEnd);
2146 return;
2147 }
2148 }
2149 }
2150
2151 if (E->isArrayForm()) {
2152 EmitArrayDelete(*this, E, Ptr, DeleteTy);
2153 EmitBlock(DeleteEnd);
2154 } else {
2155 if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd))
2156 EmitBlock(DeleteEnd);
2157 }
2158}
2159
2160static llvm::Value *EmitTypeidFromVTable(CodeGenFunction &CGF, const Expr *E,
2161 llvm::Type *StdTypeInfoPtrTy,
2162 bool HasNullCheck) {
2163 // Get the vtable pointer.
2164 Address ThisPtr = CGF.EmitLValue(E).getAddress();
2165
2166 QualType SrcRecordTy = E->getType();
2167
2168 // C++ [class.cdtor]p4:
2169 // If the operand of typeid refers to the object under construction or
2170 // destruction and the static type of the operand is neither the constructor
2171 // or destructor’s class nor one of its bases, the behavior is undefined.
2173 ThisPtr, SrcRecordTy);
2174
2175 // Whether we need an explicit null pointer check. For example, with the
2176 // Microsoft ABI, if this is a call to __RTtypeid, the null pointer check and
2177 // exception throw is inside the __RTtypeid(nullptr) call
2178 if (HasNullCheck &&
2179 CGF.CGM.getCXXABI().shouldTypeidBeNullChecked(SrcRecordTy)) {
2180 llvm::BasicBlock *BadTypeidBlock =
2181 CGF.createBasicBlock("typeid.bad_typeid");
2182 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("typeid.end");
2183
2184 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ThisPtr);
2185 CGF.Builder.CreateCondBr(IsNull, BadTypeidBlock, EndBlock);
2186
2187 CGF.EmitBlock(BadTypeidBlock);
2188 CGF.CGM.getCXXABI().EmitBadTypeidCall(CGF);
2189 CGF.EmitBlock(EndBlock);
2190 }
2191
2192 return CGF.CGM.getCXXABI().EmitTypeid(CGF, SrcRecordTy, ThisPtr,
2193 StdTypeInfoPtrTy);
2194}
2195
2197 // Ideally, we would like to use GlobalsInt8PtrTy here, however, we cannot,
2198 // primarily because the result of applying typeid is a value of type
2199 // type_info, which is declared & defined by the standard library
2200 // implementation and expects to operate on the generic (default) AS.
2201 // https://reviews.llvm.org/D157452 has more context, and a possible solution.
2202 llvm::Type *PtrTy = Int8PtrTy;
2203 LangAS GlobAS = CGM.GetGlobalVarAddressSpace(nullptr);
2204
2205 auto MaybeASCast = [=](auto &&TypeInfo) {
2206 if (GlobAS == LangAS::Default)
2207 return TypeInfo;
2208 return getTargetHooks().performAddrSpaceCast(CGM, TypeInfo, GlobAS, PtrTy);
2209 };
2210
2211 if (E->isTypeOperand()) {
2212 llvm::Constant *TypeInfo =
2213 CGM.GetAddrOfRTTIDescriptor(E->getTypeOperand(getContext()));
2214 return MaybeASCast(TypeInfo);
2215 }
2216
2217 // C++ [expr.typeid]p2:
2218 // When typeid is applied to a glvalue expression whose type is a
2219 // polymorphic class type, the result refers to a std::type_info object
2220 // representing the type of the most derived object (that is, the dynamic
2221 // type) to which the glvalue refers.
2222 // If the operand is already most derived object, no need to look up vtable.
2224 return EmitTypeidFromVTable(*this, E->getExprOperand(), PtrTy,
2225 E->hasNullCheck());
2226
2227 QualType OperandTy = E->getExprOperand()->getType();
2228 return MaybeASCast(CGM.GetAddrOfRTTIDescriptor(OperandTy));
2229}
2230
2232 QualType DestTy) {
2233 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
2234 if (DestTy->isPointerType())
2235 return llvm::Constant::getNullValue(DestLTy);
2236
2237 /// C++ [expr.dynamic.cast]p9:
2238 /// A failed cast to reference type throws std::bad_cast
2239 if (!CGF.CGM.getCXXABI().EmitBadCastCall(CGF))
2240 return nullptr;
2241
2242 CGF.Builder.ClearInsertionPoint();
2243 return llvm::PoisonValue::get(DestLTy);
2244}
2245
2247 const CXXDynamicCastExpr *DCE) {
2248 CGM.EmitExplicitCastExprType(DCE, this);
2249 QualType DestTy = DCE->getTypeAsWritten();
2250
2251 QualType SrcTy = DCE->getSubExpr()->getType();
2252
2253 // C++ [expr.dynamic.cast]p7:
2254 // If T is "pointer to cv void," then the result is a pointer to the most
2255 // derived object pointed to by v.
2256 bool IsDynamicCastToVoid = DestTy->isVoidPointerType();
2257 QualType SrcRecordTy;
2258 QualType DestRecordTy;
2259 if (IsDynamicCastToVoid) {
2260 SrcRecordTy = SrcTy->getPointeeType();
2261 // No DestRecordTy.
2262 } else if (const PointerType *DestPTy = DestTy->getAs<PointerType>()) {
2263 SrcRecordTy = SrcTy->castAs<PointerType>()->getPointeeType();
2264 DestRecordTy = DestPTy->getPointeeType();
2265 } else {
2266 SrcRecordTy = SrcTy;
2267 DestRecordTy = DestTy->castAs<ReferenceType>()->getPointeeType();
2268 }
2269
2270 // C++ [class.cdtor]p5:
2271 // If the operand of the dynamic_cast refers to the object under
2272 // construction or destruction and the static type of the operand is not a
2273 // pointer to or object of the constructor or destructor’s own class or one
2274 // of its bases, the dynamic_cast results in undefined behavior.
2275 EmitTypeCheck(TCK_DynamicOperation, DCE->getExprLoc(), ThisAddr, SrcRecordTy);
2276
2277 if (DCE->isAlwaysNull()) {
2278 if (llvm::Value *T = EmitDynamicCastToNull(*this, DestTy)) {
2279 // Expression emission is expected to retain a valid insertion point.
2280 if (!Builder.GetInsertBlock())
2281 EmitBlock(createBasicBlock("dynamic_cast.unreachable"));
2282 return T;
2283 }
2284 }
2285
2286 assert(SrcRecordTy->isRecordType() && "source type must be a record type!");
2287
2288 // If the destination is effectively final, the cast succeeds if and only
2289 // if the dynamic type of the pointer is exactly the destination type.
2290 bool IsExact = !IsDynamicCastToVoid &&
2291 CGM.getCodeGenOpts().OptimizationLevel > 0 &&
2292 DestRecordTy->getAsCXXRecordDecl()->isEffectivelyFinal() &&
2293 CGM.getCXXABI().shouldEmitExactDynamicCast(DestRecordTy);
2294
2295 std::optional<CGCXXABI::ExactDynamicCastInfo> ExactCastInfo;
2296 if (IsExact) {
2297 ExactCastInfo = CGM.getCXXABI().getExactDynamicCastInfo(SrcRecordTy, DestTy,
2298 DestRecordTy);
2299 if (!ExactCastInfo) {
2300 llvm::Value *NullValue = EmitDynamicCastToNull(*this, DestTy);
2301 if (!Builder.GetInsertBlock())
2302 EmitBlock(createBasicBlock("dynamic_cast.unreachable"));
2303 return NullValue;
2304 }
2305 }
2306
2307 // C++ [expr.dynamic.cast]p4:
2308 // If the value of v is a null pointer value in the pointer case, the result
2309 // is the null pointer value of type T.
2310 bool ShouldNullCheckSrcValue =
2311 IsExact || CGM.getCXXABI().shouldDynamicCastCallBeNullChecked(
2312 SrcTy->isPointerType(), SrcRecordTy);
2313
2314 llvm::BasicBlock *CastNull = nullptr;
2315 llvm::BasicBlock *CastNotNull = nullptr;
2316 llvm::BasicBlock *CastEnd = createBasicBlock("dynamic_cast.end");
2317
2318 if (ShouldNullCheckSrcValue) {
2319 CastNull = createBasicBlock("dynamic_cast.null");
2320 CastNotNull = createBasicBlock("dynamic_cast.notnull");
2321
2322 llvm::Value *IsNull = Builder.CreateIsNull(ThisAddr);
2323 Builder.CreateCondBr(IsNull, CastNull, CastNotNull);
2324 EmitBlock(CastNotNull);
2325 }
2326
2327 llvm::Value *Value;
2328 if (IsDynamicCastToVoid) {
2329 Value = CGM.getCXXABI().emitDynamicCastToVoid(*this, ThisAddr, SrcRecordTy);
2330 } else if (IsExact) {
2331 // If the destination type is effectively final, this pointer points to the
2332 // right type if and only if its vptr has the right value.
2333 Value = CGM.getCXXABI().emitExactDynamicCast(
2334 *this, ThisAddr, SrcRecordTy, DestTy, DestRecordTy, *ExactCastInfo,
2335 CastEnd, CastNull);
2336 } else {
2337 assert(DestRecordTy->isRecordType() &&
2338 "destination type must be a record type!");
2339 Value = CGM.getCXXABI().emitDynamicCastCall(*this, ThisAddr, SrcRecordTy,
2340 DestTy, DestRecordTy, CastEnd);
2341 }
2342 CastNotNull = Builder.GetInsertBlock();
2343
2344 llvm::Value *NullValue = nullptr;
2345 if (ShouldNullCheckSrcValue) {
2346 EmitBranch(CastEnd);
2347
2348 EmitBlock(CastNull);
2349 NullValue = EmitDynamicCastToNull(*this, DestTy);
2350 CastNull = Builder.GetInsertBlock();
2351
2352 EmitBranch(CastEnd);
2353 }
2354
2355 EmitBlock(CastEnd);
2356
2357 if (CastNull) {
2358 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType(), 2);
2359 PHI->addIncoming(Value, CastNotNull);
2360 PHI->addIncoming(NullValue, CastNull);
2361
2362 Value = PHI;
2363 }
2364
2365 return Value;
2366}
#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:795
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
CharUnits getNonVirtualAlignment() const
getNonVirtualAlignment - Get the non-virtual alignment (in chars) of an object, which is the alignmen...
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3723
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:1548
bool isElidable() const
Whether this construction is elidable.
Definition ExprCXX.h:1617
Expr * getArg(unsigned Arg)
Return the specified argument.
Definition ExprCXX.h:1691
bool requiresZeroInitialization() const
Whether this construction first requires zero-initialization before the initializer is called.
Definition ExprCXX.h:1650
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition ExprCXX.h:1611
CXXConstructionKind getConstructionKind() const
Determine whether this constructor is actually constructing a base class (rather than a complete obje...
Definition ExprCXX.h:1659
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:2626
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2665
bool isArrayForm() const
Definition ExprCXX.h:2652
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:2355
bool isArray() const
Definition ExprCXX.h:2464
llvm::iterator_range< arg_iterator > placement_arguments()
Definition ExprCXX.h:2572
QualType getAllocatedType() const
Definition ExprCXX.h:2434
unsigned getNumImplicitArgs() const
Definition ExprCXX.h:2511
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:2469
ImplicitAllocationParameters implicitAllocationParameters() const
Provides the full set of information about expected implicit parameters in this call.
Definition ExprCXX.h:2562
bool hasInitializer() const
Whether this new-expression has any initializer at all.
Definition ExprCXX.h:2524
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:2551
FunctionDecl * getOperatorDelete() const
Definition ExprCXX.h:2461
unsigned getNumPlacementArgs() const
Definition ExprCXX.h:2494
TypeSourceInfo * getAllocatedTypeSourceInfo() const
Definition ExprCXX.h:2438
FunctionDecl * getOperatorNew() const
Definition ExprCXX.h:2459
Expr * getInitializer()
The initializer of this new-expression.
Definition ExprCXX.h:2533
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:84
Represents a list-initialization with parenthesis.
Definition ExprCXX.h:5141
MutableArrayRef< Expr * > getInitExprs()
Definition ExprCXX.h:5181
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition ExprCXX.h:2745
bool isArrow() const
Determine whether this pseudo-destructor expression was written using an '->' (otherwise,...
Definition ExprCXX.h:2809
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:2196
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:505
bool isSanitizerChecked() const
Definition CGValue.h:663
Address getAddress() const
Definition CGValue.h:645
IsZeroed_t isZeroed() const
Definition CGValue.h:676
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:588
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:351
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:2982
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:2150
@ 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:2678
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:244
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:2290
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
Definition CGExpr.cpp:153
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
Definition CGCall.cpp:5248
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:285
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType)
Emit and set additional metadata used by the AllocToken instrumentation.
Definition CGExpr.cpp:1313
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:2561
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:1574
void EmitBranch(llvm::BasicBlock *Block)
EmitBranch - Emit a branch to the specified basic block from the current insert block,...
Definition CGStmt.cpp:676
CGCallee BuildAppleKextVirtualCall(const CXXMethodDecl *MD, NestedNameSpecifier Qual, llvm::Type *Ty)
BuildAppleKextVirtualCall - This routine is to support gcc's kext ABI making indirect call to virtual...
Definition CGCXX.cpp:314
RValue EmitCXXMemberPointerCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
Definition CGExpr.cpp:736
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:1632
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:4688
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:1690
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:656
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:127
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:700
llvm::Constant * tryEmitAbstract(const Expr *E, QualType T)
Try to emit the result of the given expression as an abstract constant.
A saved depth on the scope stack.
T * pushCleanupWithExtra(CleanupKind Kind, size_t N, As... A)
Push a cleanup with non-constant storage requirements on the stack.
LValue - This represents an lvalue references.
Definition CGValue.h:183
Address getAddress() const
Definition CGValue.h:362
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
Definition CGValue.h:42
static RValue get(llvm::Value *V)
Definition CGValue.h:99
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
Definition CGValue.h:126
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
Definition CGValue.h:72
A class for recording the number of arguments that a function signature requires.
static RequiredArgs forPrototypePlus(const FunctionProtoType *prototype, unsigned additional)
Compute the arguments required by the given formal prototype, given that there may be some additional...
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
Definition CGCall.h:379
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:3761
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:4180
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:3661
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:3085
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:3252
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:276
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:3547
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:3563
bool isReservedGlobalPlacementOperator() const
Determines whether this operator new or delete is one of the reserved global placement operators: voi...
Definition Decl.cpp:3399
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:4126
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5269
unsigned getNumParams() const
Definition TypeBase.h:5547
QualType getParamType(unsigned i) const
Definition TypeBase.h:5549
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:2447
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:3654
QualType getPointeeType() const
Definition TypeBase.h:3672
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
ObjCEncodeExpr, used for @encode in Objective-C.
Definition ExprObjC.h:407
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3329
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8377
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:8419
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8333
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1438
QualType getCanonicalType() const
Definition TypeBase.h:8345
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:2694
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:4321
field_range fields() const
Definition Decl.h:4524
bool mayInsertExtraPadding(bool EmitRemark=false) const
Whether we are allowed to insert extra padding between fields.
Definition Decl.cpp:5294
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4509
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3574
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:8530
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9179
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:9165
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2922
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9112
bool isRecordType() const
Definition TypeBase.h:8657
QualType getType() const
Definition Decl.h:723
QualType getType() const
Definition Value.cpp:237
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
Definition CGValue.h:155
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
Definition CGValue.h:146
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
CXXCtorType
C++ constructor types.
Definition ABI.h:24
@ Ctor_Base
Base object ctor.
Definition ABI.h:26
@ Ctor_Complete
Complete object ctor.
Definition ABI.h:25
bool isa(CodeGen::Address addr)
Definition Address.h:330
AlignedAllocationMode alignedAllocationModeFromBool(bool IsAligned)
Definition ExprCXX.h:2269
bool isAlignedAllocation(AlignedAllocationMode Mode)
Definition ExprCXX.h:2265
AlignedAllocationMode
Definition ExprCXX.h:2263
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:2253
LangAS
Defines the address space values used by the address space qualifier of QualType.
TypeAwareAllocationMode
Definition ExprCXX.h:2251
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:2345
AlignedAllocationMode Alignment
Definition ExprCXX.h:2348