Home | History | Annotate | Download | only in callgrind
      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-2013, Josef Weidendorfer (Josef.Weidendorfer (at) 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     const HChar* name[0];
     52 };
     53 
     54 /* return 0 if event group can not be registered */
     55 EventGroup* CLG_(register_event_group) (int id, const HChar*);
     56 EventGroup* CLG_(register_event_group2)(int id, const HChar*, const HChar*);
     57 EventGroup* CLG_(register_event_group3)(int id, const HChar*, const HChar*,
     58                                         const HChar*);
     59 EventGroup* CLG_(register_event_group4)(int id, const HChar*, const HChar*,
     60                                         const HChar*, const HChar*);
     61 EventGroup* CLG_(get_event_group)(int id);
     62 
     63 /* Event sets are defined by event groups they consist of. */
     64 
     65 typedef struct _EventSet EventSet;
     66 struct _EventSet {
     67     /* if subset with ID x is in the set, then bit x is set */
     68     UInt mask;
     69     Int count;
     70     Int size;
     71     Int offset[MAX_EVENTGROUP_COUNT];
     72  };
     73 
     74 /* Same event set is returned when requesting same event groups */
     75 EventSet* CLG_(get_event_set)(Int id);
     76 EventSet* CLG_(get_event_set2)(Int id1, Int id2);
     77 EventSet* CLG_(get_event_set3)(Int id1, Int id2, Int id3);
     78 EventSet* CLG_(add_event_group)(EventSet*, Int id);
     79 EventSet* CLG_(add_event_group2)(EventSet*, Int id1, Int id2);
     80 EventSet* CLG_(add_event_set)(EventSet*, EventSet*);
     81 /* Writes event names into buf. Returns number of characters written */
     82 Int CLG_(sprint_eventset)(HChar* buf, EventSet*);
     83 
     84 
     85 /* Operations on costs. A cost pointer of 0 means zero cost.
     86  * Functions ending in _lz allocate cost arrays only when needed
     87  */
     88 ULong* CLG_(get_eventset_cost)(EventSet*);
     89 /* Set costs of event set to 0 */
     90 void CLG_(init_cost)(EventSet*,ULong*);
     91 /* This always allocates counter and sets them to 0 */
     92 void CLG_(init_cost_lz)(EventSet*,ULong**);
     93 /* Set costs of an event set to zero */
     94 void CLG_(zero_cost)(EventSet*,ULong*);
     95 Bool CLG_(is_zero_cost)(EventSet*,ULong*);
     96 Bool CLG_(is_equal_cost)(EventSet*,ULong*,ULong*);
     97 void CLG_(copy_cost)(EventSet*,ULong* dst, ULong* src);
     98 void CLG_(copy_cost_lz)(EventSet*,ULong** pdst, ULong* src);
     99 void CLG_(add_cost)(EventSet*,ULong* dst, ULong* src);
    100 void CLG_(add_cost_lz)(EventSet*,ULong** pdst, ULong* src);
    101 /* Adds src to dst and zeros src. Returns false if nothing changed */
    102 Bool CLG_(add_and_zero_cost)(EventSet*,ULong* dst, ULong* src);
    103 Bool CLG_(add_and_zero_cost2)(EventSet*,ULong* dst,EventSet*,ULong* src);
    104 /* Adds difference of new and old to to dst, and set old to new.
    105  * Returns false if nothing changed */
    106 Bool CLG_(add_diff_cost)(EventSet*,ULong* dst, ULong* old, ULong* new_cost);
    107 Bool CLG_(add_diff_cost_lz)(EventSet*,ULong** pdst, ULong* old, ULong* new_cost);
    108 /* Returns number of characters written */
    109 Int CLG_(sprint_cost)(HChar* buf, EventSet*, ULong*);
    110 
    111 /* EventMapping: An ordered subset of events from an event set.
    112  * This is used to print out part of an EventSet, or in another order.
    113  */
    114 struct EventMappingEntry {
    115     Int group;
    116     Int index;
    117     Int offset;
    118 };
    119 typedef struct _EventMapping EventMapping;
    120 struct _EventMapping {
    121   EventSet* es;
    122   Int size;
    123   Int capacity;
    124   struct EventMappingEntry entry[0];
    125 };
    126 
    127 /* Allocate space for an event mapping */
    128 EventMapping* CLG_(get_eventmapping)(EventSet*);
    129 void CLG_(append_event)(EventMapping*, const HChar*);
    130 /* Returns number of characters written */
    131 Int CLG_(sprint_eventmapping)(HChar* buf, EventMapping*);
    132 /* Returns number of characters written */
    133 Int CLG_(sprint_mappingcost)(HChar* buf, EventMapping*, ULong*);
    134 
    135 #endif /* CLG_EVENTS */
    136