xref: /openbsd-src/gnu/usr.bin/binutils/gprof/utils.c (revision f7cc78ec694aa42ece3363be499a17e16a4780bc)
1 /*
2  * Copyright (c) 1983, 1998 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 ("%s", 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 }
107