# "libc++abi" C++ Standard Library Support

libc++abi is a new implementation of low level support for a standard C++ library.

All of the code in libc++abi is dual licensed under the MIT license and the UIUC License (a BSD-like license).

## Features and Goals

- Correctness as defined by the C++11 standard.
- Provide a portable sublayer to ease the porting of libc++
- On Mac OS X, be ABI compatible with the existing low-level support.

## Platform Support

libc++abi is known to work on the following platforms, using clang.

- Darwin

## Current Status

libc++abi is complete. Here is a list of functionality.

## Get it and get involved!

For building libc++abi, please see the libc++ documentation on building the runtimes.

For getting involved with libc++abi, please see the libc++ documentation on getting involved.

## Frequently asked questions

Q: Why are the destructors for the standard exception classes defined in libc++abi? They're just empty, can't they be defined inline?

A: The destructors for them live in libc++abi because they are "key" functions. The Itanium ABI describes a "key" function as the first virtual declared. And wherever the key function is defined, that is where the `type_info` gets defined. And in libc++ types are the same type if and only if they have the same `type_info` (as in there must be only one type info per type in the entire application). And on OS X, libstdc++ and libc++ share these exception types. So to be able to throw in one dylib and catch in another (a `std::exception` for example), there must be only one `std::exception type_info` in the entire app. That typeinfo gets laid down beside `~exception()` in libc++abi (for both libstdc++ and libc++).

--Howard Hinnant