diff options
| author | Michael Liao <michael.hliao@gmail.com> | 2019-07-30 16:11:48 +0000 |
|---|---|---|
| committer | Michael Liao <michael.hliao@gmail.com> | 2019-07-30 16:11:48 +0000 |
| commit | 0d6615cc1911baaa53fb0141a288b2cd7c072a13 (patch) | |
| tree | 19ebaa652633bc028fab72ef8c96dc6684f87652 | |
| parent | 5ed3d146f87e3103ea5bbdb27bca8d6b1b1f714a (diff) | |
| download | bcm5719-llvm-0d6615cc1911baaa53fb0141a288b2cd7c072a13.tar.gz bcm5719-llvm-0d6615cc1911baaa53fb0141a288b2cd7c072a13.zip | |
[Support] Workaround a GCC 4.8 bug on constant expression evaluation.
Summary:
- The following stripped code trigger a gcc-4.8 bug. To work that
around, move the alignment evaluation into template parameter.
```
// https://godbolt.org/z/58p5_X
//
enum { aligned = 0, unaligned = 1 };
template <typename T, int alignment> struct PickAlignment {
enum { value = alignment == 0 ? alignof(T) : alignment };
};
template <typename ValueType, std::size_t Alignment> struct packed {
private:
struct {
alignas(
PickAlignment<ValueType, Alignment>::value) char buffer[sizeof(int)];
} Value;
};
using ule16_t = packed<uint16_t, unaligned>;
ule16_t x;
```
- Also, replace `alignas` with `LLVMALIGN_AS` to improve the compiler
compatibility.
Reviewers: jfb
Subscribers: dexonsmith, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D65452
llvm-svn: 367329
| -rw-r--r-- | llvm/include/llvm/Support/Endian.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/include/llvm/Support/Endian.h b/llvm/include/llvm/Support/Endian.h index b2249471e64..e5489da130d 100644 --- a/llvm/include/llvm/Support/Endian.h +++ b/llvm/include/llvm/Support/Endian.h @@ -205,7 +205,8 @@ namespace detail { template<typename ValueType, endianness Endian, - std::size_t Alignment> + std::size_t Alignment, + std::size_t ALIGN = PickAlignment<ValueType, Alignment>::value> struct packed_endian_specific_integral { using value_type = ValueType; static constexpr endianness endian = Endian; @@ -247,8 +248,7 @@ struct packed_endian_specific_integral { private: struct { - alignas(PickAlignment<value_type, - alignment>::value) char buffer[sizeof(value_type)]; + LLVM_ALIGNAS(ALIGN) char buffer[sizeof(value_type)]; } Value; public: |

