https://github.com/urnathan created https://github.com/llvm/llvm-project/pull/89055
Now that `accumulateBitfields` does the correct clipping, we don't need the scissor any more -- `checkBitfieldClipping` can compute its location directly. >From db5e6456f26ea9b859d3ff24161d7494d58bb7e1 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell <nat...@acm.org> Date: Mon, 1 Apr 2024 16:15:12 -0400 Subject: [PATCH] [clang] Remove class layout scissor --- clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 868b1ab98e048a..cc51cc3476c438 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -75,7 +75,7 @@ struct CGRecordLowering { // sentinel member type that ensures correct rounding. struct MemberInfo { CharUnits Offset; - enum InfoKind { VFPtr, VBPtr, Field, Base, VBase, Scissor } Kind; + enum InfoKind { VFPtr, VBPtr, Field, Base, VBase } Kind; llvm::Type *Data; union { const FieldDecl *FD; @@ -197,7 +197,7 @@ struct CGRecordLowering { const CXXRecordDecl *Query) const; void calculateZeroInit(); CharUnits calculateTailClippingOffset(bool isNonVirtualBaseType) const; - void checkBitfieldClipping() const; + void checkBitfieldClipping(bool isNonVirtualBaseType) const; /// Determines if we need a packed llvm struct. void determinePacked(bool NVBaseType); /// Inserts padding everywhere it's needed. @@ -299,8 +299,8 @@ void CGRecordLowering::lower(bool NVBaseType) { accumulateVBases(); } llvm::stable_sort(Members); + checkBitfieldClipping(NVBaseType); Members.push_back(StorageInfo(Size, getIntNType(8))); - checkBitfieldClipping(); determinePacked(NVBaseType); insertPadding(); Members.pop_back(); @@ -894,8 +894,6 @@ CGRecordLowering::calculateTailClippingOffset(bool isNonVirtualBaseType) const { } void CGRecordLowering::accumulateVBases() { - Members.push_back(MemberInfo(calculateTailClippingOffset(false), - MemberInfo::Scissor, nullptr, RD)); for (const auto &Base : RD->vbases()) { const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl(); if (BaseDecl->isEmpty()) @@ -950,18 +948,20 @@ void CGRecordLowering::calculateZeroInit() { } // Verify accumulateBitfields computed the correct storage representations. -void CGRecordLowering::checkBitfieldClipping() const { +void CGRecordLowering::checkBitfieldClipping( + bool isNonVirtualBaseType LLVM_ATTRIBUTE_UNUSED) const { #ifndef NDEBUG + auto ScissorOffset = calculateTailClippingOffset(isNonVirtualBaseType); auto Tail = CharUnits::Zero(); for (const auto &M : Members) { - // Only members with data and the scissor can cut into tail padding. - if (!M.Data && M.Kind != MemberInfo::Scissor) + // Only members with data could possibly overlap. + if (!M.Data) continue; assert(M.Offset >= Tail && "Bitfield access unit is not clipped"); - Tail = M.Offset; - if (M.Data) - Tail += getSize(M.Data); + Tail = M.Offset + getSize(M.Data); + assert((Tail <= ScissorOffset || M.Offset >= ScissorOffset) && + "Bitfield straddles scissor offset"); } #endif } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits