@@ -226,13 +226,13 @@ static bool IsEligibleForReplacement(Sema &SemaRef, const CXXRecordDecl *D) {
226226 return !D->hasDeletedDestructor ();
227227}
228228
229- ASTContext::TypeRelocationInfo
230- Sema::GetCXX2CTypeRelocationInfo (const CXXRecordDecl *D) {
229+ ASTContext::CXXRecordDeclRelocationInfo
230+ Sema::CheckCXX2CRelocatableAndReplaceable (const CXXRecordDecl *D) {
231231 if (auto ExistingInfo = Context.getRelocationInfoForCXXRecord (D))
232232 return *ExistingInfo;
233233
234234 if (!getLangOpts ().CPlusPlus || D->isInvalidDecl ())
235- return ASTContext::TypeRelocationInfo::invalid ();
235+ return CXXRecordDeclRelocationInfo::NonRelocatable ();
236236
237237 assert (D->hasDefinition ());
238238
@@ -260,9 +260,8 @@ Sema::GetCXX2CTypeRelocationInfo(const CXXRecordDecl *D) {
260260 return *Is;
261261 };
262262
263- ASTContext::TypeRelocationInfo Info;
264-
265- Info.updateRelocatable ([&] {
263+ ASTContext::CXXRecordDeclRelocationInfo Info;
264+ Info.IsRelocatable = [&] {
266265 if (D->isDependentType ())
267266 return false ;
268267
@@ -280,9 +279,9 @@ Sema::GetCXX2CTypeRelocationInfo(const CXXRecordDecl *D) {
280279
281280 // is default-movable.
282281 return IsDefaultMovable ();
283- }()) ;
282+ }();
284283
285- Info.updateReplaceable ( [&] {
284+ Info.IsReplaceable = [&] {
286285 if (D->isDependentType ())
287286 return false ;
288287
@@ -300,42 +299,45 @@ Sema::GetCXX2CTypeRelocationInfo(const CXXRecordDecl *D) {
300299
301300 // is default-movable.
302301 return IsDefaultMovable ();
303- }());
304-
305- Info.setIsUnion (D->isUnion ());
302+ }();
306303
307304 bool PtrauthMatters = LangOpts.PointerAuthIntrinsics ||
308305 LangOpts.PointerAuthVTPtrAddressDiscrimination ;
309306 if (PtrauthMatters) {
310- auto IsBottomRelocationInfo =
311- [](const ASTContext::TypeRelocationInfo &Info) {
312- return !Info.isReplaceable () && !Info.isRelocatable () &&
313- Info.hasAddressDiscriminatedPointerAuth ();
314- };
307+ bool IsUnion = D->isUnion ();
308+ auto RecordPointerAuth = [&](bool HasAddressDiscrimination) {
309+ if (HasAddressDiscrimination && IsUnion) {
310+ Info.IsRelocatable = false ;
311+ Info.IsReplaceable = false ;
312+ }
313+ };
314+ auto IsBottomRelocationInfo = [](const CXXRecordDeclRelocationInfo &Info) {
315+ return !Info.IsReplaceable && !Info.IsRelocatable ;
316+ };
315317
316318 if (D->isPolymorphic ())
317- Info.updateContainsAddressDiscriminatedValues (
318- Context.hasAddressDiscriminatedVTableAuthentication (D));
319+ RecordPointerAuth (Context.hasAddressDiscriminatedVTableAuthentication (D));
319320 for (auto Base : D->bases ()) {
320321 if (IsBottomRelocationInfo (Info))
321322 break ;
322- bool BaseHasPtrauth = GetCXX2CTypeRelocationInfo (Base. getType ())
323- . hasAddressDiscriminatedPointerAuth ( );
324- Info. updateContainsAddressDiscriminatedValues (BaseHasPtrauth);
323+ bool BaseHasPtrauth =
324+ Context. containsAddressDiscriminatedPointerAuth (Base. getType () );
325+ RecordPointerAuth (BaseHasPtrauth);
325326 }
326327 for (auto *FieldDecl : D->fields ()) {
327328 if (IsBottomRelocationInfo (Info))
328329 break ;
329- bool FieldHasPtrauth = GetCXX2CTypeRelocationInfo (FieldDecl-> getType ())
330- . hasAddressDiscriminatedPointerAuth ( );
331- Info. updateContainsAddressDiscriminatedValues (FieldHasPtrauth);
330+ bool FieldHasPtrauth =
331+ Context. containsAddressDiscriminatedPointerAuth (FieldDecl-> getType () );
332+ RecordPointerAuth (FieldHasPtrauth);
332333 }
333334 }
334335 Context.setRelocationInfoForCXXRecord (D, Info);
335336 return Info;
336337}
337338
338- ASTContext::TypeRelocationInfo Sema::GetCXX2CTypeRelocationInfo (QualType T) {
339+ ASTContext::CXXRecordDeclRelocationInfo
340+ Sema::CheckCXX2CRelocatableAndReplaceable (QualType T) {
339341 T = T.getCanonicalType ();
340342 enum class DirectRelocationInformation { Yes, No, Unknown };
341343 DirectRelocationInformation Relocatable =
@@ -356,10 +358,8 @@ ASTContext::TypeRelocationInfo Sema::GetCXX2CTypeRelocationInfo(QualType T) {
356358 Replaceable = DRI;
357359 };
358360 auto UpdateAddressDiscrimination = [&](DirectRelocationInformation DRI) {
359- if (ContainsAddressDiscriminatedValues ==
360- DirectRelocationInformation::Unknown ||
361- ContainsAddressDiscriminatedValues == DirectRelocationInformation::No)
362- ContainsAddressDiscriminatedValues = DRI;
361+ if (ContainsAddressDiscriminatedValues == DirectRelocationInformation::Yes)
362+ Replaceable = DirectRelocationInformation::No;
363363 };
364364
365365 if (T->isVariableArrayType ()) {
@@ -393,12 +393,9 @@ ASTContext::TypeRelocationInfo Sema::GetCXX2CTypeRelocationInfo(QualType T) {
393393 if (BaseElementType->isVectorType ())
394394 UpdateRelocatable (DirectRelocationInformation::Yes);
395395
396- auto CreateInfo = [=]() -> ASTContext::TypeRelocationInfo {
397- ASTContext::TypeRelocationInfo Result;
396+ auto CreateInfo = [=]() -> CXXRecordDeclRelocationInfo {
398397 return {Relocatable == DirectRelocationInformation::Yes,
399- Replaceable == DirectRelocationInformation::Yes,
400- ContainsAddressDiscriminatedValues ==
401- DirectRelocationInformation::Yes};
398+ Replaceable == DirectRelocationInformation::Yes};
402399 };
403400
404401 if (BaseElementType->isIncompleteType ())
@@ -408,20 +405,18 @@ ASTContext::TypeRelocationInfo Sema::GetCXX2CTypeRelocationInfo(QualType T) {
408405 if (!RD)
409406 return CreateInfo ();
410407
411- ASTContext::TypeRelocationInfo Info = GetCXX2CTypeRelocationInfo (RD);
412- Info.updateRelocatable (Relocatable != DirectRelocationInformation::No);
413- Info.updateReplaceable (Replaceable != DirectRelocationInformation::No);
414- Info.updateContainsAddressDiscriminatedValues (
415- ContainsAddressDiscriminatedValues == DirectRelocationInformation::Yes);
408+ CXXRecordDeclRelocationInfo Info = CheckCXX2CRelocatableAndReplaceable (RD);
409+ Info.IsRelocatable &= Relocatable != DirectRelocationInformation::No;
410+ Info.IsReplaceable &= Replaceable != DirectRelocationInformation::No;
416411 return Info;
417412}
418413
419414bool Sema::IsCXXTriviallyRelocatableType (QualType Type) {
420- return GetCXX2CTypeRelocationInfo (Type).isRelocatable () ;
415+ return CheckCXX2CRelocatableAndReplaceable (Type).IsRelocatable ;
421416}
422417
423418bool Sema::IsCXXReplaceableType (QualType Type) {
424- return GetCXX2CTypeRelocationInfo (Type).isReplaceable () ;
419+ return CheckCXX2CRelocatableAndReplaceable (Type).IsReplaceable ;
425420}
426421
427422// / Checks that type T is not a VLA.
@@ -722,7 +717,8 @@ static bool isTriviallyEqualityComparableType(Sema &S, QualType Type,
722717}
723718
724719static bool IsTriviallyRelocatableType (Sema &SemaRef, QualType T) {
725- QualType BaseElementType = SemaRef.getASTContext ().getBaseElementType (T);
720+ ASTContext &Ctx = SemaRef.getASTContext ();
721+ QualType BaseElementType = Ctx.getBaseElementType (T);
726722
727723 if (BaseElementType->isIncompleteType ())
728724 return false ;
@@ -732,13 +728,14 @@ static bool IsTriviallyRelocatableType(Sema &SemaRef, QualType T) {
732728 if (T.hasAddressDiscriminatedPointerAuth ())
733729 return false ;
734730
731+ if (Ctx.containsAddressDiscriminatedPointerAuth (BaseElementType))
732+ return false ;
733+
735734 if (const auto *RD = BaseElementType->getAsCXXRecordDecl ();
736735 RD && !RD->isPolymorphic ()) {
737- ASTContext::TypeRelocationInfo Info =
738- SemaRef.GetCXX2CTypeRelocationInfo (RD);
739- if (Info.hasAddressDiscriminatedPointerAuth ())
740- return false ;
741- if (Info.isRelocatable ())
736+ ASTContext::CXXRecordDeclRelocationInfo Info =
737+ SemaRef.CheckCXX2CRelocatableAndReplaceable (RD);
738+ if (Info.IsRelocatable )
742739 return true ;
743740 }
744741
0 commit comments