diff options
Diffstat (limited to 'gprof/gprof.c')
-rw-r--r-- | gprof/gprof.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/gprof/gprof.c b/gprof/gprof.c index 5061efa..6994d8f 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" , |