summaryrefslogtreecommitdiff
path: root/gprof/bb_exit_func.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2014-12-23 14:38:46 +0000
committer <>2015-05-26 15:48:41 +0000
commit5500a97a2ad1735db5b35bc51cfb825c1f4c38df (patch)
treecc6e777c26142b88456ff03a672e1cb69215fc32 /gprof/bb_exit_func.c
downloadbinutils-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.c93
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);
+}