Bug 51277: [DWARF] DW_AT_alignment incorrect when

attribute((__aligned__)) is present but ignored`

In the original code, the 'getDeclAlignIfRequired' function is used.
The 'getDeclAlignIfRequired' function will return the max alignment
of all aligned attributes if the type has aligned attributes. The
function doesn't consider the type at all.

The 'getTypeAlignIfRequired' function uses the type's alignment value,
which also used by the 'alignof' function. I think we should use the
function of 'getTypeAlignIfRequired'.

Reviewed By: dblaikie, jmorse, wolfgangp

Differential Revision: https://reviews.llvm.org/D124006
This commit is contained in:
Ying Yi 2022-04-06 12:18:15 +01:00 committed by Ying Yi
parent ba46ae7bd8
commit b09ba42620
2 changed files with 32 additions and 1 deletions

View File

@ -3561,7 +3561,11 @@ llvm::DICompositeType *CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
return getOrCreateRecordFwdDecl(Ty, RDContext);
uint64_t Size = CGM.getContext().getTypeSize(Ty);
auto Align = getDeclAlignIfRequired(D, CGM.getContext());
// __attribute__((aligned)) can increase or decrease alignment *except* on a
// struct or struct member, where it only increases alignment unless 'packed'
// is also specified. To handle this case, the `getTypeAlignIfRequired` needs
// to be used.
auto Align = getTypeAlignIfRequired(Ty, CGM.getContext());
SmallString<256> Identifier = getTypeIdentifier(Ty, CGM, TheCU);

View File

@ -0,0 +1,27 @@
// Test for debug info related to DW_AT_alignment attribute in the struct type.
// RUN: %clang_cc1 -dwarf-version=5 -debug-info-kind=standalone -S -emit-llvm %s -o - | FileCheck %s
// CHECK-DAG: DICompositeType(tag: DW_TAG_structure_type, name: "MyType", {{.*}}, align: 32
// CHECK-DAG: DICompositeType(tag: DW_TAG_structure_type, name: "MyType1", {{.*}}, align: 8
// CHECK-DAG: DICompositeType(tag: DW_TAG_structure_type, name: "MyType2", {{.*}}, align: 8
struct MyType {
int m;
} __attribute__((aligned(1)));
MyType mt;
static_assert(alignof(MyType) == 4, "alignof MyType is wrong");
struct MyType1 {
int m;
} __attribute__((packed, aligned(1)));
MyType1 mt1;
static_assert(alignof(MyType1) == 1, "alignof MyType1 is wrong");
struct MyType2 {
__attribute__((packed)) int m;
} __attribute__((aligned(1)));
MyType2 mt2;
static_assert(alignof(MyType2) == 1, "alignof MyType2 is wrong");