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

Hal Finkel hfinkel at anl.gov
Thu Apr 2 06:21:55 PDT 2015


----- 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];

...

>  
> -#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