1d3da57f9SHoward Hinnant<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 2d3da57f9SHoward Hinnant "http://www.w3.org/TR/html4/strict.dtd"> 3d3da57f9SHoward Hinnant<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ --> 4d3da57f9SHoward Hinnant<html> 5d3da57f9SHoward Hinnant<head> 6d3da57f9SHoward Hinnant <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 7d3da57f9SHoward Hinnant <title>"libc++abi" C++ Standard Library Support</title> 8d3da57f9SHoward Hinnant <link type="text/css" rel="stylesheet" href="menu.css"> 9d3da57f9SHoward Hinnant <link type="text/css" rel="stylesheet" href="content.css"> 10d3da57f9SHoward Hinnant</head> 11d3da57f9SHoward Hinnant 12d3da57f9SHoward Hinnant<body> 13d3da57f9SHoward Hinnant<div id="menu"> 14d3da57f9SHoward Hinnant <div> 152e4f1e11SStephan T. Lavavej <a href="https://llvm.org/">LLVM Home</a> 16d3da57f9SHoward Hinnant </div> 17d3da57f9SHoward Hinnant 18d3da57f9SHoward Hinnant <div class="submenu"> 19d3da57f9SHoward Hinnant <label>libc++abi Info</label> 20d3da57f9SHoward Hinnant <a href="/index.html">About</a> 21d3da57f9SHoward Hinnant </div> 22d3da57f9SHoward Hinnant 23d3da57f9SHoward Hinnant <div class="submenu"> 24d3da57f9SHoward Hinnant <label>Quick Links</label> 2512981433SSylvestre Ledru <a href="https://libcxx.llvm.org/">libc++</a> 26*44f81dfbStlattner <a href="https://discourse.llvm.org/c/runtimes/libcxx/10">Discourse Forums</a> 272e4f1e11SStephan T. Lavavej <a href="https://lists.llvm.org/mailman/listinfo/libcxx-commits">libcxx-commits</a> 282e4f1e11SStephan T. Lavavej <a href="https://bugs.llvm.org/">Bug Reports</a> 2994fac81fSxgupta <a href="https://github.com/llvm/llvm-project/tree/main/libcxxabi/">Browse Sources</a> 30d3da57f9SHoward Hinnant </div> 31d3da57f9SHoward Hinnant</div> 32d3da57f9SHoward Hinnant 33d3da57f9SHoward Hinnant<div id="content"> 34d3da57f9SHoward Hinnant <!--*********************************************************************--> 35d3da57f9SHoward Hinnant <h1>"libc++abi" C++ Standard Library Support</h1> 36d3da57f9SHoward Hinnant <!--*********************************************************************--> 37d3da57f9SHoward Hinnant 38d3da57f9SHoward Hinnant <p>libc++abi is a new implementation of low level support for a standard 39d3da57f9SHoward Hinnant C++ library.</p> 40d3da57f9SHoward Hinnant 41d3da57f9SHoward Hinnant <p>All of the code in libc++abi is <a 422e4f1e11SStephan T. Lavavej href="https://llvm.org/docs/DeveloperPolicy.html#copyright-license-and-patents">dual licensed</a> 43d3da57f9SHoward Hinnant under the MIT license and the UIUC License (a BSD-like license).</p> 44d3da57f9SHoward Hinnant 45d3da57f9SHoward Hinnant <!--=====================================================================--> 46d3da57f9SHoward Hinnant <h2 id="goals">Features and Goals</h2> 47d3da57f9SHoward Hinnant <!--=====================================================================--> 48d3da57f9SHoward Hinnant 49d3da57f9SHoward Hinnant <ul> 50d3da57f9SHoward Hinnant <li>Correctness as defined by the C++11 standard.</li> 512e4f1e11SStephan T. Lavavej <li>Provide a portable sublayer to ease the porting of <a href="https://libcxx.llvm.org/">libc++</a></li> 52f3f1a9c9SHoward Hinnant <li>On Mac OS X, be ABI compatible with the existing low-level support.</li> 53d3da57f9SHoward Hinnant </ul> 54d3da57f9SHoward Hinnant 55d3da57f9SHoward Hinnant <!--=====================================================================--> 56d3da57f9SHoward Hinnant <h2 id="requirements">Platform Support</h2> 57d3da57f9SHoward Hinnant <!--=====================================================================--> 58d3da57f9SHoward Hinnant 59d3da57f9SHoward Hinnant <p>libc++abi is known to work on the following platforms, using clang.</p> 60d3da57f9SHoward Hinnant 61d3da57f9SHoward Hinnant <ul> 623a86b142SHoward Hinnant <li>Darwin</li> 63d3da57f9SHoward Hinnant </ul> 64d3da57f9SHoward Hinnant 65d3da57f9SHoward Hinnant <!--=====================================================================--> 66d3da57f9SHoward Hinnant <h2 id="dir-structure">Current Status</h2> 67d3da57f9SHoward Hinnant <!--=====================================================================--> 68d3da57f9SHoward Hinnant 693a86b142SHoward Hinnant <p>libc++abi is complete. <a href="spec.html">Here</a> is a 703a86b142SHoward Hinnant list of functionality.</p> 71d3da57f9SHoward Hinnant 72d3da57f9SHoward Hinnant <!--=====================================================================--> 73d3da57f9SHoward Hinnant <h2>Get it and get involved!</h2> 74d3da57f9SHoward Hinnant <!--=====================================================================--> 75d3da57f9SHoward Hinnant 766f17768eSLouis Dionne <p>For building libc++abi, please see the libc++ documentation on 776f17768eSLouis Dionne <a href="https://libcxx.llvm.org/BuildingLibcxx.html">building the runtimes</a>. 78fe2e6e79SEric Fiselier </p> 790ed2e2f6SDan Albert 806f17768eSLouis Dionne <p>For getting involved with libc++abi, please see the libc++ documentation on 816f17768eSLouis Dionne <a href="https://libcxx.llvm.org/Contributing.html">getting involved</a>. 826f17768eSLouis Dionne </p> 83d3da57f9SHoward Hinnant 84fa9fd4a0SMarshall Clow <!--=====================================================================--> 85fa9fd4a0SMarshall Clow <h2>Frequently asked questions</h2> 86fa9fd4a0SMarshall Clow <!--=====================================================================--> 87fa9fd4a0SMarshall Clow 88fa9fd4a0SMarshall Clow <p>Q: Why are the destructors for the standard exception classes defined in libc++abi? 89fa9fd4a0SMarshall Clow They're just empty, can't they be defined inline?</p> 90fa9fd4a0SMarshall Clow <p>A: The destructors for them live in libc++abi because they are "key" functions. 91fa9fd4a0SMarshall Clow The Itanium ABI describes a "key" function as the first virtual declared. 92fa9fd4a0SMarshall Clow And wherever the key function is defined, that is where the <code>type_info</code> gets defined. 93fa9fd4a0SMarshall Clow And in libc++ types are the same type if and only if they have the same <code>type_info</code> 94fa9fd4a0SMarshall Clow (as in there must be only one type info per type in the entire application). 95fa9fd4a0SMarshall Clow And on OS X, libstdc++ and libc++ share these exception types. 96fa9fd4a0SMarshall Clow So to be able to throw in one dylib and catch in another (a <code>std::exception</code> for example), 97fa9fd4a0SMarshall Clow there must be only one <code>std::exception type_info</code> in the entire app. 98fa9fd4a0SMarshall Clow That typeinfo gets laid down beside <code>~exception()</code> in libc++abi (for both libstdc++ and libc++).</p> 99fa9fd4a0SMarshall Clow <p>--Howard Hinnant</p> 100d3da57f9SHoward Hinnant 101d3da57f9SHoward Hinnant</div> 102d3da57f9SHoward Hinnant</body> 103d3da57f9SHoward Hinnant</html> 104