index.html
5.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>"libc++abi" C++ Standard Library Support</title>
<link type="text/css" rel="stylesheet" href="menu.css">
<link type="text/css" rel="stylesheet" href="content.css">
</head>
<body>
<div id="menu">
<div>
<a href="https://llvm.org/">LLVM Home</a>
</div>
<div class="submenu">
<label>libc++abi Info</label>
<a href="/index.html">About</a>
</div>
<div class="submenu">
<label>Quick Links</label>
<a href="https://libcxx.llvm.org/">libc++</a>
<a href="https://lists.llvm.org/mailman/listinfo/libcxx-dev">libcxx-dev</a>
<a href="https://lists.llvm.org/mailman/listinfo/libcxx-commits">libcxx-commits</a>
<a href="https://bugs.llvm.org/">Bug Reports</a>
<a href="https://github.com/llvm/llvm-project/tree/master/libcxxabi/">Browse Sources</a>
</div>
</div>
<div id="content">
<!--*********************************************************************-->
<h1>"libc++abi" C++ Standard Library Support</h1>
<!--*********************************************************************-->
<p>libc++abi is a new implementation of low level support for a standard
C++ library.</p>
<p>All of the code in libc++abi is <a
href="https://llvm.org/docs/DeveloperPolicy.html#copyright-license-and-patents">dual licensed</a>
under the MIT license and the UIUC License (a BSD-like license).</p>
<!--=====================================================================-->
<h2 id="goals">Features and Goals</h2>
<!--=====================================================================-->
<ul>
<li>Correctness as defined by the C++11 standard.</li>
<li>Provide a portable sublayer to ease the porting of <a href="https://libcxx.llvm.org/">libc++</a></li>
<li>On Mac OS X, be ABI compatible with the existing low-level support.</li>
</ul>
<!--=====================================================================-->
<h2 id="requirements">Platform Support</h2>
<!--=====================================================================-->
<p>libc++abi is known to work on the following platforms, using clang.</p>
<ul>
<li>Darwin</li>
</ul>
<!--=====================================================================-->
<h2 id="dir-structure">Current Status</h2>
<!--=====================================================================-->
<p>libc++abi is complete. <a href="spec.html">Here</a> is a
list of functionality.</p>
<!--=====================================================================-->
<h2>Get it and get involved!</h2>
<!--=====================================================================-->
<p>To check out the code (including llvm and others), use:</p>
<ul>
<li><code>git clone https://github.com/llvm/llvm-project.git</code></li>
</ul>
<p>To build:</p>
<ul>
<li><code>cd llvm-project</code></li>
<li><code>mkdir build && cd build</code></li>
<li><code>cmake -DLLVM_ENABLE_PROJECTS=libcxxabi ../llvm # on linux you may need to specify -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++</code></li>
<li><code>make</code></li>
</ul>
<p>To do a standalone build:</p>
<ul>
<li>
Check out the source tree. This includes the other subprojects, but you'll only use the libcxxabi part.
</li>
<li><code>cd llvm-project</code></li>
<li><code>mkdir build-libcxxabi && cd build-libcxxabi</code></li>
<li><code>cmake -DLIBCXXABI_LIBCXX_PATH=path/to/libcxx ../libcxxabi # on
linux you may need -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++</code></li>
<li><code>make</code></li>
</ul>
<p> By default CMake uses <code>llvm-config</code> to locate the required
LLVM sources. If CMake cannot find <code>llvm-config</code> then you must
configure CMake using either of the following options.
</p>
<ul>
<li><code>-DLLVM_CONFIG_PATH=path/to/llvm-config</code></li>
<li><code>-DLLVM_PATH=path/to/llvm-source-root</code></li>
</ul>
</p>
<p>To run the tests:</p>
<ul>
<li><code>make check-cxxabi</code></li>
</ul>
<p>Note: in a standalone build, the system's libc++ will be used for tests. If
the system's libc++ was statically linked against libc++abi (or linked against
a different ABI library), this may interfere with test results.</p>
<p>Send discussions to the
(<a href="https://lists.llvm.org/mailman/listinfo/libcxx-dev">libcxx-dev mailing list</a>).</p>
<!--=====================================================================-->
<h2>Frequently asked questions</h2>
<!--=====================================================================-->
<p>Q: Why are the destructors for the standard exception classes defined in libc++abi?
They're just empty, can't they be defined inline?</p>
<p>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 <code>type_info</code> gets defined.
And in libc++ types are the same type if and only if they have the same <code>type_info</code>
(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 <code>std::exception</code> for example),
there must be only one <code>std::exception type_info</code> in the entire app.
That typeinfo gets laid down beside <code>~exception()</code> in libc++abi (for both libstdc++ and libc++).</p>
<p>--Howard Hinnant</p>
</div>
</body>
</html>