1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--- Callgrind                                                    ---*/
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*---                                                     events.h ---*/
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*--------------------------------------------------------------------*/
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/*
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This file is part of Callgrind, a Valgrind tool for call tracing.
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2002-2013, Josef Weidendorfer (Josef.Weidendorfer@gmx.de)
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is free software; you can redistribute it and/or
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   modify it under the terms of the GNU General Public License as
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   published by the Free Software Foundation; either version 2 of the
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   License, or (at your option) any later version.
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   This program is distributed in the hope that it will be useful, but
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   WITHOUT ANY WARRANTY; without even the implied warranty of
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   General Public License for more details.
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   You should have received a copy of the GNU General Public License
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   along with this program; if not, write to the Free Software
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   02111-1307, USA.
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   The GNU General Public License is contained in the file COPYING.
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown*/
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Abstractions for 64-bit cost lists (events.h) */
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef CLG_EVENTS
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_EVENTS
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "pub_tool_basics.h"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define CLG_(str) VGAPPEND(vgCallgrind_,str)
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Event groups consist of one or more named event types.
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Event sets are constructed from such event groups.
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown *
41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Event groups have to be registered globally with a unique ID
42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * before they can be used in an event set.
43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * A group can appear at most once in a event set.
44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define MAX_EVENTGROUP_COUNT 10
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
48ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _EventGroup EventGroup;
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _EventGroup {
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int size;
51436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    const HChar* name[0];
52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* return 0 if event group can not be registered */
55436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovEventGroup* CLG_(register_event_group) (int id, const HChar*);
56436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovEventGroup* CLG_(register_event_group2)(int id, const HChar*, const HChar*);
57436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovEventGroup* CLG_(register_event_group3)(int id, const HChar*, const HChar*,
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        const HChar*);
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovEventGroup* CLG_(register_event_group4)(int id, const HChar*, const HChar*,
60436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        const HChar*, const HChar*);
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventGroup* CLG_(get_event_group)(int id);
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Event sets are defined by event groups they consist of. */
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _EventSet EventSet;
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _EventSet {
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    /* if subset with ID x is in the set, then bit x is set */
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    UInt mask;
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int count;
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int size;
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int offset[MAX_EVENTGROUP_COUNT];
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown };
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Same event set is returned when requesting same event groups */
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventSet* CLG_(get_event_set)(Int id);
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventSet* CLG_(get_event_set2)(Int id1, Int id2);
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventSet* CLG_(get_event_set3)(Int id1, Int id2, Int id3);
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventSet* CLG_(add_event_group)(EventSet*, Int id);
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventSet* CLG_(add_event_group2)(EventSet*, Int id1, Int id2);
80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventSet* CLG_(add_event_set)(EventSet*, EventSet*);
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Writes event names into buf. Returns number of characters written */
82436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt CLG_(sprint_eventset)(HChar* buf, EventSet*);
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Operations on costs. A cost pointer of 0 means zero cost.
86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Functions ending in _lz allocate cost arrays only when needed
87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong* CLG_(get_eventset_cost)(EventSet*);
89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Set costs of event set to 0 */
90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_cost)(EventSet*,ULong*);
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This always allocates counter and sets them to 0 */
92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(init_cost_lz)(EventSet*,ULong**);
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Set costs of an event set to zero */
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(zero_cost)(EventSet*,ULong*);
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(is_zero_cost)(EventSet*,ULong*);
96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(is_equal_cost)(EventSet*,ULong*,ULong*);
97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_cost)(EventSet*,ULong* dst, ULong* src);
98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(copy_cost_lz)(EventSet*,ULong** pdst, ULong* src);
99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(add_cost)(EventSet*,ULong* dst, ULong* src);
100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownvoid CLG_(add_cost_lz)(EventSet*,ULong** pdst, ULong* src);
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Adds src to dst and zeros src. Returns false if nothing changed */
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(add_and_zero_cost)(EventSet*,ULong* dst, ULong* src);
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(add_and_zero_cost2)(EventSet*,ULong* dst,EventSet*,ULong* src);
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Adds difference of new and old to to dst, and set old to new.
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Returns false if nothing changed */
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(add_diff_cost)(EventSet*,ULong* dst, ULong* old, ULong* new_cost);
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownBool CLG_(add_diff_cost_lz)(EventSet*,ULong** pdst, ULong* old, ULong* new_cost);
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Returns number of characters written */
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt CLG_(sprint_cost)(HChar* buf, EventSet*, ULong*);
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* EventMapping: An ordered subset of events from an event set.
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This is used to print out part of an EventSet, or in another order.
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct EventMappingEntry {
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int group;
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int index;
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    Int offset;
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct _EventMapping EventMapping;
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct _EventMapping {
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  EventSet* es;
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Int size;
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  Int capacity;
124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown  struct EventMappingEntry entry[0];
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown};
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Allocate space for an event mapping */
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownEventMapping* CLG_(get_eventmapping)(EventSet*);
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovvoid CLG_(append_event)(EventMapping*, const HChar*);
130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Returns number of characters written */
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt CLG_(sprint_eventmapping)(HChar* buf, EventMapping*);
132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* Returns number of characters written */
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovInt CLG_(sprint_mappingcost)(HChar* buf, EventMapping*, ULong*);
134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* CLG_EVENTS */
136