]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/services/profile/gprof/v2_0/include/gmon_out.h
Initial revision
[karo-tx-redboot.git] / packages / services / profile / gprof / v2_0 / include / gmon_out.h
1 // Slightly adapted from OpenBSD "/src/gnu/usr.bin/binutils/gprof/gmon_out.h"
2 // for eCos environment
3
4 /*
5  * This file specifies the format of gmon.out files.  It should have
6  * as few external dependencies as possible as it is going to be
7  * included in many different programs.  That is, minimize the
8  * number of #include's.
9  *
10  * A gmon.out file consists of a header (defined by gmon_hdr) followed
11  * by a sequence of records.  Each record starts with a one-byte tag
12  * identifying the type of records, followed by records specific data.
13  */
14 #ifndef gmon_out_h
15 #define gmon_out_h
16
17 #include <cyg/infra/cyg_type.h>
18
19 #define GMON_MAGIC      "gmon"  /* magic cookie */
20 #define GMON_VERSION    1       /* version number */
21
22 /*
23  * Raw header as it appears on file (without padding):
24  */
25 struct gmon_hdr
26 {
27     char cookie[4];
28     char version[4];    // a cyg_uint32, target-side endianness
29     char spare[3 * 4];
30 };
31
32 /* types of records in this file: */
33 typedef enum
34 {
35     GMON_TAG_TIME_HIST = 0, GMON_TAG_CG_ARC = 1, GMON_TAG_BB_COUNT = 2
36 }
37 GMON_Record_Tag;
38
39 /* The histogram tag is followed by this header, and then an array of       */
40 /* cyg_uint16's for the actual counts.                                      */
41
42 struct gmon_hist_hdr
43 {
44     /* host-side gprof adapts to sizeof(void*) and endianness.              */
45     /* It is assumed that the compiler does not insert padding around the   */
46     /* cyg_uint32's or the char arrays.                                     */
47     void*       low_pc;             /* base pc address of sample buffer     */
48     void*       high_pc;            /* max pc address of sampled buffer     */
49     cyg_uint32  hist_size;          /* size of sample buffer                */
50     cyg_uint32  prof_rate;          /* profiling clock rate                 */
51     char        dimen[15];                      /* phys. dim., usually "seconds"        */
52     char        dimen_abbrev;           /* usually 's' for "seconds"            */
53 };
54
55 /* An arc tag is followed by a single arc record. self_pc corresponds to    */
56 /* the location of an mcount() call, at the start of a function. from_pc    */
57 /* corresponds to the return address, i.e. where the function was called    */
58 /* from. count is the number of calls.                                      */
59
60 struct gmon_cg_arc_record
61 {
62     void*       from_pc;            /* address within caller's body         */
63     void*       self_pc;                /* address within callee's body         */
64     cyg_uint32  count;              /* number of arc traversals             */
65 };
66
67 /* In theory gprof can also process basic block counts, as per the          */
68 /* compiler's -fprofile-arcs flag. The compiler-generated basic block       */
69 /* structure should contain a table of addresses and a table of counts,     */
70 /* and the compiled code updates those counts. Current versions of the      */
71 /* compiler (~3.2.1) do not output the table of addresses, and without      */
72 /* that table gprof cannot process the counts. Possibly gprof should read   */
73 /* in the .bb and .bbg files generated for gcov processing, but that does   */
74 /* not happen at the moment.                                                */
75 /*                                                                          */
76 /* So for now gmon.out does not contain basic block counts and gprof        */
77 /* operations that depend on it, e.g. --annotated-source, won't work.       */
78
79 #endif /* gmon_out_h */