<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Hello,</span><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
it is fifth report for project "Provide alternative to libstdc++ with libc++", mentored by Sylvestre Ledru.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">On last weeks I've made some work.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">Firstly, I've updated package version to svn160132. Great major change in this revision is enabled atomics operations provided by libc++.  Also I filled package documentation (README.Debian, README.source, copyright), added script to simplify use g++ with libc++. Next my mentor uploaded package with these changes to 'experimental' Debian repository.</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
I modified some files for multiarch[1] compatibility. It means that different by architecture (i386,x86_64) versions of package can be installed together. Side effect of these changes is build-dependency of dh-exec. [2]</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">
More interesting part of my work was to replace lower parts of C++ stack behind libc++abi. Typical C++ stack consists 3 levels: STL - standard template library (top), ABI - application binary interface library, and stack unwinding library for exception support (bottom)[3]. Now we replaced first two parts of C++ library, and we are trying replace lowest. Please, see simple sheme below:</div>
<div style="background-color:rgb(255,255,255)"><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">unwind lib      =>       ABI lib            =>      Std lib        =>    end-app</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">     |                                 |                               |</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
libgcc_s or            libcxxrt,                     libstdc++,</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">  libunwind             libc++abi                  libc++,</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
                              libsupc++                    uClibc++</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
So we replaced libstdc++ to libc++, and libsupc++ to libc++. libsupc++ doen't present explicit in system, because it's statically linked with libstdc++. </div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">We are try replacing libgcc_s to libunwind[4], but there are some troubles on this way.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">Current version of clang doesn't support other libunwind libraries. Linking libgcc is hard-coded in clang source code. Also clang 3.1 doesn't support flag '-nodefaultlibs' that deprecate linking of all standard libraries[5]. So I've created patch for clang++ that links libunwind instead of libgcc if -stdlib=libc++ flag is set. If flag -static-libgcc will be specified, libunwind will be staticaly linked. Also I backported patch that enables -nodefaultlibs flag, for properly building libc++ and libc++abi. Original patch accepted in revision 156771, and can be found here: [5]. </div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><div>Current build of libunwind from Debian repository doesn't have some features to be used with libunwind. So:</div>
<div>a) C++ exception support, that can be achieved by configuring libunwind with --enable-cxx--exception and then building.</div><div>b) Static version of libunwind could be compiled with -fPIC to be used in shared libraries (like libgcc with key -static-libgcc)</div>
<div>Also when I builded libc++ and libunwind with g++  (only linking objects compiled by clang++, because clang didn't supported -nodefaultlibs at that time), I got unresolved dependency '__gcc_personality_v0'. But when I'm building with 'clang -nodefaultlibs' now, I don't can represent this case.</div>
</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">Patches for clang has been send to my mentor (because he is maintainer of llvm and clang), patches for libunwind has been send to BTS with wishlist priority. [6][7]</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">But that's not all, and I go deeper :). Behind C++ stack C standard library and compiler runtime lib is placed. As first glibc (default in Debian), uClibc, dietlibc etc. can be used. Second library provided by compiler.</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">Currently clang uses libgcc[8] as RT library, but LLVM team created own implementation - compiler-rt[9]. Below is explanation about roles of libgcc, libgcc_s,  libgcc_eh and compiler-rt.</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><div>libgcc and libgcc_s is GCC runtime libraries, that contains some low-level functions: arithmetical shifts, multiplication, division, comparisons, operations with software float numbers, and exception handling (stack unwinding). [8]</div>
<div><br></div><div>Differences between libgcc and libgcc_s:</div><div>a) libgcc is static, libgcc_s is shared (I think _s means shared)</div><div>b) libgcc_s contains exception handling functions, libgcc doesn't (there is static library called libgcc_eh that contains these functions. _eh is probably "exception handling")</div>
<div><br></div><div>So libgcc (+libgcc_eh) is just static version of libgcc_s.</div><div><br></div><div>Runtime library must be linked to any C/C++ application. Small difference is that C apps uses static version by default, and C++ uses dynamic. In most cases C apps doesn't needed in exceptions handling support (if they doesn't uses it explicit), so these functions has been moved from main libgcc to libgcc_eh. libgcc_s links to C apps with key '-as-needed' - so only if application really uses exceptions handling.</div>
</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><div>compiler_rt[9] is compiler runtime library that contains low-level compiler-support functions without exception handling, so it's replacement for libgcc, not libgcc_s. Also compiler_rt builds only in static mode. Plus compiler_rt has additional features - built-in support of address sanitizer (memory error checking tool) and profiler (gcov).</div>
<div><br></div><div>Because compiler_rt doen't have exception handling functions, we need third-party implementation of it (i.e. libunwind).</div><div><br></div><div>So this part provided by libgcc(static)/libclang_rt isn't explicit part of C++ stack. C++ "inherits" it from C stack (because C++ is "C with classes" :))</div>
<div><br></div><div>So new stack compared to default Linux C++ stack:</div><div>libgcc (C) -> libgcc_eh (C++) \</div><div>         or                                         |-> libsupc++ -> libstdc++   (default stack)</div>
<div>       libgcc_s  (C & C++)            /</div><div><br></div><div><br></div><div>compiler_rt (C) -> libunwind (C++) -> libc++abi -> libc++      (new stack).</div><div>_______________________________________________________</div>
<div><br></div><div>Now we have:</div><div><br></div><div>libgcc (C) -> libunwind (C++) -> libc++abi -> libc++ </div></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
Now compiler-rt isn't provided for Debian, and we (I and my mentor) are working  at this problem.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
In conclusion, i would say that most targets of my planning have been achieved. I've created package that builds from SVN repository and was uploaded to Debian experimental. Package provides scripts to simplify usage libc++ with clang++ and g++, and it is installed as alternatives for /usr/bin/c++ (default c++ compiler) using update-alternatives. So further I'll test package with Debian GNU/kFreeBSD and Debian GNU/Hurd, try build it and use it. Also I'll continue replace lowest part of C++ stack.</div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px"><br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">Thanks.</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
<br></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">Links:</div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">[1] <a href="http://wiki.debian.org/Multiarch">http://wiki.debian.org/Multiarch</a></div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">[2] <a href="http://wiki.debian.org/Multiarch/Implementation">http://wiki.debian.org/Multiarch/Implementation</a></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">
[3] <a href="http://wiki.osdev.org/C%2B%2B_Exception_Support">http://wiki.osdev.org/C%2B%2B_Exception_Support</a></div><div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">[4] <a href="http://savannah.nongnu.org/projects/libunwind">http://savannah.nongnu.org/projects/libunwind</a></div>
<div style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">[5] <a href="http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-May/021424.html" target="_blank" style="color:rgb(17,85,204)">http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-May/021424.html</a></div>
<div><font color="#222222" face="arial, sans-serif">[6] <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=682194">http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=682194</a></font></div><div>[7] <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=682196">http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=682196</a></div>
<div>[8] <a href="http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html">http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html</a></div><div>[9] <a href="http://compiler-rt.llvm.org/">http://compiler-rt.llvm.org/</a></div></div>