This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[patch] Document libstdc++ dual ABI
- From: Jonathan Wakely <jwakely at redhat dot com>
- To: libstdc++ at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Tue, 21 Apr 2015 11:38:50 +0100
- Subject: [patch] Document libstdc++ dual ABI
- Authentication-results: sourceware.org; auth=none
This adds some proper documentation for the ABI changes.
Committed to trunk.
commit 738e20c17326a4d966b24d081549991f0a318774
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Mon Apr 20 22:49:43 2015 +0100
* doc/xml/manual/configure.xml: Update descriptions of options
affecting dual ABI and add cross-references.
* doc/xml/manual/strings.xml: Clarify that string isn't COW now.
* doc/xml/manual/using.xml: Document ABI transition.
* doc/html/*: Regenerate.
diff --git a/libstdc++-v3/doc/xml/manual/configure.xml b/libstdc++-v3/doc/xml/manual/configure.xml
index a6e0c21..56d071e 100644
--- a/libstdc++-v3/doc/xml/manual/configure.xml
+++ b/libstdc++-v3/doc/xml/manual/configure.xml
@@ -385,18 +385,22 @@
<varlistentry><term><code>--disable-libstdcxx-dual-abi</code></term>
<listitem>
<para>
- Disable support for the new, C++11-conforming <code>std::string</code>
- implementation. This option changes the library ABI.
+ Disable support for the new, C++11-conforming implementations of
+ <code>std::string</code>, <code>std::list</code> etc. so that the
+ library only provides definitions of types using the old ABI
+ (see <xref linkend="manual.intro.using.abi"/>).
+ This option changes the library ABI.
</para>
</listitem></varlistentry>
-<varlistentry><term><code>--with-default-libstdcxx-abi</code></term>
+<varlistentry><term><code>--with-default-libstdcxx-abi=</code><replaceable>OPTION</replaceable></term>
<listitem>
<para>
- By default, the new <code>std::string</code> implementation will be
- declared and a macro must be defined to declare the old implementation
- instead. That default can be reversed by configuring the library with
- <code>--with-default-libstdcxx-abi=c++98</code>.
+ Set the default value for the <symbol>_GLIBCXX_USE_CXX11_ABI</symbol>
+ macro (see <xref linkend="manual.intro.using.macros"/>).
+ The default is <option>OPTION=c++11</option> which sets the macro to
+ <literal>1</literal>,
+ use <option>OPTION=c++98</option> to set it to <literal>0</literal>.
This option does not change the library ABI.
</para>
</listitem></varlistentry>
diff --git a/libstdc++-v3/doc/xml/manual/strings.xml b/libstdc++-v3/doc/xml/manual/strings.xml
index 6a94fa2..101f8cd 100644
--- a/libstdc++-v3/doc/xml/manual/strings.xml
+++ b/libstdc++-v3/doc/xml/manual/strings.xml
@@ -353,7 +353,7 @@ stringtok(Container &container, string const &in,
a <code>vector</code>'s memory usage
(see <link linkend="faq.size_equals_capacity">this FAQ
entry</link>) but the regular copy constructor cannot be used
- because libstdc++'s <code>string</code> is Copy-On-Write.
+ because libstdc++'s <code>string</code> is Copy-On-Write in GCC 3.
</para>
<para>In <link linkend="status.iso.2011">C++11</link> mode you can call
<code>s.shrink_to_fit()</code> to achieve the same effect as
diff --git a/libstdc++-v3/doc/xml/manual/using.xml b/libstdc++-v3/doc/xml/manual/using.xml
index 0ce4407..8b4af1a 100644
--- a/libstdc++-v3/doc/xml/manual/using.xml
+++ b/libstdc++-v3/doc/xml/manual/using.xml
@@ -875,6 +875,22 @@ g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe
</para>
</listitem></varlistentry>
+ <varlistentry><term><code>_GLIBCXX_USE_CXX11_ABI</code></term>
+ <listitem>
+ <para>
+ Defined to the value <literal>1</literal> by default.
+ Configurable via <code>--disable-libstdcxx-dual-abi</code>
+ and/or <code>--with-default-libstdcxx-abi</code>.
+ ABI-changing.
+ When defined to a non-zero value the library headers will use the
+ new C++11-conforming ABI introduced in GCC 5, rather than the older
+ ABI introduced in GCC 3.4. This changes the definition of several
+ class templates, including <classname>std:string</classname>,
+ <classname>std::list</classname> and some locale facets.
+ For more details see <xref linkend="manual.intro.using.abi"/>.
+ </para>
+ </listitem></varlistentry>
+
<varlistentry><term><code>_GLIBCXX_CONCEPT_CHECKS</code></term>
<listitem>
<para>
@@ -922,6 +938,94 @@ g++ -Winvalid-pch -I. -include stdc++.h -H -g -O2 hello.cc -o test.exe
</section>
+<section xml:id="manual.intro.using.abi" xreflabel="Dual ABI">
+ <info><title>Dual ABI</title></info>
+ <?dbhtml filename="using_dual_abi.html"?>
+
+<para> In the GCC 5.1 release libstdc++ introduced a new library ABI that
+ includes new implementations of <classname>std::string</classname> and
+ <classname>std::list</classname>. These changes were necessary to conform
+ to the 2011 C++ standard which forbids Copy-On-Write strings and requires
+ lists to keep track of their size.
+</para>
+
+<para> In order to maintain backwards compatibility for existing code linked
+ to libstdc++ the library's soname has not changed and the old
+ implementations are still supported in parallel with the new ones.
+ This is achieved by defining the new implementations in an inline namespace
+ so they have different names for linkage purposes, e.g. the new version of
+ <classname>std::list<int></classname> is actually defined as
+ <classname>std::__cxx11::list<int></classname>. Because the symbols
+ for the new implementations have different names the definitions for both
+ versions can be present in the same library.
+</para>
+
+<para> The <symbol>_GLIBCXX_USE_CXX11_ABI</symbol> macro (see
+<xref linkend="manual.intro.using.macros"/>) controls whether
+ the declarations in the library headers use the old or new ABI.
+ So the decision of which ABI to use can be made separately for each
+ source file being compiled.
+ Using the default configuration options for GCC the default value
+ of the macro is <literal>1</literal> which causes the new ABI to be active,
+ so to use the old ABI you must explicitly define the macro to
+ <literal>0</literal> before including any library headers.
+ (Be aware that some GNU/Linux distributions configure GCC 5 differently so
+ that the default value of the macro is <literal>0</literal> and users must
+ define it to <literal>1</literal> to enable the new ABI.)
+</para>
+
+<para> Although the changes were made for C++11 conformance, the choice of ABI
+ to use is independent of the <option>-std</option> option used to compile
+ your code, i.e. for a given GCC build the default value of the
+ <symbol>_GLIBCXX_USE_CXX11_ABI</symbol> macro is the same for all dialects.
+ This ensures that the <option>-std</option> does not change the ABI, so
+ that it is straightforward to link C++03 and C++11 code together.
+</para>
+
+<para> Because <classname>std::string</classname> is used extensively
+ throughout the library a number of other types are also defined twice,
+ including the stringstream classes and several facets used by
+ <classname>std::locale</classname>. The standard facets which are always
+ installed in a locale may be present twice, with both ABIs, to ensure that
+ code like
+ <code>std::use_facet<std::time_get<char>>(locale);</code>
+ will work correctly for both <classname>std::time_get</classname> and
+ <classname>std::__cxx11::time_get</classname> (even if a user-defined
+ facet that derives from one or other version of
+ <classname>time_get</classname> is installed in the locale).
+</para>
+
+<para> Although the standard exception types defined in
+ <filename clas="headerfile"><stdexcept></filename> use strings, they
+ are not defined twice, so that a <classname>std::out_of_range</classname>
+ exception thrown in one file can always be caught by a suitable handler in
+ another file, even if the two files are compiled with different ABIs.
+</para>
+
+<section xml:id="manual.intro.using.abi.trouble" xreflabel="Dual ABI Troubleshooting"><info><title>Troubleshooting</title></info>
+
+<para> If you get linker errors about undefined references to symbols
+ that involve types in the <code>std::__cxx11</code> namespace or the tag
+ <code>[abi:cxx11]</code> then it probably indicates that you are trying to
+ link together object files that were compiled with different values for the
+ <symbol>_GLIBCXX_USE_CXX11_ABI</symbol> macro. This commonly happens when
+ linking to a third-party library that was compiled with an older version
+ of GCC. If the third-party library cannot be rebuilt with the new ABI then
+ you will need to recompile your code with the old ABI.
+</para>
+
+<para> Not all uses of the new ABI will cause changes in symbol names, for
+ example a class with a <classname>std::string</classname> member variable
+ will have the same mangled name whether compiled with the old or new ABI.
+ In order to detect such problems the new types and functions are
+ annotated with the <property>abi_tag</property> attribute, allowing the
+ compiler to warn about potential ABI incompatibilities in code using them.
+ Those warnings can be enabled with the <option>-Wabi-tag</option> option.
+</para>
+
+</section>
+</section>
+
<section xml:id="manual.intro.using.namespaces" xreflabel="Namespaces"><info><title>Namespaces</title></info>
<?dbhtml filename="using_namespaces.html"?>
@@ -956,6 +1060,11 @@ and <code>__gnu_pbds</code>.
</para></listitem>
</itemizedlist>
+<para> The library uses a number of inline namespaces as implementation
+details that are not intended for users to refer to directly, these include
+<code>std::__detail</code>, <code>std::__cxx11</code> and <code>std::_V2</code>.
+</para>
+
<para> A complete list of implementation namespaces (including namespace contents) is available in the generated source <link xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/namespaces.html">documentation</link>.
</para>