Mercurial > hg > CbC > CbC_llvm
diff include/llvm/Support/Endian.h @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | 803732b1fca8 |
children |
line wrap: on
line diff
--- a/include/llvm/Support/Endian.h Sat Feb 17 09:57:20 2018 +0900 +++ b/include/llvm/Support/Endian.h Wed Aug 14 16:55:33 2019 +0900 @@ -1,9 +1,8 @@ //===- Endian.h - Utilities for IO with endian specific data ----*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // @@ -34,7 +33,7 @@ namespace detail { -/// \brief ::value is either alignment, or alignof(T) if alignment is 0. +/// ::value is either alignment, or alignof(T) if alignment is 0. template<class T, int alignment> struct PickAlignment { enum { value = alignment == 0 ? alignof(T) : alignment }; @@ -204,10 +203,13 @@ namespace detail { -template<typename value_type, - endianness endian, - std::size_t alignment> +template <typename ValueType, endianness Endian, 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; + static constexpr std::size_t alignment = Alignment; + packed_endian_specific_integral() = default; explicit packed_endian_specific_integral(value_type val) { *this = val; } @@ -243,8 +245,9 @@ } private: - AlignedCharArray<PickAlignment<value_type, alignment>::value, - sizeof(value_type)> Value; + struct { + alignas(ALIGN) char buffer[sizeof(value_type)]; + } Value; public: struct ref { @@ -335,6 +338,17 @@ using unaligned_int64_t = detail::packed_endian_specific_integral<int64_t, native, unaligned>; +template <typename T> +using little_t = detail::packed_endian_specific_integral<T, little, unaligned>; +template <typename T> +using big_t = detail::packed_endian_specific_integral<T, big, unaligned>; + +template <typename T> +using aligned_little_t = + detail::packed_endian_specific_integral<T, little, aligned>; +template <typename T> +using aligned_big_t = detail::packed_endian_specific_integral<T, big, aligned>; + namespace endian { template <typename T> inline T read(const void *P, endianness E) {