callgrind.h revision ed07e00d438c74b7a23c01bfffde77e3968305e4
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Notice that the following BSD-style license applies to this one
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   file (callgrind.h) only.  The rest of Valgrind is licensed under the
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   terms of the GNU General Public License, version 2, unless
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   otherwise indicated.  See the COPYING file in the source
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   distribution for details.
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of callgrind, a valgrind tool for cache simulation
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   and call tree tracing.
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Copyright (C) 2003-2010 Josef Weidendorfer.  All rights reserved.
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Redistribution and use in source and binary forms, with or without
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modification, are permitted provided that the following conditions
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   are met:
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   1. Redistributions of source code must retain the above copyright
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      notice, this list of conditions and the following disclaimer.
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   2. The origin of this software must not be misrepresented; you must
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      not claim that you wrote the original software.  If you use this
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      software in a product, an acknowledgment in the product
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      documentation would be appreciated but is not required.
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   3. Altered source versions must be plainly marked as such, and must
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      not be misrepresented as being the original software.
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   4. The name of the author may not be used to endorse or promote
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      products derived from this software without specific prior written
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      permission.
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Notice that the above BSD-style license applies to this one file
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   (callgrind.h) only.  The entire rest of Valgrind is licensed under
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the terms of the GNU General Public License, version 2.  See the
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   COPYING file in the source distribution for details.
55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
56ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ----------------------------------------------------------------
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef __CALLGRIND_H
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define __CALLGRIND_H
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "valgrind.h"
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* !! ABIWARNING !! ABIWARNING !! ABIWARNING !! ABIWARNING !!
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This enum comprises an ABI exported by Valgrind to programs
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   which use client requests.  DO NOT CHANGE THE ORDER OF THESE
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   ENTRIES, NOR DELETE ANY -- add new ones at the end.
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The identification ('C','T') for Callgrind has historical
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   reasons: it was called "Calltree" before. Besides, ('C','G') would
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   clash with cachegrind.
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   enum {
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__DUMP_STATS = VG_USERREQ_TOOL_BASE('C','T'),
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__ZERO_STATS,
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__TOGGLE_COLLECT,
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__DUMP_STATS_AT,
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__START_INSTRUMENTATION,
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown      VG_USERREQ__STOP_INSTRUMENTATION
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   } Vg_CallgrindClientRequest;
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Dump current state of cost centers, and zero them afterwards */
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALLGRIND_DUMP_STATS                                            \
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {unsigned int _qzz_res;                                              \
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                             \
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            VG_USERREQ__DUMP_STATS,                     \
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            0, 0, 0, 0, 0);                             \
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Dump current state of cost centers, and zero them afterwards.
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The argument is appended to a string stating the reason which triggered
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the dump. This string is written as a description field into the
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   profile data dump. */
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALLGRIND_DUMP_STATS_AT(pos_str)                                \
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {unsigned int _qzz_res;                                              \
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                             \
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            VG_USERREQ__DUMP_STATS_AT,                  \
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            pos_str, 0, 0, 0, 0);                       \
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Zero cost centers */
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALLGRIND_ZERO_STATS                                            \
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {unsigned int _qzz_res;                                              \
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                             \
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            VG_USERREQ__ZERO_STATS,                     \
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            0, 0, 0, 0, 0);                             \
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Toggles collection state.
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The collection state specifies whether the happening of events
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   should be noted or if they are to be ignored. Events are noted
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   by increment of counters in a cost center */
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALLGRIND_TOGGLE_COLLECT                                        \
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {unsigned int _qzz_res;                                              \
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                             \
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            VG_USERREQ__TOGGLE_COLLECT,                 \
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            0, 0, 0, 0, 0);                             \
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Start full callgrind instrumentation if not already switched on.
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   When cache simulation is done, it will flush the simulated cache;
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   this will lead to an artifical cache warmup phase afterwards with
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   cache misses which would not have happened in reality. */
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALLGRIND_START_INSTRUMENTATION                                 \
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {unsigned int _qzz_res;                                              \
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                             \
129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            VG_USERREQ__START_INSTRUMENTATION,          \
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            0, 0, 0, 0, 0);                             \
131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Stop full callgrind instrumentation if not already switched off.
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This flushes Valgrinds translation cache, and does no additional
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   instrumentation afterwards, which effectivly will run at the same
136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   speed as the "none" tool (ie. at minimal slowdown).
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Use this to bypass Callgrind aggregation for uninteresting code parts.
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   To start Callgrind in this mode to ignore the setup phase, use
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   the option "--instr-atstart=no". */
140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CALLGRIND_STOP_INSTRUMENTATION                                  \
141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   {unsigned int _qzz_res;                                              \
142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    VALGRIND_DO_CLIENT_REQUEST(_qzz_res, 0,                             \
143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            VG_USERREQ__STOP_INSTRUMENTATION,           \
144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown                            0, 0, 0, 0, 0);                             \
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   }
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __CALLGRIND_H */
148