6
6
7
7
#include " llvm/Demangle/Demangle.h"
8
8
9
- const char kDemumbleVersion [] = " 1.1 .0" ;
9
+ const char kDemumbleVersion [] = " 1.2 .0" ;
10
10
11
11
static void print_help (FILE* out) {
12
12
fprintf (out,
@@ -15,6 +15,7 @@ static void print_help(FILE* out) {
15
15
" if symbols are unspecified, reads from stdin.\n "
16
16
" \n "
17
17
" options:\n "
18
+ " -b print both demangled and mangled name\n "
18
19
" -m only print mangled names that were demangled, omit other output\n "
19
20
" -u use unbuffered output\n "
20
21
" --version print demumble version (\" %s\" )\n " , kDemumbleVersion );
@@ -24,15 +25,15 @@ static bool starts_with(const char* s, const char* prefix) {
24
25
return strncmp (s, prefix, strlen (prefix)) == 0 ;
25
26
}
26
27
27
- static void print_demangled (const char * s) {
28
+ static void print_demangled (const char * format, const char * s) {
28
29
const char * cxa_in = s;
29
30
if (starts_with (s, " __Z" ) || starts_with (s, " ____Z" ))
30
31
cxa_in += 1 ;
31
32
if (char * itanium = llvm::itaniumDemangle (cxa_in, NULL , NULL , NULL )) {
32
- printf (" %s " , itanium);
33
+ printf (format , itanium, s );
33
34
free (itanium);
34
35
} else if (char * ms = llvm::microsoftDemangle (s, NULL , NULL , NULL )) {
35
- printf (" %s " , ms);
36
+ printf (format , ms, s );
36
37
free (ms);
37
38
} else {
38
39
printf (" %s" , s);
@@ -61,10 +62,13 @@ static bool is_plausible_itanium_prefix(char* s) {
61
62
static char buf[8192 ];
62
63
int main (int argc, char * argv[]) {
63
64
enum { kPrintAll , kPrintMatching } print_mode = kPrintAll ;
65
+ const char * print_format = " %s" ;
64
66
while (argc > 1 && argv[1 ][0 ] == ' -' ) {
65
67
if (strcmp (argv[1 ], " -h" ) == 0 || strcmp (argv[1 ], " --help" ) == 0 ) {
66
68
print_help (stdout);
67
69
return 0 ;
70
+ } else if (strcmp (argv[1 ], " -b" ) == 0 ) {
71
+ print_format = " \" %s\" (%s)" ;
68
72
} else if (strcmp (argv[1 ], " -m" ) == 0 ) {
69
73
print_mode = kPrintMatching ;
70
74
} else if (strcmp (argv[1 ], " -u" ) == 0 ) {
@@ -85,7 +89,7 @@ int main(int argc, char* argv[]) {
85
89
++argv;
86
90
}
87
91
for (int i = 1 ; i < argc; ++i) {
88
- print_demangled (argv[i]);
92
+ print_demangled (print_format, argv[i]);
89
93
printf (" \n " );
90
94
}
91
95
if (argc == 1 ) { // Read stdin instead.
@@ -125,7 +129,7 @@ int main(int argc, char* argv[]) {
125
129
126
130
char tmp = cur[n_sym];
127
131
cur[n_sym] = ' \0 ' ;
128
- print_demangled (cur);
132
+ print_demangled (print_format, cur);
129
133
need_separator = true ;
130
134
cur[n_sym] = tmp;
131
135
0 commit comments