summaryrefslogtreecommitdiffstats
path: root/gprof/gprof.c
diff options
context:
space:
mode:
authorPer Bothner <per@bothner.com>1992-08-31 03:34:15 +0000
committerPer Bothner <per@bothner.com>1992-08-31 03:34:15 +0000
commitdc1d1ca5e89e49f1d0b5bfd417769fc0fcc170a6 (patch)
treebdfc8e51ad1a61831cc15c8b158e3864a22de607 /gprof/gprof.c
parent3402b1cff22f615e896aa8d0dd2792e910479b78 (diff)
downloadppe42-binutils-dc1d1ca5e89e49f1d0b5bfd417769fc0fcc170a6.tar.gz
ppe42-binutils-dc1d1ca5e89e49f1d0b5bfd417769fc0fcc170a6.zip
* gprof.h, gprof.c, printfgprof.c: Add support for two
output styles: The default is similar to the old FSF gprof, while -T sets the variable bsd_style_output, which causes output matching Berkeley's gprof. The biggest differences are that with the FSF style output, the flat profile comes before the call graph; numbers come before explanations; and there is less gratuitous white space. * gprof.h, gprof.c, printfgprof.c: New discard_underscores variable causes discarding of initial underscores when printing symbol names. It is set unless there is a "main" symbol (without an underscore). * printfgprof.c: New function printnameonly(), called by printname(). It handles stripping of initial '_', as well as C++ name-demangling. * gprof.callg, gprof.flat, make-c-prog.awk: Removed. It is just as convenient to edit blurbs.c directly. * Makefile.in: Removed rule for making blurbs.c. * blurbs.c: This is now a true source file (as opposed to being generated from gprof.callg and gprof.flat). Change style to use one long string literal, instead of one literal per output line. Add FSF-style blurb for call graph.
Diffstat (limited to 'gprof/gprof.c')
-rw-r--r--gprof/gprof.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/gprof/gprof.c b/gprof/gprof.c
index 5061efa56e..6994d8f5cb 100644
--- a/gprof/gprof.c
+++ b/gprof/gprof.c
@@ -38,6 +38,9 @@ char *whoami = "gprof";
*/
char *defaultEs[] = { "mcount" , "__mcleanup" , 0 };
+int discard_underscores = 1; /* Should we discard initial underscores? */
+int bsd_style_output = 0; /* As opposed to FSF style output */
+
main(argc, argv)
int argc;
char **argv;
@@ -102,6 +105,9 @@ main(argc, argv)
case 's':
sflag = TRUE;
break;
+ case 'T': /* "Traditional" output format */
+ bsd_style_output = 1;
+ break;
case 'z':
zflag = TRUE;
break;
@@ -165,14 +171,14 @@ main(argc, argv)
* assemble the dynamic profile
*/
timesortnlp = doarcs();
- /*
- * print the dynamic profile
- */
- printgprof( timesortnlp );
- /*
- * print the flat profile
- */
- printprof();
+
+ if (bsd_style_output) {
+ printgprof( timesortnlp ); /* print the dynamic profile */
+ printprof(); /* print the flat profile */
+ } else {
+ printprof(); /* print the flat profile */
+ printgprof( timesortnlp ); /* print the dynamic profile */
+ }
/*
* print the index
*/
@@ -230,7 +236,7 @@ bfd *abfd;
i = get_symtab_upper_bound (abfd); /* This will probably give us more
* than we need, but that's ok.
*/
- syms = (asymbol**)malloc (i);
+ syms = (asymbol**)xmalloc (i);
nosyms = bfd_canonicalize_symtab (abfd, syms);
nname = 0;
@@ -265,8 +271,16 @@ bfd *abfd;
# endif DEBUG
continue;
}
+ /* Symbol offsets are always section-relative. */
npe->value = syms[i]->value + syms[i]->section->vma;
npe->name = syms[i]->name;
+
+ /* If we see "main" without an initial '_', we assume
+ names are *not* prefixed by '_'. */
+ if (npe->name[0] == 'm' && discard_underscores
+ && strcmp(npe->name, "main") == 0)
+ discard_underscores = 0;
+
# ifdef DEBUG
if ( debug & AOUTDEBUG ) {
printf( "[getsymtab] %d %s 0x%08x\n" ,
OpenPOWER on IntegriCloud