From: Chandler Carruth Date: Fri, 17 Aug 2012 01:47:25 +0000 (+0000) Subject: Flatten the aligned-char-array utility template to be a directly X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=cbeb8d9869aafec3c2c1ee0922f0a4d5bb4a916a;p=oota-llvm.git Flatten the aligned-char-array utility template to be a directly templated union at the request of Richard Smith. This makes it substantially easier to type. =] git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162072 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/DenseMap.h b/include/llvm/ADT/DenseMap.h index 65a70fbfa6d..f60d688c0dc 100644 --- a/include/llvm/ADT/DenseMap.h +++ b/include/llvm/ADT/DenseMap.h @@ -687,8 +687,7 @@ class SmallDenseMap /// A "union" of an inline bucket array and the struct representing /// a large bucket. This union will be discriminated by the 'Small' bit. - typename AlignedCharArray::union_type - storage; + AlignedCharArrayUnion storage; public: explicit SmallDenseMap(unsigned NumInitBuckets = 0) { @@ -834,8 +833,7 @@ public: return; // Nothing to do. // First move the inline buckets into a temporary storage. - typename AlignedCharArray::union_type - TmpStorage; + AlignedCharArrayUnion TmpStorage; BucketT *TmpBegin = reinterpret_cast(TmpStorage.buffer); BucketT *TmpEnd = TmpBegin; diff --git a/include/llvm/Support/AlignOf.h b/include/llvm/Support/AlignOf.h index 85607c84482..cf7125173ee 100644 --- a/include/llvm/Support/AlignOf.h +++ b/include/llvm/Support/AlignOf.h @@ -107,8 +107,8 @@ LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8192); // Any larger and MSVC complains. #undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT -/// \brief This class template exposes a typedef for type containing a suitable -/// aligned character array to hold elements of any of up to four types. +/// \brief This union template exposes a suitably aligned and sized character +/// array member which can hold elements of any of up to four types. /// /// These types may be arrays, structs, or any other types. The goal is to /// produce a union type containing a character array which, when used, forms @@ -116,7 +116,8 @@ LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8192); /// than four types can be added at the cost of more boiler plate. template -class AlignedCharArray { +union AlignedCharArrayUnion { +private: class AlignerImpl { T1 t1; T2 t2; T3 t3; T4 t4; @@ -127,6 +128,12 @@ class AlignedCharArray { }; public: + /// \brief The character array buffer for use by clients. + /// + /// No other member of this union should be referenced. The exist purely to + /// constrain the layout of this character array. + char buffer[sizeof(SizerImpl)]; + // Sadly, Clang and GCC both fail to align a character array properly even // with an explicit alignment attribute. To work around this, we union // the character array that will actually be used with a struct that contains @@ -134,16 +141,10 @@ public: // and GCC will properly register the alignment of a struct containing an // aligned member, and this alignment should carry over to the character // array in the union. - union union_type { - // This is the only member of the union which should be used by clients: - char buffer[sizeof(SizerImpl)]; - - // This member of the union only exists to force the alignment. - struct { - typename llvm::AlignedCharArrayImpl::Alignment>::type - nonce_inner_member; - } nonce_member; - }; + struct { + typename llvm::AlignedCharArrayImpl::Alignment>::type + nonce_inner_member; + } nonce_member; }; } // end namespace llvm diff --git a/unittests/Support/AlignOfTest.cpp b/unittests/Support/AlignOfTest.cpp index c45db2cdc00..6f576681a3e 100644 --- a/unittests/Support/AlignOfTest.cpp +++ b/unittests/Support/AlignOfTest.cpp @@ -178,150 +178,150 @@ TEST(AlignOfTest, BasicAlignedArray) { // types because of the bugs mentioned above where GCC and Clang both // disregard the arbitrary alignment specifier until the type is used to // declare a member of a struct. - EXPECT_LE(1u, alignOf::union_type>()); - EXPECT_LE(2u, alignOf::union_type>()); - EXPECT_LE(4u, alignOf::union_type>()); - EXPECT_LE(8u, alignOf::union_type>()); + EXPECT_LE(1u, alignOf >()); + EXPECT_LE(2u, alignOf >()); + EXPECT_LE(4u, alignOf >()); + EXPECT_LE(8u, alignOf >()); - EXPECT_LE(1u, sizeof(AlignedCharArray::union_type)); - EXPECT_LE(2u, sizeof(AlignedCharArray::union_type)); - EXPECT_LE(4u, sizeof(AlignedCharArray::union_type)); - EXPECT_LE(8u, sizeof(AlignedCharArray::union_type)); + EXPECT_LE(1u, sizeof(AlignedCharArrayUnion)); + EXPECT_LE(2u, sizeof(AlignedCharArrayUnion)); + EXPECT_LE(4u, sizeof(AlignedCharArrayUnion)); + EXPECT_LE(8u, sizeof(AlignedCharArrayUnion)); - EXPECT_EQ(1u, (alignOf::union_type>())); - EXPECT_EQ(2u, (alignOf::union_type>())); - EXPECT_EQ(4u, (alignOf::union_type>())); - EXPECT_EQ(8u, (alignOf::union_type>())); + EXPECT_EQ(1u, (alignOf >())); + EXPECT_EQ(2u, (alignOf >())); + EXPECT_EQ(4u, (alignOf >())); + EXPECT_EQ(8u, (alignOf >())); - EXPECT_EQ(1u, sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(2u, sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(4u, sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(8u, sizeof(AlignedCharArray::union_type)); + EXPECT_EQ(1u, sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(2u, sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(4u, sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(8u, sizeof(AlignedCharArrayUnion)); - EXPECT_EQ(1u, (alignOf::union_type>())); - EXPECT_EQ(2u, (alignOf::union_type>())); - EXPECT_EQ(4u, (alignOf::union_type>())); - EXPECT_EQ(8u, (alignOf::union_type>())); + EXPECT_EQ(1u, (alignOf >())); + EXPECT_EQ(2u, (alignOf >())); + EXPECT_EQ(4u, (alignOf >())); + EXPECT_EQ(8u, (alignOf >())); - EXPECT_EQ(1u, sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(2u, sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(4u, sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(16u, sizeof(AlignedCharArray::union_type)); + EXPECT_EQ(1u, sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(2u, sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(4u, sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(16u, sizeof(AlignedCharArrayUnion)); // For other tests we simply assert that the alignment of the union mathes // that of the fundamental type and hope that we have any weird type // productions that would trigger bugs. - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); EXPECT_EQ(alignOf(), - alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); + alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); EXPECT_EQ(alignOf(), - alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); + alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); EXPECT_EQ(alignOf(), - alignOf::union_type>()); + alignOf >()); EXPECT_EQ(alignOf(), - alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); - EXPECT_EQ(alignOf(), alignOf::union_type>()); + alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); + EXPECT_EQ(alignOf(), alignOf >()); // Some versions of MSVC get this wrong somewhat disturbingly. The failure // appears to be benign: alignOf() produces a preposterous value: 12 #ifndef _MSC_VER - EXPECT_EQ(alignOf(), alignOf::union_type>()); + EXPECT_EQ(alignOf(), alignOf >()); #endif - EXPECT_EQ(sizeof(char), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[1]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[2]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[3]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[4]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[5]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[8]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[13]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[16]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[21]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(char[32]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(short), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(int), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(long), sizeof(AlignedCharArray::union_type)); + EXPECT_EQ(sizeof(char), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[1]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[2]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[3]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[4]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[5]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[8]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[13]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[16]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[21]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(char[32]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(short), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(int), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(long), sizeof(AlignedCharArrayUnion)); EXPECT_EQ(sizeof(long long), - sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(float), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(double), sizeof(AlignedCharArray::union_type)); + sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(float), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(double), sizeof(AlignedCharArrayUnion)); EXPECT_EQ(sizeof(long double), - sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(void *), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(int *), sizeof(AlignedCharArray::union_type)); + sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(void *), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(int *), sizeof(AlignedCharArrayUnion)); EXPECT_EQ(sizeof(double (*)(double)), - sizeof(AlignedCharArray::union_type)); + sizeof(AlignedCharArrayUnion)); EXPECT_EQ(sizeof(double (S6::*)()), - sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(S1), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(S2), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(S3), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(S4), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(S5), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(S6), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D1), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D2), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D3), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D4), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D5), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D6), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D7), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D8), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[1]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[2]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[3]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[4]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[5]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[8]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[13]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[16]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[21]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(D9[32]), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V1), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V2), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V3), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V4), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V5), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V6), sizeof(AlignedCharArray::union_type)); - EXPECT_EQ(sizeof(V7), sizeof(AlignedCharArray::union_type)); + sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(S1), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(S2), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(S3), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(S4), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(S5), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(S6), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D1), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D2), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D3), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D4), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D5), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D6), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D7), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D8), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[1]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[2]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[3]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[4]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[5]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[8]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[13]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[16]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[21]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(D9[32]), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V1), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V2), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V3), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V4), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V5), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V6), sizeof(AlignedCharArrayUnion)); + EXPECT_EQ(sizeof(V7), sizeof(AlignedCharArrayUnion)); // Some versions of MSVC also get this wrong. The failure again appears to be // benign: sizeof(V8) is only 52 bytes, but our array reserves 56. #ifndef _MSC_VER - EXPECT_EQ(sizeof(V8), sizeof(AlignedCharArray::union_type)); + EXPECT_EQ(sizeof(V8), sizeof(AlignedCharArrayUnion)); #endif }