From: Phil Edwards
Date: Tue, 2 Apr 2002 02:07:22 +0000 (+0000)
Subject: exception (__verbose_terminate_handler): Point to docs.
X-Git-Tag: releases/gcc-3.3.0~5960
X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=efe44c60eb50355fe2c87d0765b137a7f886d2fa;p=thirdparty%2Fgcc.git
exception (__verbose_terminate_handler): Point to docs.
2002-04-01 Phil Edwards
* libsupc++/exception (__verbose_terminate_handler): Point to docs.
* docs/doxygen/doxygroups.cc: Doxygen hooks for abi::__cxa_demangle.
* docs/html/18_support/howto.html: Document the demangler.
* docs/html/17_intro/howto.html: And link to it.
* docs/doxygen/mainpage.html: Describe user-vs-maintainer docs.
* docs/doxygen/run_doxygen: Print user-vs-maintainer.
From-SVN: r51730
---
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index ec0c5887b199..179b742289ad 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,13 @@
+2002-04-01 Phil Edwards
+
+ * libsupc++/exception (__verbose_terminate_handler): Point to docs.
+ * docs/doxygen/doxygroups.cc: Doxygen hooks for abi::__cxa_demangle.
+ * docs/html/18_support/howto.html: Document the demangler.
+ * docs/html/17_intro/howto.html: And link to it.
+
+ * docs/doxygen/mainpage.html: Describe user-vs-maintainer docs.
+ * docs/doxygen/run_doxygen: Print user-vs-maintainer.
+
2002-04-01 Phil Edwards
* config/linker-map.gnu: Export __verbose_terminate_handler.
diff --git a/libstdc++-v3/docs/doxygen/doxygroups.cc b/libstdc++-v3/docs/doxygen/doxygroups.cc
index c6139f375478..da71879e8e5b 100644
--- a/libstdc++-v3/docs/doxygen/doxygroups.cc
+++ b/libstdc++-v3/docs/doxygen/doxygroups.cc
@@ -1,4 +1,3 @@
-
/*
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
See license.html for license.
@@ -7,6 +6,11 @@
source headers themselves. It is a ".cc" file for the sole cheesy reason
that it triggers many different text editors into doing Nice Things when
typing comments. However, it is mentioned nowhere except the *cfg.in files.
+
+ Some actual code (declarations) is exposed here, but no compiler ever
+ sees it. The decls must be visible to doxygen, and sometimes their real
+ declarations are not visible, or not visible in a way we want.
+
Pieces separated by '// //' lines will usually not be presented to the
user on the same page.
*/
@@ -112,4 +116,69 @@ All associative containers must meet certain requirements, summarized in
*/
// // // // // // // // // // // // // // // // // // // // // // // //
+/** @namespace abi
+ * @brief The cross-vendor C++ Application Binary Interface.
+ *
+ * A brief overview of an ABI is given in the libstdc++-v3 FAQ, question
+ * 5.8 (you may have a copy of the FAQ locally, or you can view the online
+ * version at http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_8).
+ *
+ * GCC subscribes to a relatively-new cross-vendor ABI for C++, sometimes
+ * called the IA64 ABI because it happens to be the native ABI for that
+ * platform. It is summarized at http://www.codesourcery.com/cxx-abi/
+ * along with the current specification.
+ *
+ * For users of GCC 3.x, entry points are available in , which notes,
+ * "It is not normally necessary for user programs to include this header,
+ * or use the entry points directly. However, this header is available
+ * should that be needed."
+*/
+
+namespace abi {
+/**
+@brief New ABI-mandated entry point in the C++ runtime library for demangling.
+
+@param mangled_name A NUL-terminated character string containing the name
+ to be demangled.
+
+@param output_buffer A region of memory, allocated with malloc, of
+ @a *length bytes, into which the demangled name
+ is stored. If @a output_buffer is not long enough,
+ it is expanded using realloc. @a output_buffer may
+ instead be NULL; in that case, the demangled name is
+ placed in a region of memory allocated with malloc.
+
+@param length If @a length is non-NULL, the length of the buffer containing
+ the demangled name is placed in @a *length.
+
+@param status @a *status is set to one of the following values:
+ - 0: The demangling operation succeeded.
+ - -1: A memory allocation failiure occurred.
+ - -2: @a mangled_name is not a valid name under the C++ ABI
+ mangling rules.
+ - -3: One of the arguments is invalid.
+
+@return A pointer to the start of the NUL-terminated demangled name, or NULL
+ if the demangling fails. The caller is responsible for deallocating
+ this memory using @c free.
+
+
+The demagling is performed using the C++ ABI mangling rules, with
+GNU extensions. For example, this function is used
+in __gnu_cxx::__verbose_terminate_handler. See
+http://gcc.gnu.org/onlinedocs/libstdc++/18_support/howto.html#5 for other
+examples of use.
+
+@note The same demangling functionality is available via libiberty
+(@c and @c libiberty.a) in GCC 3.1 and later, but that
+requires explicit installation (@c --enable-install-libiberty) and uses a
+different API, although the ABI is unchanged.
+*/
+char* __cxa_demangle (const char* mangled_name, char* output_buffer,
+ size_t* length, int* status);
+} // namespace abi
+
+// // // // // // // // // // // // // // // // // // // // // // // //
+
+// vim:et:noai:
diff --git a/libstdc++-v3/docs/doxygen/mainpage.html b/libstdc++-v3/docs/doxygen/mainpage.html
index 431344b972e3..ecfa6490782e 100644
--- a/libstdc++-v3/docs/doxygen/mainpage.html
+++ b/libstdc++-v3/docs/doxygen/mainpage.html
@@ -25,7 +25,7 @@
Documentation Overview
-Generated 2002-03-27.
+@LEVEL@-level docs, generated @DATE@.
There are two types of documentation for libstdc++-v3. One is the
distribution documentation, which can be read online at
@@ -35,7 +35,14 @@
The other type is the source documentation, of which this is the first page.
- Here are quick links to the pages which we seem to use the most; a full
+ Both "user-level" and "maintainer-level" source
+ documentation is produced: user-level docs are for the users of this
+ library. The maint-level docs are for those interested in the underlying
+ workings of the library; they include all the user-level docs plus
+ additional notes and additional classes/functions/etc.
+
+
+Here are quick links to the pages which we seem to use the most; a full
index is at the bottom:
@@ -48,10 +55,10 @@
Generating this file
These HTML pages are automatically generated, along with the man pages.
- The Makefile rule 'make
- doxygen'
in the libstdc++-v3 build directory generates these pages
- using a tool called, appropriately enough, Doxygen. To learn more about
- Doxygen, take a look at
+ The Makefile rules 'make doxygen'
and
+ 'make doxygen-maint'
in the libstdc++-v3 build directory
+ generates these pages using a tool called, appropriately enough, Doxygen.
+ To learn more about Doxygen, take a look at
${outdir}/html_${mode}/index.html
cp ${srcdir}/docs/doxygen/tables.html ${outdir}/html_${mode}/tables.html
echo ::
echo :: HTML pages begin with
diff --git a/libstdc++-v3/docs/html/17_intro/howto.html b/libstdc++-v3/docs/html/17_intro/howto.html
index 914213a37e79..21f83f97e696 100644
--- a/libstdc++-v3/docs/html/17_intro/howto.html
+++ b/libstdc++-v3/docs/html/17_intro/howto.html
@@ -205,7 +205,8 @@
classes publicly derived from it, simply returns the name of the
class. But they are the mangled names; you will need to call
c++filt
and pass the names as command-line parameters to
- demangle them.
+ demangle them, or call a
+ runtime demangler function.
(The classes in <stdexcept>
have constructors which
require an argument to use later for what()
calls, so the
question does not arise in most user-defined exceptions.)
diff --git a/libstdc++-v3/docs/html/18_support/howto.html b/libstdc++-v3/docs/html/18_support/howto.html
index 13adbfd56fcb..10c74a9cbff9 100644
--- a/libstdc++-v3/docs/html/18_support/howto.html
+++ b/libstdc++-v3/docs/html/18_support/howto.html
@@ -31,6 +31,7 @@
- Implementation properties
- Start and Termination
- Dynamic memory management
+
- RTTI, the ABI, and demangling
@@ -255,6 +256,68 @@
to the FAQ.
+
+
+ If you have read the source
+ documentation for namespace abi
then you are aware
+ of the cross-vendor C++ ABI which we use. One of the exposed
+ functions is the one which we use for demangling in programs like
+ c++filt
, and you can use it yourself as well.
+
+ (The function itself might use different demanglers, but that's the
+ whole point of abstract interfaces. If we change the implementation,
+ you won't notice.)
+
+ Probably the only times you'll be interested in demangling at runtime
+ are when you're seeing typeid
strings in RTTI, or when
+ you're handling the runtime-support exception classes. For example:
+
+#include <exception>
+#include <iostream>
+#include <cxxabi.h>
+
+struct empty { };
+
+template <typename T, int N>
+ struct bar { };
+
+
+int main()
+{
+ int status;
+ char *realname;
+
+ // exception classes not in <stdexcept>, thrown by the implementation
+ // instead of the user
+ std::bad_exception e;
+ realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
+ std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
+ free(realname);
+
+
+ // typeid
+ bar<empty,17> u;
+ const std::type_info &ti = typeid(u);
+
+ realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
+ std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
+ free(realname);
+
+ return 0;
+}
+ With GCC 3.1 and later, this prints
+ St13bad_exception => std::bad_exception : 0
+ 3barI5emptyLi17EE => bar<empty, 17> : 0
+
+ The demangler interface is described in the source documentation
+ linked to above. It is actually written in C, so you don't need to
+ be writing C++ in order to demangle C++. (That also means we have to
+ use crummy memory management facilities, so don't forget to free()
+ the returned char array.)
+
+ Return to top of page or
+ to the FAQ.
+
diff --git a/libstdc++-v3/libsupc++/exception b/libstdc++-v3/libsupc++/exception
index 45b98f26eb3f..b26cb6d887f1 100644
--- a/libstdc++-v3/libsupc++/exception
+++ b/libstdc++-v3/libsupc++/exception
@@ -105,7 +105,9 @@ namespace __gnu_cxx
@code
std::set_terminate (__gnu_cxx::__verbose_terminate_handler)
@endcode
- to use. */
+ to use. For more info, see
+ http://gcc.gnu.org/onlinedocs/libstdc++/19_diagnostics/howto.html#4
+ */
void __verbose_terminate_handler ();
} // namespace __gnu_cxx