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.

llvm-svn: 130242
This commit is contained in:
Argyrios Kyrtzidis 2011-04-26 21:05:39 +00:00
parent 029afe4787
commit ae40e4e10e
3 changed files with 39 additions and 0 deletions

View File

@ -724,6 +724,7 @@ ASTContext::getTypeInfo(const Type *T) const {
std::pair<uint64_t, unsigned> EltInfo = getTypeInfo(CAT->getElementType());
Width = EltInfo.first*CAT->getSize().getZExtValue();
Align = EltInfo.second;
Width = llvm::RoundUpToAlignment(Width, Align);
break;
}
case Type::ExtVector:

View File

@ -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];

View File

@ -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];