[cfe-commits] r130242 - in /cfe/trunk: lib/AST/ASTContext.cpp test/Sema/align-x86-64.c test/Sema/align-x86.c

Argyrios Kyrtzidis akyrtzi at gmail.com
Tue Apr 26 14:05:39 PDT 2011


Author: akirtzidis
Date: Tue Apr 26 16:05:39 2011
New Revision: 130242

URL: http://llvm.org/viewvc/llvm-project?rev=130242&view=rev
Log:
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.

Modified:
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/test/Sema/align-x86-64.c
    cfe/trunk/test/Sema/align-x86.c

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=130242&r1=130241&r2=130242&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Tue Apr 26 16:05:39 2011
@@ -724,6 +724,7 @@
     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:

Modified: cfe/trunk/test/Sema/align-x86-64.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/align-x86-64.c?rev=130242&r1=130241&r2=130242&view=diff
==============================================================================
--- cfe/trunk/test/Sema/align-x86-64.c (original)
+++ cfe/trunk/test/Sema/align-x86-64.c Tue Apr 26 16:05:39 2011
@@ -9,3 +9,17 @@
   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];

Modified: cfe/trunk/test/Sema/align-x86.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/align-x86.c?rev=130242&r1=130241&r2=130242&view=diff
==============================================================================
--- cfe/trunk/test/Sema/align-x86.c (original)
+++ cfe/trunk/test/Sema/align-x86.c Tue Apr 26 16:05:39 2011
@@ -18,3 +18,27 @@
 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];





More information about the cfe-commits mailing list