brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · a1aa7e1 Raw
164 lines · c
1#ifndef STD_LLDB_COMPRESSED_PAIR_H2#define STD_LLDB_COMPRESSED_PAIR_H3 4#include <type_traits>5#include <utility> // for std::forward6 7// COMPRESSED_PAIR_REV versions:8// 0 -> Post-c88580c layout9// 1 -> Post-27c83382d83dc layout10// 2 -> Post-769c42f4a552a layout11// 3 -> Post-f5e687d7bf49c layout12// 4 -> padding-less no_unique_address-based layout (introduced in13// 27c83382d83dc)14 15namespace std {16namespace __lldb {17 18#if __has_cpp_attribute(msvc::no_unique_address)19#define _LLDB_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]20#elif __has_cpp_attribute(no_unique_address)21#define _LLDB_NO_UNIQUE_ADDRESS [[__no_unique_address__]]22#endif23 24// From libc++ datasizeof.h25template <class _Tp> struct _FirstPaddingByte {26  _LLDB_NO_UNIQUE_ADDRESS _Tp __v_;27  char __first_padding_byte_;28};29 30template <class _Tp>31inline const size_t __datasizeof_v =32    __builtin_offsetof(_FirstPaddingByte<_Tp>, __first_padding_byte_);33 34template <class _Tp>35struct __lldb_is_final : public integral_constant<bool, __is_final(_Tp)> {};36 37// The legacy layout has been patched, see38// https://github.com/llvm/llvm-project/pull/142516.39#if COMPRESSED_PAIR_REV == 140template <class _ToPad> class __compressed_pair_padding {41  char __padding_[((is_empty<_ToPad>::value &&42                    !__lldb_is_final<_ToPad>::value) ||43                   is_reference<_ToPad>::value)44                      ? 045                      : sizeof(_ToPad) - __datasizeof_v<_ToPad>];46};47#elif COMPRESSED_PAIR_REV > 1 && COMPRESSED_PAIR_REV < 448template <class _ToPad>49inline const bool __is_reference_or_unpadded_object =50    (std::is_empty<_ToPad>::value && !__lldb_is_final<_ToPad>::value) ||51    sizeof(_ToPad) == __datasizeof_v<_ToPad>;52 53template <class _Tp>54inline const bool __is_reference_or_unpadded_object<_Tp &> = true;55 56template <class _Tp>57inline const bool __is_reference_or_unpadded_object<_Tp &&> = true;58 59template <class _ToPad, bool _Empty = __is_reference_or_unpadded_object<_ToPad>>60class __compressed_pair_padding {61  char __padding_[sizeof(_ToPad) - __datasizeof_v<_ToPad>] = {};62};63 64template <class _ToPad> class __compressed_pair_padding<_ToPad, true> {};65#endif // COMPRESSED_PAIR_REV == 166 67#if COMPRESSED_PAIR_REV == 068struct __value_init_tag {};69struct __default_init_tag {};70 71template <class _Tp, int _Idx,72          bool _CanBeEmptyBase =73              std::is_empty<_Tp>::value && !std::is_final<_Tp>::value>74struct __compressed_pair_elem {75  explicit __compressed_pair_elem(__default_init_tag) {}76  explicit __compressed_pair_elem(__value_init_tag) : __value_() {}77 78  explicit __compressed_pair_elem(_Tp __t) : __value_(__t) {}79 80  _Tp &__get() { return __value_; }81 82private:83  _Tp __value_;84};85 86template <class _Tp, int _Idx>87struct __compressed_pair_elem<_Tp, _Idx, true> : private _Tp {88  explicit __compressed_pair_elem(_Tp __t) : _Tp(__t) {}89  explicit __compressed_pair_elem(__default_init_tag) {}90  explicit __compressed_pair_elem(__value_init_tag) : _Tp() {}91 92  _Tp &__get() { return *this; }93};94 95template <class _T1, class _T2>96class __compressed_pair : private __compressed_pair_elem<_T1, 0>,97                          private __compressed_pair_elem<_T2, 1> {98public:99  using _Base1 = __compressed_pair_elem<_T1, 0>;100  using _Base2 = __compressed_pair_elem<_T2, 1>;101 102  explicit __compressed_pair(_T1 __t1, _T2 __t2) : _Base1(__t1), _Base2(__t2) {}103  explicit __compressed_pair()104      : _Base1(__value_init_tag()), _Base2(__value_init_tag()) {}105 106  template <class _U1, class _U2>107  explicit __compressed_pair(_U1 &&__t1, _U2 &&__t2)108      : _Base1(std::forward<_U1>(__t1)), _Base2(std::forward<_U2>(__t2)) {}109 110  _T1 &first() { return static_cast<_Base1 &>(*this).__get(); }111};112#elif COMPRESSED_PAIR_REV == 1 || COMPRESSED_PAIR_REV == 2113#define _LLDB_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2)              \114  [[__gnu__::__aligned__(                                                      \115      alignof(T2))]] _LLDB_NO_UNIQUE_ADDRESS T1 Initializer1;                  \116  _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T1> __padding1_;           \117  _LLDB_NO_UNIQUE_ADDRESS T2 Initializer2;                                     \118  _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T2> __padding2_;119 120#define _LLDB_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3,        \121                                Initializer3)                                  \122  [[using __gnu__: __aligned__(alignof(T2)),                                   \123    __aligned__(alignof(T3))]] _LLDB_NO_UNIQUE_ADDRESS T1 Initializer1;        \124  _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T1> __padding1_;           \125  _LLDB_NO_UNIQUE_ADDRESS T2 Initializer2;                                     \126  _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T2> __padding2_;           \127  _LLDB_NO_UNIQUE_ADDRESS T3 Initializer3;                                     \128  _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T3> __padding3_;129#elif COMPRESSED_PAIR_REV == 3130#define _LLDB_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2)              \131  struct {                                                                     \132    [[__gnu__::__aligned__(                                                    \133        alignof(T2))]] _LLDB_NO_UNIQUE_ADDRESS T1 Initializer1;                \134    _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T1> __padding1_;         \135    _LLDB_NO_UNIQUE_ADDRESS T2 Initializer2;                                   \136    _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T2> __padding2_;         \137  }138 139#define _LLDB_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3,        \140                                Initializer3)                                  \141  struct {                                                                     \142    [[using __gnu__: __aligned__(alignof(T2)),                                 \143      __aligned__(alignof(T3))]] _LLDB_NO_UNIQUE_ADDRESS T1 Initializer1;      \144    _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T1> __padding1_;         \145    _LLDB_NO_UNIQUE_ADDRESS T2 Initializer2;                                   \146    _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T2> __padding2_;         \147    _LLDB_NO_UNIQUE_ADDRESS T3 Initializer3;                                   \148    _LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T3> __padding3_;         \149  }150#elif COMPRESSED_PAIR_REV == 4151#define _LLDB_COMPRESSED_PAIR(T1, Name1, T2, Name2)                            \152  _LLDB_NO_UNIQUE_ADDRESS T1 Name1;                                            \153  _LLDB_NO_UNIQUE_ADDRESS T2 Name2154 155#define _LLDB_COMPRESSED_TRIPLE(T1, Name1, T2, Name2, T3, Name3)               \156  _LLDB_NO_UNIQUE_ADDRESS T1 Name1;                                            \157  _LLDB_NO_UNIQUE_ADDRESS T2 Name2;                                            \158  _LLDB_NO_UNIQUE_ADDRESS T3 Name3159#endif // COMPRESSED_PAIR_REV == 3160} // namespace __lldb161} // namespace std162 163#endif // _H164