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.

llvm-svn: 171328
This commit is contained in:
Chandler Carruth 2012-12-31 22:18:01 +00:00
parent b12634bf80
commit 3fa2010c7d
1 changed files with 12 additions and 5 deletions

View 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> { \