[llvm] r233910 - [support] Add a macro wrapper for alignas and simplify some code.

Benjamin Kramer benny.kra at gmail.com
Thu Apr 2 06:37:12 PDT 2015


On Thu, Apr 2, 2015 at 3:21 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> ----- Original Message -----
>> From: "Benjamin Kramer" <benny.kra at googlemail.com>
>> To: llvm-commits at cs.uiuc.edu
>> Sent: Thursday, April 2, 2015 6:32:49 AM
>> Subject: [llvm] r233910 - [support] Add a macro wrapper for alignas and       simplify some code.
>>
>> Author: d0k
>> Date: Thu Apr  2 06:32:48 2015
>> New Revision: 233910
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=233910&view=rev
>> Log:
>> [support] Add a macro wrapper for alignas and simplify some code.
>>
>> We wrap __attribute((aligned)) for GCC 4.7 and __declspec(align) for
>> MSVC. The latter behaves weird in some contexts so this should be
>> used
>> carefully.
>>
>> Modified:
>>     llvm/trunk/include/llvm/Support/AlignOf.h
>>     llvm/trunk/include/llvm/Support/Compiler.h
>>     llvm/trunk/unittests/Support/AlignOfTest.cpp
>>
>> Modified: llvm/trunk/include/llvm/Support/AlignOf.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/AlignOf.h?rev=233910&r1=233909&r2=233910&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Support/AlignOf.h (original)
>> +++ llvm/trunk/include/llvm/Support/AlignOf.h Thu Apr  2 06:32:48
>> 2015
>> @@ -70,38 +70,11 @@ inline unsigned alignOf() { return Align
>>  // MSVC requires special handling here.
>>  #ifndef _MSC_VER
>>
>> -#if __has_feature(cxx_alignas)
>>  template<std::size_t Alignment, std::size_t Size>
>>  struct AlignedCharArray {
>> -  alignas(Alignment) char buffer[Size];
>> +  LLVM_ALIGNAS(Alignment) char buffer[Size];
>>  };
>
> Looks like this broke the GCC 4.8.0 build:
>
> llvm[1]: Compiling BlockFrequency.cpp for Release+Asserts build
> In file included from /llvm/include/llvm/ADT/SmallVector.h:18:0,
>                  from /llvm/include/llvm/Support/Allocator.h:24,
>                  from /llvm/lib/Support/Allocator.cpp:14:
> /llvm/include/llvm/Support/AlignOf.h:75:43: error: requested alignment is not an integer constant
>    LLVM_ALIGNAS(Alignment) char buffer[Size];
>                                            ^
> In file included from /llvm/include/llvm/ADT/SmallVector.h:18:0,
>                  from /llvm/include/llvm/ADT/ArrayRef.h:14,
>                  from /llvm/include/llvm/Support/ARMWinEH.h:13,
>                  from /llvm/lib/Support/ARMWinEH.cpp:10:
> /llvm/include/llvm/Support/AlignOf.h:75:43: error: requested alignment is not an integer constant
>    LLVM_ALIGNAS(Alignment) char buffer[Size];

Right, this is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56859 I
reverted the critical part for now. I tested this with 4.7.3 and
4.8.2, which worked fine.

- Ben
>
> ...
>
>>
>> -#elif defined(__GNUC__) || defined(__IBM_ATTRIBUTES)
>> -/// \brief Create a type with an aligned char buffer.
>> -template<std::size_t Alignment, std::size_t Size>
>> -struct AlignedCharArray;
>> -
>> -#define LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(x) \
>> -  template<std::size_t Size> \
>> -  struct AlignedCharArray<x, Size> { \
>> -    __attribute__((aligned(x))) char buffer[Size]; \
>> -  };
>> -
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(1)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(2)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(4)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(8)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(16)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(32)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(64)
>> -LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT(128)
>> -
>> -#undef LLVM_ALIGNEDCHARARRAY_TEMPLATE_ALIGNMENT
>> -
>> -#else
>> -# error No supported align as directive.
>> -#endif
>> -
>>  #else // _MSC_VER
>>
>>  /// \brief Create a type with an aligned char buffer.
>>
>> Modified: llvm/trunk/include/llvm/Support/Compiler.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Compiler.h?rev=233910&r1=233909&r2=233910&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Support/Compiler.h (original)
>> +++ llvm/trunk/include/llvm/Support/Compiler.h Thu Apr  2 06:32:48
>> 2015
>> @@ -281,6 +281,20 @@
>>  # define LLVM_ASSUME_ALIGNED(p, a) (p)
>>  #endif
>>
>> +/// \macro LLVM_ALIGNAS
>> +/// \brief Used to specify a minimum alignment for a structure or
>> variable. The
>> +/// alignment must be a constant integer.
>> +///
>> +/// Note that __declspec(align) has special quirks, it's not legal
>> to pass a
>> +/// structure with __declspec(align) as a formal parameter.
>> +#ifdef _MSC_VER
>> +# define LLVM_ALIGNAS(x) __declspec(align(x))
>> +#elif __GNUC__ && !__has_feature(cxx_alignas) &&
>> !LLVM_GNUC_PREREQ(4, 8, 0)
>> +# define LLVM_ALIGNAS(x) __attribute__((aligned(x)))
>> +#else
>> +# define LLVM_ALIGNAS(x) alignas(x)
>> +#endif
>> +
>>  /// \macro LLVM_FUNCTION_NAME
>>  /// \brief Expands to __func__ on compilers which support it.
>>   Otherwise,
>>  /// expands to a compiler-dependent replacement.
>>
>> Modified: llvm/trunk/unittests/Support/AlignOfTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/AlignOfTest.cpp?rev=233910&r1=233909&r2=233910&view=diff
>> ==============================================================================
>> --- llvm/trunk/unittests/Support/AlignOfTest.cpp (original)
>> +++ llvm/trunk/unittests/Support/AlignOfTest.cpp Thu Apr  2 06:32:48
>> 2015
>> @@ -39,24 +39,10 @@ namespace {
>>  #endif
>>
>>  // Define some fixed alignment types to use in these tests.
>> -#if __has_feature(cxx_alignas)
>> -struct alignas(1) A1 { };
>> -struct alignas(2) A2 { };
>> -struct alignas(4) A4 { };
>> -struct alignas(8) A8 { };
>> -#elif defined(__GNUC__)
>> -struct A1 { } __attribute__((aligned(1)));
>> -struct A2 { } __attribute__((aligned(2)));
>> -struct A4 { } __attribute__((aligned(4)));
>> -struct A8 { } __attribute__((aligned(8)));
>> -#elif defined(_MSC_VER)
>> -__declspec(align(1)) struct A1 { };
>> -__declspec(align(2)) struct A2 { };
>> -__declspec(align(4)) struct A4 { };
>> -__declspec(align(8)) struct A8 { };
>> -#else
>> -# error No supported align as directive.
>> -#endif
>> +struct LLVM_ALIGNAS(1) A1 {};
>> +struct LLVM_ALIGNAS(2) A2 {};
>> +struct LLVM_ALIGNAS(4) A4 {};
>> +struct LLVM_ALIGNAS(8) A8 {};
>>
>>  struct S1 {};
>>  struct S2 { char a; };
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory



More information about the llvm-commits mailing list