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