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