demangle.c revision 9a2ad351a1c3215dc596ff3e2e3fd4bc24445a6b
1#if HAVE_CONFIG_H 2#include "config.h" 3#endif 4 5#include <string.h> 6#include <stdlib.h> 7#include <stdio.h> 8 9#include "options.h" 10#include "output.h" 11#include "demangle.h" 12 13#include "dict.h" 14 15#ifdef USE_DEMANGLE 16 17/*****************************************************************************/ 18 19static struct dict * d = NULL; 20 21static void 22my_demangle_dict_clear(void) { 23 /* FIXME TODO XXX: I should also free all (key,value) pairs */ 24 dict_clear(d); 25} 26 27const char * 28my_demangle(const char * function_name) { 29 const char * tmp, * fn_copy; 30#if !defined HAVE_LIBIBERTY && defined HAVE_LIBSUPC__ 31 extern char *__cxa_demangle (const char *, char *, size_t *, int *); 32 int status = 0; 33#endif 34 35 if (!d) { 36 d = dict_init(dict_key2hash_string, dict_key_cmp_string); 37 atexit(my_demangle_dict_clear); 38 } 39 40 tmp = dict_find_entry(d, (void *)function_name); 41 if (!tmp) { 42 fn_copy = strdup(function_name); 43#ifdef HAVE_LIBIBERTY 44 tmp = cplus_demangle(function_name, DMGL_ANSI | DMGL_PARAMS); 45#elif defined HAVE_LIBSUPC__ 46 tmp = __cxa_demangle(function_name, NULL, NULL, &status); 47#endif 48 if (!tmp) tmp = fn_copy; 49 if (tmp) dict_enter(d, (void *)fn_copy, (void *)tmp); 50 } 51 return tmp; 52} 53 54#endif 55