[Lldb-commits] r151071 - in /lldb/trunk: examples/interposing/darwin/fd_interposing/FDInterposing.cpp include/lldb/lldb-defines.h source/Host/macosx/Host.mm source/Plugins/Process/Utility/UnwindMacOSXFrameBackchain.cpp tools/debugserver/source/MacOSX/MachThreadList.cpp tools/debugserver/source/MacOSX/i386/DNBArchImplI386.cpp tools/debugserver/source/MacOSX/x86_64/DNBArchImplX86_64.cpp

Benjamin Kramer benny.kra at googlemail.com
Wed Feb 22 08:55:49 PST 2012


On 22.02.2012, at 16:51, Howard Hinnant wrote:

>> 
>> On 21.02.2012, at 19:56, Greg Clayton wrote:
>> 
>>> Benjamin,
>>> 
>>> Please be careful when switching example code over to use C++11 as "lldb/trunk/examples/interposing/darwin/fd_interposing/FDInterposing.cpp" doesn't compile anymore. By default (in Lion at least) "std::shared_ptr" isn't part of the darwin libstdc++ library, so we still need to use the tr1 stuff.
>>> 
>>> I am checking without local C++ gurus on how to best fix this.
>> 
>> Oops, that was my mistake, checking that file in wasn't intended. I'll revert it.
>> 
>> This was just one little step to help switching to libc++ eventually. Sadly libc++ doesn't contain tr1 headers so we
>> can't just flip the switch and everything works.
> 
> I'm going to start working on that faq real soon now! ;-)  Sorry it isn't there already.
> 
> The decision to not contain tr1 headers was a carefully considered one.  To do it right it would require a complete and separate tr1 implementation, and the manpower just wasn't there for that.
> 
> Fortunately there is an easy way to manage this transition that will auto-detect libc++, allowing your sources to switch back and forth between older std::libs and libc++ effortlessly.
> 
> Start with #include any C++03 header.  This is to get an identifying macro version number to tell which std::lib you're currently compiling with.  It could be <vector> or whatever you're previously using that is common to C++03 and C++11 libs.  If you're not already using such a header, don't include a big one gratuitously.  #include a small one gratuitously. ;-)
> 
> My favorite is:
> 
> #include <ciso646>  // Get std::lib version
> 
> The C++ committee was thoughtful enough to specify that this header does absolutely nothing! :-)  On libc++ it does almost nothing.  It will #define _LIBCPP_VERSION
> 
> Now your code knows what library you're compiling against, and there are a variety of techniques you can use to be compatible with libs that do or do not provide tr1/C++11:
> 
> #ifdef _LIBCPP_VERSION
> // C++11
> #  include <memory>   // for std::shared_ptr
> #else
> // TR1
> #  include <tr1/memory>   // for std::tr1::shared_ptr
> #endif
> 
> ...
> 
> #ifdef _LIBCPP_VERSION
> // C++11
> 
> typedef std::shared_ptr<FDEvent> FDEventSP;
> typedef std::shared_ptr<String> StringSP;
> 
> #else
> // TR1
> 
> typedef std::tr1::shared_ptr<FDEvent> FDEventSP;
> typedef std::tr1::shared_ptr<String> StringSP;
> 
> #endif
> 
> Hope this helps.

Thanks Howard, that looks like a good solution to the migration problem.

However, it's also worth considering to just switch LLDB to C++11 and libc++ completely. The c++11 support in clang is mature enough to compile libc++ and LLDB in C++11 mode. Xcode ships both so migration isn't painful at all. And we get the advantages of libc++ and c++11 (perfect forwarding!) for free.

On Linux we can expect to have at least GCC 4.4 around, which should have the required headers in its libstdc++. On BSD this would require building with clang + libstdc++, GCC 4.2 is way too old for this.

I have a set of patches that build a working C++11 LLDB with libc++ locally (mostly mechanical s/tr1::// and build system changes). I can push them upstream if that's ok with the LLDB devs.

- Ben






More information about the lldb-commits mailing list