From cd88b4171753dcb2bc0a21d78f1597c796bb8a20 Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Tue, 26 Apr 2011 21:05:39 +0000 Subject: [PATCH] Gcc pads the size of an array using the alignment of its elements. The size of the array may not be aligned according to alignment of its elements if an alignment attribute is specified in a typedef. Fixes rdar://8665729 & http://llvm.org/PR5637. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130242 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 1 + test/Sema/align-x86-64.c | 14 ++++++++++++++ test/Sema/align-x86.c | 24 ++++++++++++++++++++++++ 3 files changed, 39 insertions(+) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index a31969dc90..e49bde3487 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -724,6 +724,7 @@ ASTContext::getTypeInfo(const Type *T) const { std::pair EltInfo = getTypeInfo(CAT->getElementType()); Width = EltInfo.first*CAT->getSize().getZExtValue(); Align = EltInfo.second; + Width = llvm::RoundUpToAlignment(Width, Align); break; } case Type::ExtVector: diff --git a/test/Sema/align-x86-64.c b/test/Sema/align-x86-64.c index 6dcf5714b0..edea5d8b74 100644 --- a/test/Sema/align-x86-64.c +++ b/test/Sema/align-x86-64.c @@ -9,3 +9,17 @@ void foo(void) { char y[__alignof__(x) == 16 ? 1 : -1]; frob(y); } + +// PR5637 + +typedef __attribute__((aligned(16))) struct { + unsigned long long w[3]; +} UINT192; + +UINT192 ten2mk192M[] = { + {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}}, + {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}}, + {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}} +}; + +short chk1[sizeof(ten2mk192M) == 80 ? 1 : -1]; diff --git a/test/Sema/align-x86.c b/test/Sema/align-x86.c index 0c84384305..61bd1d33c9 100644 --- a/test/Sema/align-x86.c +++ b/test/Sema/align-x86.c @@ -18,3 +18,27 @@ struct __attribute__((packed)) {unsigned int a;} g4; short chk1[__alignof__(g4) == 1 ? 1 : -1]; short chk2[__alignof__(g4.a) == 1 ? 1 : -1]; + +// PR5637 + +#define ALIGNED(x) __attribute__((aligned(x))) + +typedef ALIGNED(2) struct { + char a[3]; +} T; + +short chk1[sizeof(T) == 3 ? 1 : -1]; +short chk2[sizeof(T[1]) == 4 ? 1 : -1]; +short chk3[sizeof(T[2]) == 6 ? 1 : -1]; +short chk4[sizeof(T[2][1]) == 8 ? 1 : -1]; +short chk5[sizeof(T[1][2]) == 6 ? 1 : -1]; + +typedef struct ALIGNED(2) { + char a[3]; +} T2; + +short chk1[sizeof(T2) == 4 ? 1 : -1]; +short chk2[sizeof(T2[1]) == 4 ? 1 : -1]; +short chk3[sizeof(T2[2]) == 8 ? 1 : -1]; +short chk4[sizeof(T2[2][1]) == 8 ? 1 : -1]; +short chk5[sizeof(T2[1][2]) == 8 ? 1 : -1]; -- 2.50.1