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