Skip to content

Reland "[lldb][test] TestDataFormatterLibcxxStringSimulator.py: add new padding layout" #111123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@
namespace std {
namespace __lldb {

#if __has_cpp_attribute(msvc::no_unique_address)
#define _LLDB_NO_UNIQUE_ADDRESS [[msvc::no_unique_address]]
#elif __has_cpp_attribute(no_unique_address)
#define _LLDB_NO_UNIQUE_ADDRESS [[__no_unique_address__]]
#endif

#if COMPRESSED_PAIR_REV == 0 // Post-c88580c layout
struct __value_init_tag {};
struct __default_init_tag {};
Expand Down Expand Up @@ -55,7 +61,7 @@ class __compressed_pair : private __compressed_pair_elem<_T1, 0>,
#elif COMPRESSED_PAIR_REV == 1
// From libc++ datasizeof.h
template <class _Tp> struct _FirstPaddingByte {
[[no_unique_address]] _Tp __v_;
_LLDB_NO_UNIQUE_ADDRESS _Tp __v_;
char __first_padding_byte_;
};

Expand All @@ -75,29 +81,30 @@ template <class _ToPad> class __compressed_pair_padding {
};

#define _LLDB_COMPRESSED_PAIR(T1, Initializer1, T2, Initializer2) \
[[__gnu__::__aligned__(alignof(T2))]] [[no_unique_address]] T1 Initializer1; \
[[no_unique_address]] __compressed_pair_padding<T1> __padding1_; \
[[no_unique_address]] T2 Initializer2; \
[[no_unique_address]] __compressed_pair_padding<T2> __padding2_;
[[__gnu__::__aligned__( \
alignof(T2))]] _LLDB_NO_UNIQUE_ADDRESS T1 Initializer1; \
_LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T1> __padding1_; \
_LLDB_NO_UNIQUE_ADDRESS T2 Initializer2; \
_LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T2> __padding2_;

#define _LLDB_COMPRESSED_TRIPLE(T1, Initializer1, T2, Initializer2, T3, \
Initializer3) \
[[using __gnu__: __aligned__(alignof(T2)), \
__aligned__(alignof(T3))]] [[no_unique_address]] T1 Initializer1; \
[[no_unique_address]] __compressed_pair_padding<T1> __padding1_; \
[[no_unique_address]] T2 Initializer2; \
[[no_unique_address]] __compressed_pair_padding<T2> __padding2_; \
[[no_unique_address]] T3 Initializer3; \
[[no_unique_address]] __compressed_pair_padding<T3> __padding3_;
__aligned__(alignof(T3))]] _LLDB_NO_UNIQUE_ADDRESS T1 Initializer1; \
_LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T1> __padding1_; \
_LLDB_NO_UNIQUE_ADDRESS T2 Initializer2; \
_LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T2> __padding2_; \
_LLDB_NO_UNIQUE_ADDRESS T3 Initializer3; \
_LLDB_NO_UNIQUE_ADDRESS __compressed_pair_padding<T3> __padding3_;
#elif COMPRESSED_PAIR_REV == 2
#define _LLDB_COMPRESSED_PAIR(T1, Name1, T2, Name2) \
[[no_unique_address]] T1 Name1; \
[[no_unique_address]] T2 Name2
_LLDB_NO_UNIQUE_ADDRESS T1 Name1; \
_LLDB_NO_UNIQUE_ADDRESS T2 Name2

#define _LLDB_COMPRESSED_TRIPLE(T1, Name1, T2, Name2, T3, Name3) \
[[no_unique_address]] T1 Name1; \
[[no_unique_address]] T2 Name2; \
[[no_unique_address]] T3 Name3
_LLDB_NO_UNIQUE_ADDRESS T1 Name1; \
_LLDB_NO_UNIQUE_ADDRESS T2 Name2; \
_LLDB_NO_UNIQUE_ADDRESS T3 Name3
#endif
} // namespace __lldb
} // namespace std
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def _run_test(self, defines):


for v in [None, "ALTERNATE_LAYOUT"]:
for r in range(5):
for r in range(6):
for c in range(3):
name = "test_r%d_c%d" % (r, c)
defines = ["REVISION=%d" % r, "COMPRESSED_PAIR_REV=%d" % c]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@
// Pre-D128285 layout.
#define PACKED_ANON_STRUCT
#endif
// REVISION == 4: current layout
#if REVISION <= 4
// Pre-2a1ef74 layout.
#define NON_STANDARD_PADDING
#endif
// REVISION == 5: current layout

#ifdef PACKED_ANON_STRUCT
#define BEGIN_PACKED_ANON_STRUCT struct __attribute__((packed)) {
Expand All @@ -34,13 +38,21 @@
namespace std {
namespace __lldb {

#ifdef NON_STANDARD_PADDING
#if defined(ALTERNATE_LAYOUT) && defined(SUBCLASS_PADDING)
template <class _CharT, size_t = sizeof(_CharT)> struct __padding {
unsigned char __xx[sizeof(_CharT) - 1];
};

template <class _CharT> struct __padding<_CharT, 1> {};
#endif
#else // !NON_STANDARD_PADDING
template <size_t _PaddingSize> struct __padding {
char __padding_[_PaddingSize];
};

template <> struct __padding<0> {};
#endif

template <class _CharT, class _Traits, class _Allocator> class basic_string {
public:
Expand Down Expand Up @@ -77,7 +89,12 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string {
};
#else // !SUBCLASS_PADDING

#ifdef NON_STANDARD_PADDING
unsigned char __padding[sizeof(value_type) - 1];
#else
_LLDB_NO_UNIQUE_ADDRESS __padding<sizeof(value_type) - 1> __padding_;
#endif

#ifdef BITMASKS
unsigned char __size_;
#else // !BITMASKS
Expand Down Expand Up @@ -129,21 +146,26 @@ template <class _CharT, class _Traits, class _Allocator> class basic_string {
union {
#ifdef BITMASKS
unsigned char __size_;
#else
#else // !BITMASKS
struct {
unsigned char __is_long_ : 1;
unsigned char __size_ : 7;
};
#endif
#endif // BITMASKS
value_type __lx;
};
#else
#else // !SHORT_UNION
BEGIN_PACKED_ANON_STRUCT
unsigned char __is_long_ : 1;
unsigned char __size_ : 7;
END_PACKED_ANON_STRUCT
char __padding_[sizeof(value_type) - 1];
#endif
#ifdef NON_STANDARD_PADDING
unsigned char __padding[sizeof(value_type) - 1];
#else // !NON_STANDARD_PADDING
_LLDB_NO_UNIQUE_ADDRESS __padding<sizeof(value_type) - 1> __padding_;
#endif // NON_STANDARD_PADDING

#endif // SHORT_UNION
value_type __data_[__min_cap];
};

Expand Down
Loading