diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -3561,7 +3561,11 @@ 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); diff --git a/clang/test/CodeGenCXX/debug-info-struct-align.cpp b/clang/test/CodeGenCXX/debug-info-struct-align.cpp new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenCXX/debug-info-struct-align.cpp @@ -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");