diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2014-12-23 14:38:46 +0000 |
---|---|---|
committer | <> | 2015-05-26 15:48:41 +0000 |
commit | 5500a97a2ad1735db5b35bc51cfb825c1f4c38df (patch) | |
tree | cc6e777c26142b88456ff03a672e1cb69215fc32 /gprof/bb_exit_func.c | |
download | binutils-tarball-master.tar.gz |
Imported from /home/lorry/working-area/delta_binutils-tarball/binutils-2.25.tar.bz2.HEADbinutils-2.25master
Diffstat (limited to 'gprof/bb_exit_func.c')
-rw-r--r-- | gprof/bb_exit_func.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gprof/bb_exit_func.c b/gprof/bb_exit_func.c new file mode 100644 index 0000000..3d416a6 --- /dev/null +++ b/gprof/bb_exit_func.c @@ -0,0 +1,93 @@ +/* bb_exit_func.c - dumps all the basic-block statistics linked into + the bb_head chain to .d files. + + Copyright (C) 2000-2014 Free Software Foundation, Inc. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. + + This code was contributed by: + + David Mosberger-Tang <David.Mosberger@acm.org> */ + +#include <stdio.h> +#include <strings.h> +#include "bfd.h" +#include "gmon_out.h" + +/* structure emitted by -a */ +struct bb +{ + long zero_word; + const char *filename; + long *counts; + long ncounts; + struct bb *next; + const unsigned long *addresses; +}; + +struct bb *__bb_head = (struct bb *) 0; + + +void +__bb_exit_func () +{ + const int version = GMON_VERSION; + struct gmon_hdr ghdr; + struct bb *ptr; + FILE *fp; + /* GEN_GMON_CNT_FILE should be defined on systems with mcleanup() + functions that do not write basic-block to gmon.out. In such + cases profiling with "-pg -a" would result in a gmon.out file + without basic-block info (because the file written here would be + overwritten. Thus, a separate file is generated instead. The + two files can easily be combined by specifying them on gprof's + command line (and possibly generating a gmon.sum file with "gprof + -s"). */ +#ifndef GEN_GMON_CNT_FILE +# define OUT_NAME "gmon.out" +#else +# define OUT_NAME "gmon.cnt" +#endif + fp = fopen (OUT_NAME, "wb"); + if (!fp) + { + perror (OUT_NAME); + return; + } + memcpy (&ghdr.cookie[0], GMON_MAGIC, 4); + memcpy (&ghdr.version, &version, sizeof (version)); + fwrite (&ghdr, sizeof (ghdr), 1, fp); + + for (ptr = __bb_head; ptr != 0; ptr = ptr->next) + { + u_int ncounts = ptr->ncounts; + u_char tag; + u_int i; + + tag = GMON_TAG_BB_COUNT; + fwrite (&tag, sizeof (tag), 1, fp); + fwrite (&ncounts, sizeof (ncounts), 1, fp); + + for (i = 0; i < ncounts; ++i) + { + fwrite (&ptr->addresses[i], sizeof (ptr->addresses[0]), 1, fp); + fwrite (&ptr->counts[i], sizeof (ptr->counts[0]), 1, fp); + } + } + fclose (fp); +} |