[lldb-dev] clang CL breaks LLDB std::string printing

David Blaikie dblaikie at gmail.com
Thu Feb 26 13:34:56 PST 2015


On Wed, Feb 25, 2015 at 10:31 PM, Vince Harron <vharron at google.com> wrote:

> Hi David,
>
> There are some LLDB tests that have been failing against clang-3.6 for a
> long time and just started failing in clang-3.5 when my Ubuntu distro
> updated clang-3.5.
>
> I tracked it back to a clang CL that you submitted nearly a year ago.
>
> This test passes when compiling with gcc 4.8.2 and clang-3.5 before this
> CL.  I'm very new to the project and I don't really understand what's going
> on here.  Any guidance you can offer would be very much appreciated.
>

Short answer is that you're probably missing the debug build of your
standard library (libstdc++-XXX-dbg).

Long answer: Compilers (both GCC & Clang) try to optimize debug info size
by relying on the existence of debug info (especially for types) in other
files. They use various signals to make this assumption - both Clang and
GCC use vtables as one signal (if a type is dynamic, only emit the debug
info for the definition of the type wherever the vtable is emitted). Beyond
that, Clang also uses explicit template instantiation declarations as a
signal as well (if there's an explicit template instantiation declaration,
only emit the full definition of the type where the explicit instantiation
definition is).

This allows the compilers to omit definitions in many cases, in favor of
them being emitted in one or a small handful of places, reducing debug info
size and linker input size.

In the case of std::basic_string<char>, libstdc++ (& other standard library
implementations, I'd imagine) has an explicit instantiation declaration to
avoid the compiler having to do all the work of instantiating
basic_string<char> in every translation unit. The explicit instantiation
definition is in the standard library objects (static or dynamic) and
that's where the debug info for the type is. If you don't install the debug
build of your standard library, you won't have the debug info definition of
std::basic_string<char>.

Hope that helps,

- David

I really should write a blog post about this...


>
> Thanks,
>
> Vince
>
> ------------------------------------------------------------------------
> r202769 | dblaikie | 2014-03-03 15:48:23 -0800 (Mon, 03 Mar 2014) | 18
> lines
>
> DebugInfo: Emit only the declaration of a class template that has an
> explicit instantiation declaration (& always emit such a type when there's
> an explicit instantiation definition)
>
> We should only have this optimization fire when the explicit
> instantiation definition would cause at  least one member function to be
> emitted, thus ensuring that even a compiler not performing this
> optimization would still emit the full type information elsewhere.
>
> But we should also pessimize output still by always emitting the
> definition when the explicit instantiation definition appears so that at
> some point in the future we can depend on that information even when no
> code had to be emitted in that TU. (this shouldn't happen very often,
> since people mostly use explicit spec decl/defs to reduce code size -
> but perhaps one day they could use it to explicitly reduce debug info
> size too)
>
> This was worth about 2% for Clang and LLVM - so not a huge win, but a
> win. It looks really great for simple STL programs (include <string> and
> just declare a string - 14k -> 1.4k of .dwo)
>
>
>
>
>
> --
>
> Vince Harron | Technical Lead Manager | vharron at google.com | 858-442-0868
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20150226/cb246286/attachment.html>


More information about the lldb-dev mailing list