[libcxx-dev] Merging the libc++ and libc++abi repositories

Eric Fiselier via libcxx-dev libcxx-dev at lists.llvm.org
Wed Oct 10 17:05:20 PDT 2018


Hi All,

The status quo of libc++abi and libc++ requires the duplication of a lot of
code and logic between the repositories, and often in ways that require the
two be kept in perfect sync. As it stands now, this it too complicated.
This email proposes putting libc++abi and libc++ into the same repository.

Before I go any further, I want to clarify what I'm NOT PROPOSING.

I'm NOT proposing removing support for using libsupc++, libstdc++, or
libcxxrt  as the runtime library under libc++. I'm NOT proposing absorbing
libc++abi into libc++; they will remain distinct entities. In summary, If
you use libc++ or libc++abi in a weird configuration today, then that
should continue to work after this change.

The Problem
==========

So why do I want to keep the two libraries together? Because the amount of
duplication across libc++ and libc++abi is becoming unmaintainable, and
that's causing bugs.

For example, libc++abi shipped a serious regression in the 7.0 release
which caused thrown exceptions to have the wrong alignment, and in turn
caused programs to segfault. It was caused because libc++abi forgot to
define _LIBCPP_BUILDING_LIBRARY like libc++ does [1][2]. In the above case
a bug was caused because libc++abi depended on libc++ internals, but it was
not kept in sync with changes to libc++.

The goal of the merge is to prevent bugs like this from happening in the
future.

libc++ and libc++abi also contain duplicate versions of large amounts of
code, including the cpp files which implement <new>, <stdexcept>,
<exception>, and <typeinfo>. The versions in libc++ and libc++abi should be
*the exact same*, but we're forced to keep them in separate repositories.
This causes bugs where one version isn't updated when the other gets a new
feature or a bug fix [3].

Finally, libc++ and libc++abi could share almost all of their CMake and LIT
configuration, but they don't. This introduces a serious but unneeded
maintenance cost. Here's an example from today where the libc++ sanitizer
configuration for Mac had to be copied into libc++abi verbatim. [4]

Solutions
=======

I propose merging the libc++ and libc++abi repositories into one. The exact
structure of this merged repository is TBD. For simplicity I'll assume we
decide to move libc++abi INTO libc++.

There are some open questions:


   1. Should we create a new repository for this purpose? Or is it better
   to use libc++ as shared home (I vote for using libc++).

   2. Should we do the same for libunwind?

   3. We want to be able to build libc++ w/o libc++abi, but is the reverse
   true? Does anybody have an existing use case for building libc++abi w/o
   libc++?


I look forward to the discussion this generates.

[1] llvm.org/PR39051
[2] Fix for PR39051 - r242815
<https://github.com/llvm-mirror/libcxxabi/commit/ed902ff267148f3d76d33283766613056f57a06f>
[3] Copying libc++'s new into libc++abi - r296787
<https://github.com/llvm-mirror/libcxxabi/commit/4bf15a00704552100c7ffcf92e93c8d3414c9b50>
[4] Duplicating more CMake configuration - r344191
<https://github.com/llvm-mirror/libcxxabi/commit/6d635f5765e76c66d31a26cb4d5d5e802e274b4f>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/libcxx-dev/attachments/20181010/0f1ff1d6/attachment.html>


More information about the libcxx-dev mailing list