]> granicus.if.org Git - clang/commitdiff
Gcc pads the size of an array using the alignment of its elements.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 26 Apr 2011 21:05:39 +0000 (21:05 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Tue, 26 Apr 2011 21:05:39 +0000 (21:05 +0000)
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
test/Sema/align-x86-64.c
test/Sema/align-x86.c

index a31969dc9077a9250b0e394507523465bfebbcf5..e49bde3487ebe41b2c9800559c5997b4b8ee68e4 100644 (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:
index 6dcf5714b00538b47dc10a2d97f21fedb43b7a09..edea5d8b742232fc57fe3fe2bfac2f3705c6b236 100644 (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];
index 0c84384305a75d4e1dea97ddfa37a741e11c4550..61bd1d33c9d6e457af92615cfffd1941637bc5f0 100644 (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];