X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gprof%2Fbb_exit_func.c;h=6c8357dffe0f21ece5b2f77add22330a627265c0;hb=1b61f46da5e55bf2df243215f34ffbca4bcf6d9e;hp=813321566c72c1b59b3ce5dc652f38b6e008fdf9;hpb=27e232885db363fb545fd2f450e72d929e59b8f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gprof/bb_exit_func.c b/gprof/bb_exit_func.c index 813321566c..6c8357dffe 100644 --- a/gprof/bb_exit_func.c +++ b/gprof/bb_exit_func.c @@ -1,78 +1,93 @@ -/* - * Copyright (c) 1994 David Mosberger-Tang. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. - * - * __bb_exit_func() dumps all the basic-block statistics linked into - * the bb_head chain to .d files. - */ +/* bb_exit_func.c - dumps all the basic-block statistics linked into + the bb_head chain to .d files. + + Copyright (C) 2000-2019 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 */ + #include #include #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 +{ + long zero_word; + const char *filename; + long *counts; + long ncounts; + struct bb *next; + const unsigned long *addresses; }; -struct bb *__bb_head = (struct bb *)0; +struct bb *__bb_head = (struct bb *) 0; void -__bb_exit_func (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"). - */ + 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; - } /* if */ - 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; + 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); - tag = GMON_TAG_BB_COUNT; - fwrite(&tag, sizeof(tag), 1, fp); - fwrite(&ncounts, sizeof(ncounts), 1, fp); + for (ptr = __bb_head; ptr != 0; ptr = ptr->next) + { + u_int ncounts = ptr->ncounts; + u_char tag; + u_int i; - 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); - } /* for */ - } /* for */ - fclose (fp); -} /* __bb_exit_func */ + tag = GMON_TAG_BB_COUNT; + fwrite (&tag, sizeof (tag), 1, fp); + fwrite (&ncounts, sizeof (ncounts), 1, fp); - /*** end of __bb_exit_func.c ***/ + 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); +}