Add --demangle and --no-demangle options:
[external/binutils.git] / gprof / utils.c
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that: (1) source distributions retain this entire copyright
7  * notice and comment, and (2) distributions including binaries display
8  * the following acknowledgement:  ``This product includes software
9  * developed by the University of California, Berkeley and its contributors''
10  * in the documentation or other materials provided with the distribution
11  * and in all advertising materials mentioning features or use of this
12  * software. Neither the name of the University nor the names of its
13  * contributors may be used to endorse or promote products derived
14  * from this software without specific prior written permission.
15  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18  */
19 #include <demangle.h>
20 #include "gprof.h"
21 #include "cg_arcs.h"
22 #include "symtab.h"
23
24
25 /*
26  * Print name of symbol.  Return number of characters printed.
27  */
28 int
29 DEFUN (print_name_only, (self), Sym * self)
30 {
31   const char *name = self->name;
32   const char *filename;
33   char *demangled = 0;
34   char buf[PATH_MAX];
35   int size = 0;
36
37   if (name)
38     {
39       if (!bsd_style_output)
40         {
41           if (name[0] == '_' && name[1] && discard_underscores)
42             {
43               name++;
44             }
45           if (demangle)
46             {
47               demangled = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS);
48               if (demangled)
49                 {
50                   name = demangled;
51                 }
52             }
53         }
54       printf ("%s", name);
55       size = strlen (name);
56       if (line_granularity && self->file)
57         {
58           filename = self->file->name;
59           if (!print_path)
60             {
61               filename = strrchr (filename, '/');
62               if (filename)
63                 {
64                   ++filename;
65                 }
66               else
67                 {
68                   filename = self->file->name;
69                 }
70             }
71           sprintf (buf, " (%s:%d)", filename, self->line_num);
72           printf (buf);
73           size += strlen (buf);
74         }
75       if (demangled)
76         {
77           free (demangled);
78         }
79       DBG (DFNDEBUG, printf ("{%d} ", self->cg.top_order));
80       DBG (PROPDEBUG, printf ("%4.0f%% ", 100.0 * self->cg.prop.fract));
81     }
82   return size;
83 }
84
85
86 void
87 DEFUN (print_name, (self), Sym * self)
88 {
89   print_name_only (self);
90
91   if (self->cg.cyc.num != 0)
92     {
93       printf (" <cycle %d>", self->cg.cyc.num);
94     }
95   if (self->cg.index != 0)
96     {
97       if (self->cg.print_flag)
98         {
99           printf (" [%d]", self->cg.index);
100         }
101       else
102         {
103           printf (" (%d)", self->cg.index);
104         }
105     }
106 }