OSDN Git Service

* config/sparc/sol2-bi.h (CC1_SPEC): Error for -m32 and -m64.
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / src / vterminate.cc
1 // Verbose terminate_handler -*- C++ -*-
2
3 // Copyright (C) 2001, 2002 Free Software Foundation
4 //
5 // This file is part of GNU CC.
6 //
7 // GNU CC is free software; you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation; either version 2, or (at your option)
10 // any later version.
11 // 
12 // GNU CC is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 // 
17 // You should have received a copy of the GNU General Public License
18 // along with GNU CC; see the file COPYING.  If not, write to
19 // the Free Software Foundation, 59 Temple Place - Suite 330,
20 // Boston, MA 02111-1307, USA.
21
22 // As a special exception, you may use this file as part of a free software
23 // library without restriction.  Specifically, if other files instantiate
24 // templates or use macros or inline functions from this file, or you compile
25 // this file and link it with other files to produce an executable, this
26 // file does not by itself cause the resulting executable to be covered by
27 // the GNU General Public License.  This exception does not however
28 // invalidate any other reasons why the executable file might be covered by
29 // the GNU General Public License.
30
31 #include <cstdlib>
32 #include <cstdio>
33 #include <exception>
34 #include <exception_defines.h>
35 #include <cxxabi.h>
36
37 using namespace std;
38 using namespace abi;
39
40 namespace __gnu_cxx
41 {
42   /* A replacement for the standard terminate_handler which prints
43    more information about the terminating exception (if any) on
44    stderr.  */
45   void __verbose_terminate_handler()
46   {
47     // Make sure there was an exception; terminate is also called for an
48     // attempt to rethrow when there is no suitable exception.
49     type_info *t = __cxa_current_exception_type();
50     if (t)
51       {
52         char const *name = t->name();
53         // Note that "name" is the mangled name.
54         
55         {
56           int status = -1;
57           char *dem = 0;
58           
59           // Disabled until __cxa_demangle gets the runtime GPL exception.
60           dem = __cxa_demangle(name, 0, 0, &status);
61
62           printf("terminate called after throwing a `%s'\n", 
63                  status == 0 ? dem : name);
64
65           if (status == 0)
66             free(dem);
67         }
68
69         // If the exception is derived from std::exception, we can give more
70         // information.
71         try { __throw_exception_again; }
72 #ifdef __EXCEPTIONS
73         catch (exception &exc)
74           { fprintf(stderr, "  what(): %s\n", exc.what()); }
75 #endif
76         catch (...) { }
77       }
78     else
79       fprintf(stderr, "terminate called without an active exception\n");
80     
81     abort();
82   }
83 } // namespace __gnu_cxx