Remove the declspecs from small alignments that we can force with
authorChandler Carruth <chandlerc@gmail.com>
Mon, 31 Dec 2012 22:18:01 +0000 (22:18 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 31 Dec 2012 22:18:01 +0000 (22:18 +0000)
a union. These don't actually work for by-value function arguments, and
MSVC warns if they exist even while (we hope) it aligns the argument
correctly due to the other union member.

This means MSVC will miss out on optimizations based on the alignment of
the buffer, but really, there aren't that many for x86 and MSVC is
likely not doing a great job of optimizing LLVM and Clang anyways.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171328 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/AlignOf.h

index f8e2cfa243826d20d132d1a9a2e2262e80ab88c6..0894316f065e51b88a7e30c8084d305bbc463eea 100644 (file)
@@ -111,13 +111,16 @@ struct AlignedCharArray;
 // We provide special variations of this template for the most common
 // alignments because __declspec(align(...)) doesn't actually work when it is
 // a member of a by-value function argument in MSVC, even if the alignment
-// request is something reasonably like 8-byte or 16-byte.
+// request is something reasonably like 8-byte or 16-byte. Note that we can't
+// even include the declspec with the union that forces the alignment because
+// MSVC warns on the existence of the declspec despite the union member forcing
+// proper alignment.
 
 template<std::size_t Size>
 struct AlignedCharArray<1, Size> {
   union {
     char aligned;
-    __declspec(align(1)) char buffer[Size];
+    char buffer[Size];
   };
 };
 
@@ -125,7 +128,7 @@ template<std::size_t Size>
 struct AlignedCharArray<2, Size> {
   union {
     short aligned;
-    __declspec(align(2)) char buffer[Size];
+    char buffer[Size];
   };
 };
 
@@ -133,7 +136,7 @@ template<std::size_t Size>
 struct AlignedCharArray<4, Size> {
   union {
     int aligned;
-    __declspec(align(4)) char buffer[Size];
+    char buffer[Size];
   };
 };
 
@@ -141,10 +144,14 @@ template<std::size_t Size>
 struct AlignedCharArray<8, Size> {
   union {
     double aligned;
-    __declspec(align(8)) char buffer[Size];
+    char buffer[Size];
   };
 };
 
+
+// The rest of these are provided with a __declspec(align(...)) and we simply
+// can't pass them by-value as function arguments on MSVC.
+
 #define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
   template<std::size_t Size> \
   struct AlignedCharArray<x, Size> { \