1 | /* Copyright (C) 1996-2017 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. |
3 | Contributed by David Mosberger (davidm@cs.arizona.edu). |
4 | |
5 | The GNU C Library is free software; you can redistribute it and/or |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either |
8 | version 2.1 of the License, or (at your option) any later version. |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 | Lesser General Public License for more details. |
14 | |
15 | You should have received a copy of the GNU Lesser General Public |
16 | License along with the GNU C Library; if not, see |
17 | <http://www.gnu.org/licenses/>. */ |
18 | |
19 | /* __bb_exit_func() dumps all the basic-block statistics linked into |
20 | the __bb_head chain to .d files. */ |
21 | |
22 | #include <sys/gmon.h> |
23 | #include <sys/gmon_out.h> |
24 | #include <sys/types.h> |
25 | |
26 | #include <stdio.h> |
27 | #include <stdio_ext.h> |
28 | #include <string.h> |
29 | |
30 | #define OUT_NAME "gmon.out" |
31 | |
32 | |
33 | extern struct __bb *__bb_head attribute_hidden; |
34 | |
35 | |
36 | void |
37 | __bb_exit_func (void) |
38 | { |
39 | const int version = GMON_VERSION; |
40 | struct gmon_hdr ghdr; |
41 | struct __bb *ptr; |
42 | FILE *fp; |
43 | fp = fopen (OUT_NAME, "wb" ); |
44 | if (!fp) |
45 | { |
46 | perror (OUT_NAME); |
47 | return; |
48 | } |
49 | /* No threads use this stream. */ |
50 | __fsetlocking (fp, FSETLOCKING_BYCALLER); |
51 | |
52 | memcpy (&ghdr.cookie[0], GMON_MAGIC, 4); |
53 | memcpy (&ghdr.version, &version, sizeof (version)); |
54 | fwrite_unlocked (&ghdr, sizeof (ghdr), 1, fp); |
55 | |
56 | for (ptr = __bb_head; ptr != 0; ptr = ptr->next) |
57 | { |
58 | u_int ncounts = ptr->ncounts; |
59 | u_char tag; |
60 | u_int i; |
61 | |
62 | tag = GMON_TAG_BB_COUNT; |
63 | fwrite_unlocked (&tag, sizeof (tag), 1, fp); |
64 | fwrite_unlocked (&ncounts, sizeof (ncounts), 1, fp); |
65 | |
66 | for (i = 0; i < ncounts; ++i) |
67 | { |
68 | fwrite_unlocked (&ptr->addresses[i], sizeof (ptr->addresses[0]), 1, |
69 | fp); |
70 | fwrite_unlocked (&ptr->counts[i], sizeof (ptr->counts[0]), 1, fp); |
71 | } |
72 | } |
73 | fclose (fp); |
74 | } |
75 | |