• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
48 typedef struct _EventGroup EventGroup;
49 struct _EventGroup {
50     Int size;
51     Char* name[0];
52 };
53 
54 /* return 0 if event group can not be registered */
55 EventGroup* CLG_(register_event_group) (int id, Char*);
56 EventGroup* CLG_(register_event_group2)(int id, Char*, Char*);
57 EventGroup* CLG_(register_event_group3)(int id, Char*, Char*, Char*);
58 EventGroup* CLG_(register_event_group4)(int id, Char*, Char*, Char*, Char*);
59 EventGroup* CLG_(get_event_group)(int id);
60 
61 /* Event sets are defined by event groups they consist of. */
62 
63 typedef struct _EventSet EventSet;
64 struct _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 */
73 EventSet* CLG_(get_event_set)(Int id);
74 EventSet* CLG_(get_event_set2)(Int id1, Int id2);
75 EventSet* CLG_(get_event_set3)(Int id1, Int id2, Int id3);
76 EventSet* CLG_(add_event_group)(EventSet*, Int id);
77 EventSet* CLG_(add_event_group2)(EventSet*, Int id1, Int id2);
78 EventSet* CLG_(add_event_set)(EventSet*, EventSet*);
79 /* Writes event names into buf. Returns number of characters written */
80 Int 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  */
86 ULong* CLG_(get_eventset_cost)(EventSet*);
87 /* Set costs of event set to 0 */
88 void CLG_(init_cost)(EventSet*,ULong*);
89 /* This always allocates counter and sets them to 0 */
90 void CLG_(init_cost_lz)(EventSet*,ULong**);
91 /* Set costs of an event set to zero */
92 void CLG_(zero_cost)(EventSet*,ULong*);
93 Bool CLG_(is_zero_cost)(EventSet*,ULong*);
94 Bool CLG_(is_equal_cost)(EventSet*,ULong*,ULong*);
95 void CLG_(copy_cost)(EventSet*,ULong* dst, ULong* src);
96 void CLG_(copy_cost_lz)(EventSet*,ULong** pdst, ULong* src);
97 void CLG_(add_cost)(EventSet*,ULong* dst, ULong* src);
98 void CLG_(add_cost_lz)(EventSet*,ULong** pdst, ULong* src);
99 /* Adds src to dst and zeros src. Returns false if nothing changed */
100 Bool CLG_(add_and_zero_cost)(EventSet*,ULong* dst, ULong* src);
101 Bool 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 */
104 Bool CLG_(add_diff_cost)(EventSet*,ULong* dst, ULong* old, ULong* new_cost);
105 Bool CLG_(add_diff_cost_lz)(EventSet*,ULong** pdst, ULong* old, ULong* new_cost);
106 /* Returns number of characters written */
107 Int 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  */
112 struct EventMappingEntry {
113     Int group;
114     Int index;
115     Int offset;
116 };
117 typedef struct _EventMapping EventMapping;
118 struct _EventMapping {
119   EventSet* es;
120   Int size;
121   Int capacity;
122   struct EventMappingEntry entry[0];
123 };
124 
125 /* Allocate space for an event mapping */
126 EventMapping* CLG_(get_eventmapping)(EventSet*);
127 void CLG_(append_event)(EventMapping*, Char*);
128 /* Returns number of characters written */
129 Int CLG_(sprint_eventmapping)(Char* buf, EventMapping*);
130 /* Returns number of characters written */
131 Int CLG_(sprint_mappingcost)(Char* buf, EventMapping*, ULong*);
132 
133 #endif /* CLG_EVENTS */
134