Issue: print std unique pointer

Hi,

LLDB is printing a empty value for unique pointers in PowerPC.
And I am investigating a solution for this problem.

The problem occurs because the ptr_obj variable has a empty value in
Plugins/Language/CPlusPlus/LibStdcppUniquePointer.cpp:73.

I could solve it, changing this line
Plugins/Language/CPlusPlus/LibStdcppTuple.cpp:68
from:
if (name_str.startswith("std::_Tuple_impl<")) {
to:
if (name_str.startswith("std::_Tuple_impl<") ||
name_str.startswith("_M_t") ) {

After this change, the test TestDataFormatterStdUniquePtr pass with success.
And the unique pointers are displayed correctly.

Is there a better solution for that?

Thanks.
Alexandre.

It depends on the version of the C++ standard library you are using. Is this the only thing that isn't working in the STL data formatters? I would expect the STL library to be the same on PowerPC as it is on other platforms so I wouldn't guess this would be an issue that is arch dependent.

Greg Clayton

This probably isn't arch-dependent. More likely you just have a
different version of libstdc++. Can you share how the std::unique_ptr
layout looks like for you. This is how my std::unique_ptr looks like
(from libstdc++.so.6.0.22):

(lldb) fr var X -R -T
(std::unique_ptr<int, std::default_delete<int> >) X = {
  (std::unique_ptr<int, std::default_delete<int> >::__tuple_type) _M_t = {
    (std::_Tuple_impl<0, int *, std::default_delete<int> >)
std::_Tuple_impl<0, int *, std::default_delete<int> > = {
      (std::_Head_base<0, int *, false>) std::_Head_base<0, int *, false> = {
        (int *) _M_head_impl = 0x0000555555768c20
      }
    }
  }
}

Then the question becomes how can we identify the STL that is being used correctly so we can do the right thing. I worry that if std::unique_ptr isn't working that many many other STL things won't work as well. We are tuned for a specific STL

All the test cases in TestDataFormatterStdUniquePtr were failing.
My std::unique_ptr layout is:

(std::unique_ptr<int, std::default_delete >) iup = {
(std::__uniq_ptr_impl<int, std::default_delete >) _M_t = {
(std::tuple<int *, std::default_delete >) _M_t = {
(std::_Tuple_impl<0, int *, std::default_delete >) std::_Tuple_impl<0, int *, std::default_delete > = {
(std::_Head_base<0, int *, false>) std::_Head_base<0, int *, false> = {
(int *) _M_head_impl = 0x0000000010041c20
}
}
}
}
}

It is showing “std::tuple<int *, std::default_delete >) _M_t”
instead of “std::_Tuple_impl<0, int *, std::default_delete >”.

I think this is the interesting part: std::__uniq_ptr_impl<int,
std::default_delete<int> >

There is no such type in the example I posted. It looks like the
implementation of std::unique_ptr changed, and they added an extra
member object. This tells me the fix should be in the data formatter
for std::unique_ptr and not std::tuple (which makes sense, because
your std::tuple tests are still passing (?)). We should detect the new
layout and format based on that. It would also be good to know in
which libstdc++ version this changed, so we can leave a note to future
selves about when can this be cleaned up.

Implemented a fix in: https://reviews.llvm.org/D44015
Could you please review it?