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