ebevhan created this revision. ebevhan added reviewers: jasonliu, efriedma. Herald added a project: clang. Herald added a subscriber: cfe-commits. ebevhan requested review of this revision.
In D79719 <https://reviews.llvm.org/D79719>, LayoutField was refactored to fetch the size of field types in bits and then convert to chars, rather than fetching them in chars directly. This is not ideal, since it makes the calculations char size dependent, and breaks for sizes that are not a multiple of the char size. This patch changes it to use getTypeInfoInChars instead of getTypeInfo. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D85191 Files: clang/lib/AST/RecordLayoutBuilder.cpp Index: clang/lib/AST/RecordLayoutBuilder.cpp =================================================================== --- clang/lib/AST/RecordLayoutBuilder.cpp +++ clang/lib/AST/RecordLayoutBuilder.cpp @@ -1838,14 +1838,13 @@ CharUnits EffectiveFieldSize; auto setDeclInfo = [&](bool IsIncompleteArrayType) { - TypeInfo TI = Context.getTypeInfo(D->getType()); - FieldAlign = Context.toCharUnitsFromBits(TI.Align); + auto TI = Context.getTypeInfoInChars(D->getType()); + FieldAlign = TI.second; // Flexible array members don't have any size, but they have to be // aligned appropriately for their element type. EffectiveFieldSize = FieldSize = - IsIncompleteArrayType ? CharUnits::Zero() - : Context.toCharUnitsFromBits(TI.Width); - AlignIsRequired = TI.AlignIsRequired; + IsIncompleteArrayType ? CharUnits::Zero() : TI.first; + AlignIsRequired = Context.getTypeInfo(D->getType()).AlignIsRequired; }; if (D->getType()->isIncompleteArrayType()) {
Index: clang/lib/AST/RecordLayoutBuilder.cpp =================================================================== --- clang/lib/AST/RecordLayoutBuilder.cpp +++ clang/lib/AST/RecordLayoutBuilder.cpp @@ -1838,14 +1838,13 @@ CharUnits EffectiveFieldSize; auto setDeclInfo = [&](bool IsIncompleteArrayType) { - TypeInfo TI = Context.getTypeInfo(D->getType()); - FieldAlign = Context.toCharUnitsFromBits(TI.Align); + auto TI = Context.getTypeInfoInChars(D->getType()); + FieldAlign = TI.second; // Flexible array members don't have any size, but they have to be // aligned appropriately for their element type. EffectiveFieldSize = FieldSize = - IsIncompleteArrayType ? CharUnits::Zero() - : Context.toCharUnitsFromBits(TI.Width); - AlignIsRequired = TI.AlignIsRequired; + IsIncompleteArrayType ? CharUnits::Zero() : TI.first; + AlignIsRequired = Context.getTypeInfo(D->getType()).AlignIsRequired; }; if (D->getType()->isIncompleteArrayType()) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits