From 3bf273f06fc82a5ca699d64b57dbc734f05fd896 Mon Sep 17 00:00:00 2001 From: Augusto Noronha Date: Thu, 6 Jun 2024 12:29:05 -0700 Subject: [PATCH] Fix #pragma (packed, n) not emitting the alignment in debug info Debug info generation won't emit the alignment of types that have a standard alignment. It was not taking into account the that case. rdar://127785973 --- clang/lib/CodeGen/CGDebugInfo.cpp | 11 ++++++++++- clang/test/CodeGen/debug-info-packed-struct.c | 4 ++-- clang/test/CodeGenCXX/debug-info-struct-align.cpp | 8 ++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 5f6f911c7a6d69..681a475f9e4bec 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -58,7 +58,16 @@ using namespace clang::CodeGen; static uint32_t getTypeAlignIfRequired(const Type *Ty, const ASTContext &Ctx) { auto TI = Ctx.getTypeInfo(Ty); - return TI.isAlignRequired() ? TI.Align : 0; + if (TI.isAlignRequired()) + return TI.Align; + + // MaxFieldAlignmentAttr is the attribute added to types + // declared after #pragma pack(n). + if (auto *Decl = Ty->getAsRecordDecl()) + if (Decl->hasAttr()) + return TI.Align; + + return 0; } static uint32_t getTypeAlignIfRequired(QualType Ty, const ASTContext &Ctx) { diff --git a/clang/test/CodeGen/debug-info-packed-struct.c b/clang/test/CodeGen/debug-info-packed-struct.c index 6441a740e3799f..676cdb38b396f2 100644 --- a/clang/test/CodeGen/debug-info-packed-struct.c +++ b/clang/test/CodeGen/debug-info-packed-struct.c @@ -59,7 +59,7 @@ struct layout2 { #pragma pack() // CHECK: l2_ofs0 // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs1", -// CHECK-SAME: {{.*}}size: 64, offset: 8) +// CHECK-SAME: {{.*}}size: 64, align: 8, offset: 8) // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l2_ofs9", // CHECK-SAME: {{.*}}size: 1, offset: 72, flags: DIFlagBitField, extraData: i64 72) @@ -81,7 +81,7 @@ struct layout3 { #pragma pack() // CHECK: l3_ofs0 // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs4", -// CHECK-SAME: {{.*}}size: 64, offset: 32) +// CHECK-SAME: {{.*}}size: 64, align: 32, offset: 32) // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "l3_ofs12", // CHECK-SAME: {{.*}}size: 1, offset: 96, flags: DIFlagBitField, extraData: i64 96) diff --git a/clang/test/CodeGenCXX/debug-info-struct-align.cpp b/clang/test/CodeGenCXX/debug-info-struct-align.cpp index 1269cbce83ef0a..cd91f4c302ddc6 100644 --- a/clang/test/CodeGenCXX/debug-info-struct-align.cpp +++ b/clang/test/CodeGenCXX/debug-info-struct-align.cpp @@ -25,3 +25,11 @@ struct MyType2 { MyType2 mt2; static_assert(alignof(MyType2) == 1, "alignof MyType2 is wrong"); + +#pragma pack(1) +struct MyType3 { + int m; +}; +MyType3 mt3; + +static_assert(alignof(MyType3) == 1, "alignof MyType3 is wrong");