aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gprof/gprof.c62
-rw-r--r--gprof/gprof.h2
2 files changed, 31 insertions, 33 deletions
diff --git a/gprof/gprof.c b/gprof/gprof.c
index 9c4701c..b2c5e33 100644
--- a/gprof/gprof.c
+++ b/gprof/gprof.c
@@ -29,6 +29,8 @@ static char sccsid[] = "@(#)gprof.c 5.6 (Berkeley) 6/1/90";
#include "gprof.h"
+bfd *abfd;
+
char *whoami = "gprof";
/*
@@ -185,7 +187,6 @@ main(argc, argv)
*/
getnfile()
{
- bfd *abfd;
int valcmp();
abfd = bfd_openr (a_outname, NULL);
@@ -216,33 +217,9 @@ getnfile()
# endif DEBUG
}
-#if 0
-getstrtab(nfile)
- FILE *nfile;
-{
-
- fseek(nfile, (long)(N_SYMOFF(xbuf) + xbuf.a_syms), 0);
- if (fread(&ssiz, sizeof (ssiz), 1, nfile) == 0) {
- fprintf(stderr, "%s: %s: no string table (old format?)\n" ,
- whoami , a_outname );
- done();
- }
- strtab = (char *)calloc(ssiz, 1);
- if (strtab == NULL) {
- fprintf(stderr, "%s: %s: no room for %d bytes of string table",
- whoami , a_outname , ssiz);
- done();
- }
- if (fread(strtab+sizeof(ssiz), ssiz-sizeof(ssiz), 1, nfile) != 1) {
- fprintf(stderr, "%s: %s: error reading string table\n",
- whoami , a_outname );
- done();
- }
-}
-#endif /* 0 */
- /*
- * Read in symbol table
- */
+/*
+ * Read in symbol table
+ */
getsymtab(abfd)
bfd *abfd;
{
@@ -349,6 +326,9 @@ getpfile(filename)
* a bunch of <from,self,count> tuples.
*/
while ( fread( &arc , sizeof arc , 1 , pfile ) == 1 ) {
+ arc.raw_frompc = bfd_get_32 (abfd, &arc.raw_frompc);
+ arc.raw_selfpc = bfd_get_32 (abfd, &arc.raw_selfpc);
+ arc.raw_count = bfd_get_32 (abfd, &arc.raw_count);
# ifdef DEBUG
if ( debug & SAMPLEDEBUG ) {
printf( "[getpfile] frompc 0x%x selfpc 0x%x count %d\n" ,
@@ -375,6 +355,10 @@ openpfile(filename)
done();
}
fread(&tmp, sizeof(struct hdr), 1, pfile);
+ tmp.lowpc = bfd_get_32 (abfd, &tmp.lowpc);
+ tmp.highpc = bfd_get_32 (abfd, &tmp.highpc);
+ tmp.ncnt = bfd_get_32 (abfd, &tmp.ncnt);
+
if ( s_highpc != 0 && ( tmp.lowpc != h.lowpc ||
tmp.highpc != h.highpc || tmp.ncnt != h.ncnt ) ) {
fprintf(stderr, "%s: incompatible with first gmon file\n", filename);
@@ -496,15 +480,17 @@ readsamples(pfile)
UNIT sample;
if (samples == 0) {
- samples = (UNIT *) calloc(sampbytes, sizeof (UNIT));
+ samples = (UNIT *) malloc (sampbytes * sizeof(UNIT));
if (samples == 0) {
fprintf( stderr , "%s: No room for %d sample pc's\n",
whoami , sampbytes / sizeof (UNIT));
done();
}
+ memset (samples, 0, sampbytes * sizeof(UNIT));
}
for (i = 0; i < nsamples; i++) {
fread(&sample, sizeof (UNIT), 1, pfile);
+ sample = bfd_get_16 (abfd, &sample);
if (feof(pfile))
break;
samples[i] += sample;
@@ -667,22 +653,25 @@ funcsymbol( symp )
extern char *strtab; /* string table from a.out */
extern int aflag; /* if static functions aren't desired */
char *name;
-
+ int i;
+
/*
* must be a text symbol,
* and static text symbols don't qualify if aflag set.
*/
+
if (!symp->section)
return FALSE;
+#if 0
if (!aflag && (symp->flags&BSF_LOCAL)) {
-#ifdef DEBUG
+#if defined(DEBUG)
fprintf (stderr, "%s(%d): %s: not a function\n", __FILE__, __LINE__, symp->name);
#endif
return FALSE;
}
-
+#endif /* 0 */
/*
* can't have any `funny' characters in name,
* where `funny' includes `.', .o file names
@@ -696,7 +685,14 @@ funcsymbol( symp )
return FALSE;
}
}
- return TRUE;
+
+ i = bfd_decode_symclass (symp);
+#if defined(DEBUG) && 0
+ if (i != 'T' && i != 't')
+ fprintf (stderr, "%s(%d): %s is of class %c\n", __FILE__, __LINE__, symp->name, i);
+#endif
+
+ return (i == 'T' || i == 't');
}
done()
diff --git a/gprof/gprof.h b/gprof/gprof.h
index 35ad5af..52cf896 100644
--- a/gprof/gprof.h
+++ b/gprof/gprof.h
@@ -20,7 +20,9 @@
*/
#include <stdio.h>
+#ifdef __STDC__
#include <stdlib.h>
+#endif /* __STDC__ */
#include <sys/types.h>
#include <sys/stat.h>
#include "bfd.h"