Lines Matching +full:x +full:- +full:tal

1 //===--- CGClass.cpp - Emit LLVM Code for C++ classes -----------*- C++ -*-===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 //===----------------------------------------------------------------------===//
42 if (!RD->hasDefinition()) in getClassPointerAlignment()
49 if (RD->isEffectivelyFinal()) in getClassPointerAlignment()
61 if (!RD->hasDefinition()) in getMinimumClassObjectSize()
68 if (RD->isEffectivelyFinal()) in getMinimumClassObjectSize()
83 assert(vbaseClass->isCompleteDefinition()); in getVBaseAlignment()
97 if (!baseDecl->isCompleteDefinition()) in getDynamicOffsetAlignment()
105 // This actually isn't necessarily the right thing to do --- if the in getDynamicOffsetAlignment()
112 // However, our approach to this kind of under-alignment can only in getDynamicOffsetAlignment()
116 // than pointer-aligned will generally trap in the constructor, in getDynamicOffsetAlignment()
120 // under-aligned and then safely access its fields and vtables. in getDynamicOffsetAlignment()
138 // TODO: if we're currently emitting a complete-object ctor/dtor, in LoadCXXThisAddress()
139 // we can always use the complete-object alignment. in LoadCXXThisAddress()
140 CXXThisAlignment = CGM.getClassPointerAlignment(MD->getParent()); in LoadCXXThisAddress()
144 LoadCXXThis(), MD->getFunctionObjectParameterType(), CXXThisAlignment, in LoadCXXThisAddress()
162 QualType memberType = memberPtrType->getPointeeType(); in EmitCXXMemberDataPointerAddress()
167 memberPtrType->getClass()->getAsCXXRecordDecl(), in EmitCXXMemberDataPointerAddress()
169 return Address(ptr, ConvertTypeForMem(memberPtrType->getPointeeType()), in EmitCXXMemberDataPointerAddress()
183 assert(!Base->isVirtual() && "Should not see virtual bases here!"); in computeNonVirtualBaseClassOffset()
189 cast<CXXRecordDecl>(Base->getType()->castAs<RecordType>()->getDecl()); in computeNonVirtualBaseClassOffset()
218 /// This should only be used for (1) non-virtual bases or (2) virtual bases
221 /// The object pointed to by 'This' is assumed to be non-null.
307 if ((*Start)->isVirtual()) { in GetAddressOfBaseClass()
309 (*Start)->getType()->castAs<RecordType>()->getDecl()); in GetAddressOfBaseClass()
321 // TODO: "devirtualize" this for accesses to known-complete objects. in GetAddressOfBaseClass()
322 if (VBase && Derived->hasAttr<FinalAttr>()) { in GetAddressOfBaseClass()
330 llvm::Type *BaseValueTy = ConvertType((PathEnd[-1])->getType()); in GetAddressOfBaseClass()
332 CGM.getLLVMContext(), Value.getType()->getPointerAddressSpace()); in GetAddressOfBaseClass()
353 // null-check the pointer. in GetAddressOfBaseClass()
393 PHI->addIncoming(Value.emitRawPointer(*this), notNullBB); in GetAddressOfBaseClass()
394 PHI->addIncoming(llvm::Constant::getNullValue(PtrTy), origBB); in GetAddressOfBaseClass()
444 // Produce a PHI if we had a null-check. in GetAddressOfDerivedClass()
452 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType(), 2); in GetAddressOfDerivedClass()
453 PHI->addIncoming(Value, CastNotNull); in GetAddressOfDerivedClass()
454 PHI->addIncoming(llvm::Constant::getNullValue(Value->getType()), CastNull); in GetAddressOfDerivedClass()
470 const CXXRecordDecl *RD = cast<CXXMethodDecl>(CurCodeDecl)->getParent(); in GetVTTParameter()
471 const CXXRecordDecl *Base = cast<CXXMethodDecl>(GD.getDecl())->getParent(); in GetVTTParameter()
482 "doing no-op VTT offset in base dtor/ctor?"); in GetVTTParameter()
493 assert(SubVTTIndex != 0 && "Sub-VTT index must be greater than zero!"); in GetVTTParameter()
504 VTT->getValueType(), VTT, 0, SubVTTIndex); in GetVTTParameter()
518 cast<CXXMethodDecl>(CGF.CurCodeDecl)->getParent(); in Emit()
520 const CXXDestructorDecl *D = BaseClass->getDestructor(); in Emit()
523 QualType ThisTy = D->getFunctionObjectParameterType(); in Emit()
542 // Black-list all explicit and implicit references to 'this'.
560 assert(BaseInit->isBaseInitializer() && in EmitBaseInitializer()
565 const Type *BaseType = BaseInit->getBaseClass(); in EmitBaseInitializer()
567 cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl()); in EmitBaseInitializer()
569 bool isBaseVirtual = BaseInit->isBaseVirtual(); in EmitBaseInitializer()
574 if (BaseInitializerUsesThis(CGF.getContext(), BaseInit->getInit())) in EmitBaseInitializer()
591 CGF.EmitAggExpr(BaseInit->getInit(), AggSlot); in EmitBaseInitializer()
594 !BaseClassDecl->hasTrivialDestructor()) in EmitBaseInitializer()
601 if (!(CD && CD->isCopyOrMoveConstructor()) && in isMemcpyEquivalentSpecialMember()
602 !D->isCopyAssignmentOperator() && !D->isMoveAssignmentOperator()) in isMemcpyEquivalentSpecialMember()
606 if (D->isTrivial() && !D->getParent()->mayInsertExtraPadding()) in isMemcpyEquivalentSpecialMember()
610 if (D->getParent()->isUnion() && D->isDefaulted()) in isMemcpyEquivalentSpecialMember()
619 FieldDecl *Field = MemberInit->getAnyMember(); in EmitLValueForAnyFieldInitialization()
620 if (MemberInit->isIndirectMemberInitializer()) { in EmitLValueForAnyFieldInitialization()
622 IndirectFieldDecl *IndirectField = MemberInit->getIndirectMember(); in EmitLValueForAnyFieldInitialization()
623 for (const auto *I : IndirectField->chain()) in EmitLValueForAnyFieldInitialization()
635 ApplyDebugLocation Loc(CGF, MemberInit->getSourceLocation()); in EmitMemberInitializer()
636 assert(MemberInit->isAnyMemberInitializer() && in EmitMemberInitializer()
638 assert(MemberInit->getInit() && "Must have initializer!"); in EmitMemberInitializer()
640 // non-static data member initializers. in EmitMemberInitializer()
641 FieldDecl *Field = MemberInit->getAnyMember(); in EmitMemberInitializer()
642 QualType FieldType = Field->getType(); in EmitMemberInitializer()
649 // non-virtual alignment. in EmitMemberInitializer()
664 if (Array && Constructor->isDefaulted() && in EmitMemberInitializer()
665 Constructor->isCopyOrMoveConstructor()) { in EmitMemberInitializer()
667 CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(MemberInit->getInit()); in EmitMemberInitializer()
669 (CE && isMemcpyEquivalentSpecialMember(CE->getConstructor()))) { in EmitMemberInitializer()
689 CGF.EmitInitializerForField(Field, LHS, MemberInit->getInit()); in EmitMemberInitializer()
694 QualType FieldType = Field->getType(); in EmitInitializerForField()
727 /// complete-to-base constructor delegation optimization, i.e.
745 if (Ctor->getParent()->getNumVBases()) { in IsConstructorDelegationValid()
746 // TODO: white-list trivial vbase initializers. This case wouldn't in IsConstructorDelegationValid()
749 // TODO: white-list cases where: in IsConstructorDelegationValid()
750 // - there are no non-reference parameters to the constructor in IsConstructorDelegationValid()
751 // - the initializers don't access any non-reference parameters in IsConstructorDelegationValid()
752 // - the initializers don't take the address of non-reference in IsConstructorDelegationValid()
754 // - etc. in IsConstructorDelegationValid()
756 // - function-try-blocks will always exclude this optimization in IsConstructorDelegationValid()
757 // - we need to perform the constructor prologue and cleanup in in IsConstructorDelegationValid()
764 // it's impossible to "re-pass" varargs. in IsConstructorDelegationValid()
765 if (Ctor->getType()->castAs<FunctionProtoType>()->isVariadic()) in IsConstructorDelegationValid()
769 if (Ctor->isDelegatingConstructor()) in IsConstructorDelegationValid()
777 // -fsanitize-address-field-padding=1|2.
781 Prologue ? cast<CXXConstructorDecl>(CurGD.getDecl())->getParent() in EmitAsanPrologueOrEpilogue()
782 : cast<CXXDestructorDecl>(CurGD.getDecl())->getParent(); in EmitAsanPrologueOrEpilogue()
783 if (!ClassDecl->mayInsertExtraPadding()) return; in EmitAsanPrologueOrEpilogue()
800 for (const auto *Field : ClassDecl->fields()) { in EmitAsanPrologueOrEpilogue()
802 auto FieldInfo = Context.getTypeInfoInChars(D->getType()); in EmitAsanPrologueOrEpilogue()
805 SSV[NumFields].Size = D->isBitField() ? 0 : FieldSize.getQuantity(); in EmitAsanPrologueOrEpilogue()
811 // We will insert calls to __asan_* run-time functions. in EmitAsanPrologueOrEpilogue()
827 uint64_t NextField = i == SSV.size() - 1 ? TypeSize : SSV[i + 1].Offset; in EmitAsanPrologueOrEpilogue()
828 uint64_t PoisonSize = NextField - SSV[i].Offset - SSV[i].Size; in EmitAsanPrologueOrEpilogue()
839 /// EmitConstructorBody - Emits the body of the current constructor.
849 // Before we go any further, try the complete->base constructor in EmitConstructorBody()
853 EmitDelegateCXXConstructorCall(Ctor, Ctor_Base, Args, Ctor->getEndLoc()); in EmitConstructorBody()
858 Stmt *Body = Ctor->getBody(Definition); in EmitConstructorBody()
861 // Enter the function-try-block before the constructor prologue if in EmitConstructorBody()
881 EmitStmt(cast<CXXTryStmt>(Body)->getTryBlock()); in EmitConstructorBody()
899 /// lvalue-to-rvalue conversion on the object but not its members.
930 Qualifiers Qual = F->getType().getQualifiers(); in isMemcpyableField()
948 LastField->isBitField() in getMemcpySize()
949 ? LastField->getBitWidthValue(Ctx) in getMemcpySize()
951 Ctx.getTypeInfoDataSizeInChars(LastField->getType()).Width); in getMemcpySize()
952 uint64_t MemcpySizeBits = LastFieldOffset + LastFieldSize - in getMemcpySize()
953 FirstByteOffset + Ctx.getCharWidth() - 1; in getMemcpySize()
966 if (FirstField->isBitField()) { in emitMemcpy()
968 CGF.getTypes().getCGRecordLayout(FirstField->getParent()); in emitMemcpy()
1011 FirstFieldOffset = RecLayout.getFieldOffset(F->getFieldIndex()); in addInitialField()
1013 LastAddedFieldIndex = F->getFieldIndex(); in addInitialField()
1018 // F->getFieldIndex() == LastAddedFieldIndex + 1 in addNextField()
1019 // The one exception is that Sema won't add a copy-initializer for an in addNextField()
1021 assert(F->getFieldIndex() >= LastAddedFieldIndex + 1 && in addNextField()
1023 LastAddedFieldIndex = F->getFieldIndex(); in addNextField()
1028 uint64_t FOffset = RecLayout.getFieldOffset(F->getFieldIndex()); in addNextField()
1053 if (CD->isCopyOrMoveConstructor() && CD->isDefaulted()) in getTrivialCopySource()
1063 FieldDecl *Field = MemberInit->getMember(); in isMemberInitMemcpyable()
1065 QualType FieldType = Field->getType(); in isMemberInitMemcpyable()
1066 CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(MemberInit->getInit()); in isMemberInitMemcpyable()
1068 // Bail out on non-memcpyable, not-trivially-copyable members. in isMemberInitMemcpyable()
1069 if (!(CE && isMemcpyEquivalentSpecialMember(CE->getConstructor())) && in isMemberInitMemcpyable()
1071 FieldType->isReferenceType())) in isMemberInitMemcpyable()
1085 : FieldMemcpyizer(CGF, CD->getParent(), getTrivialCopySource(CGF, CD, Args)), in ConstructorMemcpyizer()
1087 MemcpyableCtor(CD->isDefaulted() && in ConstructorMemcpyizer()
1088 CD->isCopyOrMoveConstructor() && in ConstructorMemcpyizer()
1095 addMemcpyableField(MemberInit->getMember()); in addMemberInitializer()
1098 EmitMemberInitializer(CGF, ConstructorDecl->getParent(), MemberInit, in addMemberInitializer()
1109 EmitMemberInitializer(CGF, ConstructorDecl->getParent(), in emitAggregatedInits()
1129 QualType FieldType = MemberInit->getAnyMember()->getType(); in pushEHDestructors()
1159 if (BO->getOpcode() != BO_Assign) in getMemcpyableField()
1161 MemberExpr *ME = dyn_cast<MemberExpr>(BO->getLHS()); in getMemcpyableField()
1164 FieldDecl *Field = dyn_cast<FieldDecl>(ME->getMemberDecl()); in getMemcpyableField()
1167 Stmt *RHS = BO->getRHS(); in getMemcpyableField()
1169 RHS = EC->getSubExpr(); in getMemcpyableField()
1173 if (ME2->getMemberDecl() == Field) in getMemcpyableField()
1178 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MCE->getCalleeDecl()); in getMemcpyableField()
1181 MemberExpr *IOA = dyn_cast<MemberExpr>(MCE->getImplicitObjectArgument()); in getMemcpyableField()
1184 FieldDecl *Field = dyn_cast<FieldDecl>(IOA->getMemberDecl()); in getMemcpyableField()
1187 MemberExpr *Arg0 = dyn_cast<MemberExpr>(MCE->getArg(0)); in getMemcpyableField()
1188 if (!Arg0 || Field != dyn_cast<FieldDecl>(Arg0->getMemberDecl())) in getMemcpyableField()
1192 FunctionDecl *FD = dyn_cast<FunctionDecl>(CE->getCalleeDecl()); in getMemcpyableField()
1193 if (!FD || FD->getBuiltinID() != Builtin::BI__builtin_memcpy) in getMemcpyableField()
1195 Expr *DstPtr = CE->getArg(0); in getMemcpyableField()
1197 DstPtr = DC->getSubExpr(); in getMemcpyableField()
1199 if (!DUO || DUO->getOpcode() != UO_AddrOf) in getMemcpyableField()
1201 MemberExpr *ME = dyn_cast<MemberExpr>(DUO->getSubExpr()); in getMemcpyableField()
1204 FieldDecl *Field = dyn_cast<FieldDecl>(ME->getMemberDecl()); in getMemcpyableField()
1207 Expr *SrcPtr = CE->getArg(1); in getMemcpyableField()
1209 SrcPtr = SC->getSubExpr(); in getMemcpyableField()
1211 if (!SUO || SUO->getOpcode() != UO_AddrOf) in getMemcpyableField()
1213 MemberExpr *ME2 = dyn_cast<MemberExpr>(SUO->getSubExpr()); in getMemcpyableField()
1214 if (!ME2 || Field != dyn_cast<FieldDecl>(ME2->getMemberDecl())) in getMemcpyableField()
1228 : FieldMemcpyizer(CGF, AD->getParent(), Args[Args.size() - 1]), in AssignmentMemcpyizer()
1264 const Type *BaseType = BaseInit->getBaseClass(); in isInitializerOfDynamicClass()
1266 cast<CXXRecordDecl>(BaseType->castAs<RecordType>()->getDecl()); in isInitializerOfDynamicClass()
1267 return BaseClassDecl->isDynamicClass(); in isInitializerOfDynamicClass()
1270 /// EmitCtorPrologue - This routine generates necessary code to initialize
1271 /// base classes and non-static data members belonging to this constructor.
1275 if (CD->isDelegatingConstructor()) in EmitCtorPrologue()
1278 const CXXRecordDecl *ClassDecl = CD->getParent(); in EmitCtorPrologue()
1280 CXXConstructorDecl::init_const_iterator B = CD->init_begin(), in EmitCtorPrologue()
1281 E = CD->init_end(); in EmitCtorPrologue()
1284 // - This is a base ctor variant in EmitCtorPrologue()
1285 // - There are no vbases in EmitCtorPrologue()
1286 // - The class is abstract, so a complete object of it cannot be constructed in EmitCtorPrologue()
1291 ClassDecl->getNumVBases() != 0 && in EmitCtorPrologue()
1292 !ClassDecl->isAbstract(); in EmitCtorPrologue()
1305 for (; B != E && (*B)->isBaseInitializer() && (*B)->isBaseVirtual(); B++) { in EmitCtorPrologue()
1322 // Then, non-virtual base initializers. in EmitCtorPrologue()
1323 for (; B != E && (*B)->isBaseInitializer(); B++) { in EmitCtorPrologue()
1324 assert(!(*B)->isBaseVirtual()); in EmitCtorPrologue()
1340 assert(!Member->isBaseInitializer()); in EmitCtorPrologue()
1341 assert(Member->isAnyMemberInitializer() && in EmitCtorPrologue()
1342 "Delegating initializer on non-delegating constructor"); in EmitCtorPrologue()
1357 if (BaseClassDecl->hasTrivialDestructor()) in HasTrivialDestructorBody()
1360 if (!BaseClassDecl->getDestructor()->hasTrivialBody()) in HasTrivialDestructorBody()
1364 for (const auto *Field : BaseClassDecl->fields()) in HasTrivialDestructorBody()
1368 // Check non-virtual bases. in HasTrivialDestructorBody()
1369 for (const auto &I : BaseClassDecl->bases()) { in HasTrivialDestructorBody()
1374 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); in HasTrivialDestructorBody()
1382 for (const auto &I : BaseClassDecl->vbases()) { in HasTrivialDestructorBody()
1384 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); in HasTrivialDestructorBody()
1398 QualType FieldBaseElementType = Context.getBaseElementType(Field->getType()); in FieldHasTrivialDestructorBody()
1400 const RecordType *RT = FieldBaseElementType->getAs<RecordType>(); in FieldHasTrivialDestructorBody()
1404 CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl()); in FieldHasTrivialDestructorBody()
1407 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion()) in FieldHasTrivialDestructorBody()
1413 /// CanSkipVTablePointerInitialization - Check whether we need to initialize
1417 const CXXRecordDecl *ClassDecl = Dtor->getParent(); in CanSkipVTablePointerInitialization()
1418 if (!ClassDecl->isDynamicClass()) in CanSkipVTablePointerInitialization()
1423 if (ClassDecl->isEffectivelyFinal()) in CanSkipVTablePointerInitialization()
1426 if (!Dtor->hasTrivialBody()) in CanSkipVTablePointerInitialization()
1430 for (const auto *Field : ClassDecl->fields()) in CanSkipVTablePointerInitialization()
1437 /// EmitDestructorBody - Emits the body of the current destructor.
1442 // For an abstract class, non-base destructors are never used (and can't in EmitDestructorBody()
1447 if (DtorType != Dtor_Base && Dtor->getParent()->isAbstract()) { in EmitDestructorBody()
1449 TrapCall->setDoesNotReturn(); in EmitDestructorBody()
1450 TrapCall->setDoesNotThrow(); in EmitDestructorBody()
1456 Stmt *Body = Dtor->getBody(); in EmitDestructorBody()
1463 // outside of the function-try-block, which means it's always in EmitDestructorBody()
1470 QualType ThisTy = Dtor->getFunctionObjectParameterType(); in EmitDestructorBody()
1477 // If the body is a function-try-block, enter the try before in EmitDestructorBody()
1489 // this optimization if the body is a function-try-block, because in EmitDestructorBody()
1498 "can't emit a dtor without a body for non-Microsoft ABIs"); in EmitDestructorBody()
1504 QualType ThisTy = Dtor->getFunctionObjectParameterType(); in EmitDestructorBody()
1516 // Enter the cleanup scopes for fields and non-virtual bases. in EmitDestructorBody()
1526 InitializeVTablePointers(Dtor->getParent()); in EmitDestructorBody()
1530 EmitStmt(cast<CXXTryStmt>(Body)->getTryBlock()); in EmitDestructorBody()
1534 assert(Dtor->isImplicit() && "bodyless dtor not implicit"); in EmitDestructorBody()
1537 // -fapple-kext must inline any call to this dtor into in EmitDestructorBody()
1540 CurFn->addFnAttr(llvm::Attribute::AlwaysInline); in EmitDestructorBody()
1555 const Stmt *RootS = AssignOp->getBody(); in emitImplicitAssignmentOperatorBody()
1560 LexicalScope Scope(*this, RootCS->getSourceRange()); in emitImplicitAssignmentOperatorBody()
1565 for (auto *I : RootCS->body()) in emitImplicitAssignmentOperatorBody()
1573 if (Expr *ThisArg = DD->getOperatorDeleteThisArg()) in LoadThisForDtorDelete()
1584 const CXXRecordDecl *ClassDecl = Dtor->getParent(); in Emit()
1585 CGF.EmitDeleteCall(Dtor->getOperatorDelete(), in Emit()
1602 const CXXRecordDecl *ClassDecl = Dtor->getParent(); in EmitConditionalDtorDeleteCall()
1603 CGF.EmitDeleteCall(Dtor->getOperatorDelete(), in EmitConditionalDtorDeleteCall()
1606 assert(Dtor->getOperatorDelete()->isDestroyingOperatorDelete() == in EmitConditionalDtorDeleteCall()
1646 QualType RecordTy = CGF.getContext().getTagDeclType(field->getParent()); in Emit()
1651 CGF.emitDestroy(LV.getAddress(), field->getType(), destroyer, in Emit()
1666 InlinedAt = DI->getInlinedAt(); in DeclAsInlineDebugLocation()
1667 DI->setInlinedAt(CGF.Builder.getCurrentDebugLocation()); in DeclAsInlineDebugLocation()
1675 DI->setInlinedAt(InlinedAt); in ~DeclAsInlineDebugLocation()
1716 cast<CXXMethodDecl>(CGF.CurCodeDecl)->getParent(); in Emit()
1735 CGF.CurFn->addFnAttr("disable-tail-calls", "true"); in Emit()
1755 Context.getASTRecordLayout(Dtor->getParent()); in Emit()
1760 Layout.getFieldOffset(StartIndex) + Context.getCharWidth() - 1); in Emit()
1774 CharUnits PoisonSize = PoisonEnd - PoisonStart; in Emit()
1780 CGF, **std::next(Dtor->getParent()->field_begin(), StartIndex)); in Emit()
1784 CGF.CurFn->addFnAttr("disable-tail-calls", "true"); in Emit()
1796 assert(Dtor->getParent()->isDynamicClass()); in Emit()
1821 unsigned FieldIndex = Field->getFieldIndex(); in PushCleanupForField()
1834 *StartIndex, -1); in End()
1847 assert((!DD->isTrivial() || DD->hasAttr<DLLExportAttr>()) && in EnterDtorCleanups()
1848 "Should not emit dtor epilogue for non-exported trivial dtor!"); in EnterDtorCleanups()
1850 // The deleting-destructor phase just needs to call the appropriate in EnterDtorCleanups()
1853 assert(DD->getOperatorDelete() && in EnterDtorCleanups()
1854 "operator delete missing - EnterDtorCleanups"); in EnterDtorCleanups()
1858 if (DD->getOperatorDelete()->isDestroyingOperatorDelete()) in EnterDtorCleanups()
1865 if (DD->getOperatorDelete()->isDestroyingOperatorDelete()) { in EnterDtorCleanups()
1866 const CXXRecordDecl *ClassDecl = DD->getParent(); in EnterDtorCleanups()
1867 EmitDeleteCall(DD->getOperatorDelete(), in EnterDtorCleanups()
1878 const CXXRecordDecl *ClassDecl = DD->getParent(); in EnterDtorCleanups()
1881 if (ClassDecl->isUnion()) in EnterDtorCleanups()
1884 // The complete-destructor phase just destructs all the virtual bases. in EnterDtorCleanups()
1889 SanOpts.has(SanitizerKind::Memory) && ClassDecl->getNumVBases() && in EnterDtorCleanups()
1890 ClassDecl->isPolymorphic()) in EnterDtorCleanups()
1895 for (const auto &Base : ClassDecl->vbases()) { in EnterDtorCleanups()
1897 cast<CXXRecordDecl>(Base.getType()->castAs<RecordType>()->getDecl()); in EnterDtorCleanups()
1899 if (BaseClassDecl->hasTrivialDestructor()) { in EnterDtorCleanups()
1901 // memory. For non-trival base classes the same is done in the class in EnterDtorCleanups()
1904 SanOpts.has(SanitizerKind::Memory) && !BaseClassDecl->isEmpty()) in EnterDtorCleanups()
1921 SanOpts.has(SanitizerKind::Memory) && !ClassDecl->getNumVBases() && in EnterDtorCleanups()
1922 ClassDecl->isPolymorphic()) in EnterDtorCleanups()
1925 // Destroy non-virtual bases. in EnterDtorCleanups()
1926 for (const auto &Base : ClassDecl->bases()) { in EnterDtorCleanups()
1931 CXXRecordDecl *BaseClassDecl = Base.getType()->getAsCXXRecordDecl(); in EnterDtorCleanups()
1933 if (BaseClassDecl->hasTrivialDestructor()) { in EnterDtorCleanups()
1935 SanOpts.has(SanitizerKind::Memory) && !BaseClassDecl->isEmpty()) in EnterDtorCleanups()
1952 for (const auto *Field : ClassDecl->fields()) { in EnterDtorCleanups()
1956 QualType type = Field->getType(); in EnterDtorCleanups()
1962 const RecordType *RT = type->getAsUnionType(); in EnterDtorCleanups()
1963 if (RT && RT->getDecl()->isAnonymousStructOrUnion()) in EnterDtorCleanups()
1975 /// EmitCXXAggrConstructorCall - Emit a loop to call a particular
1982 /// zero-initialized before it is constructed
1995 /// EmitCXXAggrConstructorCall - Emit a loop to call a particular
2003 /// zero-initialized before it is constructed
2011 // dynamically, because x can be zero in 'new A[x]', and statically, in EmitCXXAggrConstructorCall()
2012 // because of GCC extensions that permit zero-length arrays. There in EmitCXXAggrConstructorCall()
2022 if (constantCount->isZero()) return; in EmitCXXAggrConstructorCall()
2042 llvm::PHINode *cur = Builder.CreatePHI(arrayBegin->getType(), 2, in EmitCXXAggrConstructorCall()
2044 cur->addIncoming(arrayBegin, entryBB); in EmitCXXAggrConstructorCall()
2053 // use the non-virtual size or alignment. in EmitCXXAggrConstructorCall()
2054 QualType type = getContext().getTypeDeclType(ctor->getParent()); in EmitCXXAggrConstructorCall()
2066 // point than the end of the full-expression. The first context is when a in EmitCXXAggrConstructorCall()
2076 // partial-destroy cleanup. in EmitCXXAggrConstructorCall()
2078 !ctor->getParent()->hasTrivialDestructor()) { in EmitCXXAggrConstructorCall()
2096 cur->addIncoming(next, Builder.GetInsertBlock()); in EmitCXXAggrConstructorCall()
2104 if (zeroCheckBranch) zeroCheckBranch->setSuccessor(0, contBB); in EmitCXXAggrConstructorCall()
2112 const RecordType *rtype = type->castAs<RecordType>(); in destroyCXXObject()
2113 const CXXRecordDecl *record = cast<CXXRecordDecl>(rtype->getDecl()); in destroyCXXObject()
2114 const CXXDestructorDecl *dtor = record->getDestructor(); in destroyCXXObject()
2115 assert(!dtor->isTrivial()); in destroyCXXObject()
2129 LangAS ThisAS = D->getFunctionObjectParameterType().getAddressSpace(); in EmitCXXConstructorCall()
2131 getAsNaturalPointerTo(This, D->getThisType()->getPointeeType()); in EmitCXXConstructorCall()
2142 Args.add(RValue::get(ThisPtr), D->getThisType()); in EmitCXXConstructorCall()
2148 assert(E->getNumArgs() == 1 && "unexpected argcount for trivial ctor"); in EmitCXXConstructorCall()
2150 const Expr *Arg = E->getArg(0); in EmitCXXConstructorCall()
2152 QualType DestTy = getContext().getTypeDeclType(D->getParent()); in EmitCXXConstructorCall()
2158 // Add the rest of the user-supplied arguments. in EmitCXXConstructorCall()
2159 const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>(); in EmitCXXConstructorCall()
2160 EvaluationOrder Order = E->isListInitialization() in EmitCXXConstructorCall()
2163 EmitCallArgs(Args, FPT, E->arguments(), E->getConstructor(), in EmitCXXConstructorCall()
2167 ThisAVS.mayOverlap(), E->getExprLoc(), in EmitCXXConstructorCall()
2175 if (Ctor->isVariadic()) in canEmitDelegateCallArgs()
2179 // If the parameters are callee-cleanup, it's not safe to forward. in canEmitDelegateCallArgs()
2180 for (auto *P : Ctor->parameters()) in canEmitDelegateCallArgs()
2181 if (P->needsDestruction(CGF.getContext())) in canEmitDelegateCallArgs()
2204 const CXXRecordDecl *ClassDecl = D->getParent(); in EmitCXXConstructorCall()
2210 if (D->isTrivial() && D->isDefaultConstructor()) { in EmitCXXConstructorCall()
2220 QualType SrcTy = D->getParamDecl(0)->getType().getNonReferenceType(); in EmitCXXConstructorCall()
2232 if (auto Inherited = D->getInheritedConstructor()) { in EmitCXXConstructorCall()
2241 // Insert any ABI-specific implicit constructor arguments. in EmitCXXConstructorCall()
2258 // - Otherwise we can refer to vtable if it's safe to speculatively emit. in EmitCXXConstructorCall()
2263 // assumes. Make assumption loads require -fstrict-vtable-pointers temporarily. in EmitCXXConstructorCall()
2265 ClassDecl->isDynamicClass() && Type != Ctor_Base && in EmitCXXConstructorCall()
2276 This, D->getThisType()->getPointeeType())), in EmitInheritedCXXConstructorCall()
2277 D->getThisType()); in EmitInheritedCXXConstructorCall()
2289 assert(CXXInheritedCtorInitExprArgs.size() >= D->getNumParams() && in EmitInheritedCXXConstructorCall()
2297 assert(OuterCtor->getNumParams() == D->getNumParams()); in EmitInheritedCXXConstructorCall()
2298 assert(!OuterCtor->isVariadic() && "should have been inlined"); in EmitInheritedCXXConstructorCall()
2300 for (const auto *Param : OuterCtor->parameters()) { in EmitInheritedCXXConstructorCall()
2302 OuterCtor->getParamDecl(Param->getFunctionScopeIndex())->getType(), in EmitInheritedCXXConstructorCall()
2303 Param->getType())); in EmitInheritedCXXConstructorCall()
2304 EmitDelegateCallArg(Args, Param, E->getLocation()); in EmitInheritedCXXConstructorCall()
2307 if (Param->hasAttr<PassObjectSizeAttr>()) { in EmitInheritedCXXConstructorCall()
2310 EmitDelegateCallArg(Args, POSParam, E->getLocation()); in EmitInheritedCXXConstructorCall()
2317 E->getLocation(), /*NewPointerIsChecked*/true); in EmitInheritedCXXConstructorCall()
2335 // Insert any ABI-specific implicit constructor arguments. in EmitInlinedInheritingCXXConstructorCall()
2355 if (!RetType->isVoidType()) in EmitInlinedInheritingCXXConstructorCall()
2380 GetVTablePtr(This, VTableGlobal->getType(), Vptr.VTableClass); in EmitVTableAssumptionLoad()
2397 const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>(); in EmitSynthesizedCXXCopyCtorCall()
2402 Args.add(RValue::get(getAsNaturalPointerTo(This, D->getThisType())), in EmitSynthesizedCXXCopyCtorCall()
2403 D->getThisType()); in EmitSynthesizedCXXCopyCtorCall()
2406 QualType QT = *(FPT->param_type_begin()); in EmitSynthesizedCXXCopyCtorCall()
2408 llvm::Value *Val = getAsNaturalPointerTo(Src, D->getThisType()); in EmitSynthesizedCXXCopyCtorCall()
2413 EmitCallArgs(Args, FPT, drop_begin(E->arguments(), 1), E->getConstructor(), in EmitSynthesizedCXXCopyCtorCall()
2418 AggValueSlot::MayOverlap, E->getExprLoc(), in EmitSynthesizedCXXCopyCtorCall()
2435 This, (*I)->getType()->getPointeeType())), in EmitDelegateCXXConstructorCall()
2436 (*I)->getType()); in EmitDelegateCXXConstructorCall()
2443 assert((*I)->getType()->isPointerType() && in EmitDelegateCXXConstructorCall()
2451 // FIXME: per-argument source location in EmitDelegateCXXConstructorCall()
2474 QualType ThisTy = Dtor->getFunctionObjectParameterType(); in Emit()
2484 assert(Ctor->isDelegatingConstructor()); in EmitDelegatingCXXConstructorCall()
2498 EmitAggExpr(Ctor->init_begin()[0]->getInit(), AggSlot); in EmitDelegatingCXXConstructorCall()
2500 const CXXRecordDecl *ClassDecl = Ctor->getParent(); in EmitDelegatingCXXConstructorCall()
2501 if (CGM.getLangOpts().Exceptions && !ClassDecl->hasTrivialDestructor()) { in EmitDelegatingCXXConstructorCall()
2506 ClassDecl->getDestructor(), in EmitDelegatingCXXConstructorCall()
2543 CXXRecordDecl *ClassDecl = T->getAsCXXRecordDecl(); in PushDestructorCleanup()
2545 if (ClassDecl->hasTrivialDestructor()) return; in PushDestructorCleanup()
2547 const CXXDestructorDecl *D = ClassDecl->getDestructor(); in PushDestructorCleanup()
2548 assert(D && D->isUsed() && "destructor not marked as used!"); in PushDestructorCleanup()
2624 // If this base is a non-virtual primary base the address point has already in getVTablePointers()
2635 for (const auto &I : RD->bases()) { in getVTablePointers()
2637 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl()); in getVTablePointers()
2640 if (!BaseDecl->isDynamicClass()) in getVTablePointers()
2676 if (!RD->isDynamicClass()) in InitializeVTablePointers()
2684 if (RD->getNumVBases()) in InitializeVTablePointers()
2726 // If a class has a single non-virtual base and does not introduce or override
2734 // we allow it by default. It can be disabled with -fsanitize=cfi-cast-strict.
2737 if (!RD->field_empty()) in LeastDerivedClassWithSameLayout()
2740 if (RD->getNumVBases() != 0) in LeastDerivedClassWithSameLayout()
2743 if (RD->getNumBases() != 1) in LeastDerivedClassWithSameLayout()
2746 for (const CXXMethodDecl *MD : RD->methods()) { in LeastDerivedClassWithSameLayout()
2747 if (MD->isVirtual()) { in LeastDerivedClassWithSameLayout()
2751 if (isa<CXXDestructorDecl>(MD) && MD->isImplicit()) in LeastDerivedClassWithSameLayout()
2758 RD->bases_begin()->getType()->getAsCXXRecordDecl()); in LeastDerivedClassWithSameLayout()
2770 QualType Ty = QualType(RD->getTypeForDecl(), 0); in EmitTypeMetadataCodeForVCall()
2805 auto *ClassTy = T->getAs<RecordType>(); in EmitVTablePtrCheckForCast()
2809 const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(ClassTy->getDecl()); in EmitVTablePtrCheckForCast()
2811 if (!ClassDecl->isCompleteDefinition() || !ClassDecl->isDynamicClass()) in EmitVTablePtrCheckForCast()
2876 std::string TypeName = RD->getQualifiedNameAsString(); in EmitVTablePtrCheck()
2884 CGM.CreateMetadataIdentifierForType(QualType(RD->getTypeForDecl(), 0)); in EmitVTablePtrCheck()
2893 EmitCheckTypeDescriptor(QualType(RD->getTypeForDecl(), 0)), in EmitVTablePtrCheck()
2909 llvm::MDString::get(CGM.getLLVMContext(), "all-vtables")); in EmitVTablePtrCheck()
2928 std::string TypeName = RD->getQualifiedNameAsString(); in ShouldEmitVTableTypeCheckedLoad()
2941 CGM.CreateMetadataIdentifierForType(QualType(RD->getTypeForDecl(), 0)); in EmitVTableTypeCheckedLoad()
2949 std::string TypeName = RD->getQualifiedNameAsString(); in EmitVTableTypeCheckedLoad()
2975 callOperator->getType()->castAs<FunctionProtoType>(); in EmitForwardingCallToLambda()
2976 QualType resultType = FPT->getReturnType(); in EmitForwardingCallToLambda()
2978 if (!resultType->isVoidType() && in EmitForwardingCallToLambda()
2979 calleeFnInfo->getReturnInfo().getKind() == ABIArgInfo::Indirect && in EmitForwardingCallToLambda()
2980 !hasScalarEvaluationKind(calleeFnInfo->getReturnType())) in EmitForwardingCallToLambda()
2986 // the call can't be variadic anyway --- it's impossible to forward in EmitForwardingCallToLambda()
2994 if (!resultType->isVoidType() && returnSlot.isNull()) { in EmitForwardingCallToLambda()
2995 if (getLangOpts().ObjCAutoRefCount && resultType->isObjCRetainableType()) { in EmitForwardingCallToLambda()
3004 const BlockDecl *BD = BlockInfo->getBlockDecl(); in EmitLambdaBlockInvokeBody()
3005 const VarDecl *variable = BD->capture_begin()->getVariable(); in EmitLambdaBlockInvokeBody()
3006 const CXXRecordDecl *Lambda = variable->getType()->getAsCXXRecordDecl(); in EmitLambdaBlockInvokeBody()
3007 const CXXMethodDecl *CallOp = Lambda->getLambdaCallOperator(); in EmitLambdaBlockInvokeBody()
3009 if (CallOp->isVariadic()) { in EmitLambdaBlockInvokeBody()
3025 for (auto *param : BD->parameters()) in EmitLambdaBlockInvokeBody()
3026 EmitDelegateCallArg(CallArgs, param, param->getBeginLoc()); in EmitLambdaBlockInvokeBody()
3028 assert(!Lambda->isGenericLambda() && in EmitLambdaBlockInvokeBody()
3034 if (MD->isVariadic()) { in EmitLambdaStaticInvokeBody()
3042 const CXXRecordDecl *Lambda = MD->getParent(); in EmitLambdaStaticInvokeBody()
3058 for (auto *Param : MD->parameters()) in EmitLambdaDelegatingInvokeBody()
3059 EmitDelegateCallArg(CallArgs, Param, Param->getBeginLoc()); in EmitLambdaDelegatingInvokeBody()
3061 const CXXRecordDecl *Lambda = MD->getParent(); in EmitLambdaDelegatingInvokeBody()
3062 const CXXMethodDecl *CallOp = Lambda->getLambdaCallOperator(); in EmitLambdaDelegatingInvokeBody()
3064 // to which the call to the static-invoker shall be forwarded. in EmitLambdaDelegatingInvokeBody()
3065 if (Lambda->isGenericLambda()) { in EmitLambdaDelegatingInvokeBody()
3066 assert(MD->isFunctionTemplateSpecialization()); in EmitLambdaDelegatingInvokeBody()
3067 const TemplateArgumentList *TAL = MD->getTemplateSpecializationArgs(); in EmitLambdaDelegatingInvokeBody() local
3068 FunctionTemplateDecl *CallOpTemplate = CallOp->getDescribedFunctionTemplate(); in EmitLambdaDelegatingInvokeBody()
3071 CallOpTemplate->findSpecialization(TAL->asArray(), InsertPos); in EmitLambdaDelegatingInvokeBody()
3090 if (MD->isVariadic()) { in EmitLambdaInAllocaCallOpBody()
3099 QualType LambdaType = getContext().getRecordType(MD->getParent()); in EmitLambdaInAllocaCallOpBody()
3101 llvm::Value *ThisArg = CurFn->getArg(0); in EmitLambdaInAllocaCallOpBody()
3119 ArgTypes.push_back(I->type); in EmitLambdaInAllocaImplFn()
3129 StringRef CallOpName = CallOpFn->getName(); in EmitLambdaInAllocaImplFn()
3136 llvm::Function *Fn = CallOpFn->getParent()->getFunction(ImplName); in EmitLambdaInAllocaImplFn()