[llvm-commits] [llvm] r171328 - /llvm/trunk/include/llvm/Support/AlignOf.h

Chandler Carruth chandlerc at gmail.com
Mon Dec 31 14:18:02 PST 2012


Author: chandlerc
Date: Mon Dec 31 16:18:01 2012
New Revision: 171328

URL: http://llvm.org/viewvc/llvm-project?rev=171328&view=rev
Log:
Remove the declspecs from small alignments that we can force with
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.

Modified:
    llvm/trunk/include/llvm/Support/AlignOf.h

Modified: llvm/trunk/include/llvm/Support/AlignOf.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/AlignOf.h?rev=171328&r1=171327&r2=171328&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/AlignOf.h (original)
+++ llvm/trunk/include/llvm/Support/AlignOf.h Mon Dec 31 16:18:01 2012
@@ -111,13 +111,16 @@
 // 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 @@
 struct AlignedCharArray<2, Size> {
   union {
     short aligned;
-    __declspec(align(2)) char buffer[Size];
+    char buffer[Size];
   };
 };
 
@@ -133,7 +136,7 @@
 struct AlignedCharArray<4, Size> {
   union {
     int aligned;
-    __declspec(align(4)) char buffer[Size];
+    char buffer[Size];
   };
 };
 
@@ -141,10 +144,14 @@
 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> { \





More information about the llvm-commits mailing list