From 02d75477cd9bed5acf46979869f041e7f9726200 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 31 Dec 2012 22:18:01 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171328 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/AlignOf.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/include/llvm/Support/AlignOf.h b/include/llvm/Support/AlignOf.h index f8e2cfa2438..0894316f065 100644 --- a/include/llvm/Support/AlignOf.h +++ b/include/llvm/Support/AlignOf.h @@ -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 struct AlignedCharArray<1, Size> { union { char aligned; - __declspec(align(1)) char buffer[Size]; + char buffer[Size]; }; }; @@ -125,7 +128,7 @@ template struct AlignedCharArray<2, Size> { union { short aligned; - __declspec(align(2)) char buffer[Size]; + char buffer[Size]; }; }; @@ -133,7 +136,7 @@ template struct AlignedCharArray<4, Size> { union { int aligned; - __declspec(align(4)) char buffer[Size]; + char buffer[Size]; }; }; @@ -141,10 +144,14 @@ template 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 \ struct AlignedCharArray { \ -- 2.34.1