]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/libsupc++/vterminate.cc
Update copyright years in libstdc++-v3/
[thirdparty/gcc.git] / libstdc++-v3 / libsupc++ / vterminate.cc
CommitLineData
74a3070f
JM
1// Verbose terminate_handler -*- C++ -*-
2
aa118a03 3// Copyright (C) 2001-2014 Free Software Foundation, Inc.
74a3070f 4//
38cca750
BK
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
748086b7 8// Free Software Foundation; either version 3, or (at your option)
74a3070f 9// any later version.
38cca750
BK
10
11// This library is distributed in the hope that it will be useful,
74a3070f
JM
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
38cca750 15
748086b7
JJ
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
74a3070f 24
fb705416 25#include <bits/c++config.h>
3cbc7af0 26
4c24b21a 27#if _GLIBCXX_HOSTED
74a3070f 28#include <cstdlib>
2ca08953 29#include <exception>
7c3e9502 30#include <bits/exception_defines.h>
74a3070f 31#include <cxxabi.h>
fb705416 32# include <cstdio>
fb705416 33
74a3070f
JM
34using namespace std;
35using namespace abi;
36
12ffa228
BK
37namespace __gnu_cxx
38{
39_GLIBCXX_BEGIN_NAMESPACE_VERSION
3cbc7af0 40
6f94dea7
BK
41 // A replacement for the standard terminate_handler which prints
42 // more information about the terminating exception (if any) on
43 // stderr.
2ca08953
BK
44 void __verbose_terminate_handler()
45 {
afc3bb58 46 static bool terminating;
afc3bb58
MM
47 if (terminating)
48 {
6f94dea7 49 fputs("terminate called recursively\n", stderr);
afc3bb58
MM
50 abort ();
51 }
6f94dea7 52 terminating = true;
afc3bb58 53
2ca08953
BK
54 // Make sure there was an exception; terminate is also called for an
55 // attempt to rethrow when there is no suitable exception.
56 type_info *t = __cxa_current_exception_type();
57 if (t)
74a3070f 58 {
2ca08953 59 // Note that "name" is the mangled name.
6f94dea7 60 char const *name = t->name();
2ca08953
BK
61 {
62 int status = -1;
63 char *dem = 0;
64
2ca08953 65 dem = __cxa_demangle(name, 0, 0, &status);
74a3070f 66
6f94dea7 67 fputs("terminate called after throwing an instance of '", stderr);
fb705416 68 if (status == 0)
6f94dea7 69 fputs(dem, stderr);
fb705416 70 else
6f94dea7
BK
71 fputs(name, stderr);
72 fputs("'\n", stderr);
74a3070f 73
2ca08953
BK
74 if (status == 0)
75 free(dem);
76 }
74a3070f 77
6f94dea7
BK
78 // If the exception is derived from std::exception, we can
79 // give more information.
bbcfe54a 80 __try { __throw_exception_again; }
2ca08953 81#ifdef __EXCEPTIONS
bbcfe54a 82 __catch(const exception& exc)
fb705416
PE
83 {
84 char const *w = exc.what();
6f94dea7
BK
85 fputs(" what(): ", stderr);
86 fputs(w, stderr);
87 fputs("\n", stderr);
fb705416 88 }
2ca08953 89#endif
bbcfe54a 90 __catch(...) { }
2ca08953
BK
91 }
92 else
6f94dea7 93 fputs("terminate called without an active exception\n", stderr);
2ca08953
BK
94
95 abort();
96 }
3cbc7af0 97
12ffa228
BK
98_GLIBCXX_END_NAMESPACE_VERSION
99} // namespace
3cbc7af0 100
4c24b21a 101#endif