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