mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-09 00:46:12 +00:00
134 lines
5.0 KiB
C
134 lines
5.0 KiB
C
/*--------------------------------------------------------------------*/
|
|
/*--- Callgrind ---*/
|
|
/*--- events.h ---*/
|
|
/*--------------------------------------------------------------------*/
|
|
|
|
/*
|
|
This file is part of Callgrind, a Valgrind tool for call tracing.
|
|
|
|
Copyright (C) 2002-2015, Josef Weidendorfer (Josef.Weidendorfer@gmx.de)
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
|
02111-1307, USA.
|
|
|
|
The GNU General Public License is contained in the file COPYING.
|
|
*/
|
|
|
|
/* Abstractions for 64-bit cost lists (events.h) */
|
|
|
|
#ifndef CLG_EVENTS
|
|
#define CLG_EVENTS
|
|
|
|
#include "pub_tool_basics.h"
|
|
|
|
#define CLG_(str) VGAPPEND(vgCallgrind_,str)
|
|
|
|
/* Event groups consist of one or more named event types.
|
|
* Event sets are constructed from such event groups.
|
|
*
|
|
* Event groups have to be registered globally with a unique ID
|
|
* before they can be used in an event set.
|
|
* A group can appear at most once in a event set.
|
|
*/
|
|
|
|
#define MAX_EVENTGROUP_COUNT 10
|
|
|
|
typedef struct _EventGroup EventGroup;
|
|
struct _EventGroup {
|
|
Int size;
|
|
const HChar* name[0];
|
|
};
|
|
|
|
/* return 0 if event group can not be registered */
|
|
EventGroup* CLG_(register_event_group) (int id, const HChar*);
|
|
EventGroup* CLG_(register_event_group2)(int id, const HChar*, const HChar*);
|
|
EventGroup* CLG_(register_event_group3)(int id, const HChar*, const HChar*,
|
|
const HChar*);
|
|
EventGroup* CLG_(register_event_group4)(int id, const HChar*, const HChar*,
|
|
const HChar*, const HChar*);
|
|
EventGroup* CLG_(get_event_group)(int id);
|
|
|
|
/* Event sets are defined by event groups they consist of. */
|
|
|
|
typedef struct _EventSet EventSet;
|
|
struct _EventSet {
|
|
/* if subset with ID x is in the set, then bit x is set */
|
|
UInt mask;
|
|
Int count;
|
|
Int size;
|
|
Int offset[MAX_EVENTGROUP_COUNT];
|
|
};
|
|
|
|
/* Same event set is returned when requesting same event groups */
|
|
EventSet* CLG_(get_event_set)(Int id);
|
|
EventSet* CLG_(get_event_set2)(Int id1, Int id2);
|
|
EventSet* CLG_(add_event_group)(EventSet*, Int id);
|
|
EventSet* CLG_(add_event_group2)(EventSet*, Int id1, Int id2);
|
|
EventSet* CLG_(add_event_set)(EventSet*, EventSet*);
|
|
|
|
|
|
/* Operations on costs. A cost pointer of 0 means zero cost.
|
|
* Functions ending in _lz allocate cost arrays only when needed
|
|
*/
|
|
ULong* CLG_(get_eventset_cost)(EventSet*);
|
|
/* Set costs of event set to 0 */
|
|
void CLG_(init_cost)(EventSet*,ULong*);
|
|
/* This always allocates counter and sets them to 0 */
|
|
void CLG_(init_cost_lz)(EventSet*,ULong**);
|
|
/* Set costs of an event set to zero */
|
|
void CLG_(zero_cost)(EventSet*,ULong*);
|
|
Bool CLG_(is_zero_cost)(EventSet*,ULong*);
|
|
void CLG_(copy_cost)(EventSet*,ULong* dst, ULong* src);
|
|
void CLG_(copy_cost_lz)(EventSet*,ULong** pdst, ULong* src);
|
|
void CLG_(add_cost)(EventSet*,ULong* dst, ULong* src);
|
|
void CLG_(add_cost_lz)(EventSet*,ULong** pdst, ULong* src);
|
|
/* Adds src to dst and zeros src. Returns false if nothing changed */
|
|
Bool CLG_(add_and_zero_cost)(EventSet*,ULong* dst, ULong* src);
|
|
Bool CLG_(add_and_zero_cost2)(EventSet*,ULong* dst,EventSet*,ULong* src);
|
|
/* Adds difference of new and old to to dst, and set old to new.
|
|
* Returns false if nothing changed */
|
|
Bool CLG_(add_diff_cost)(EventSet*,ULong* dst, ULong* old, ULong* new_cost);
|
|
Bool CLG_(add_diff_cost_lz)(EventSet*,ULong** pdst, ULong* old, ULong* new_cost);
|
|
|
|
/* EventMapping: An ordered subset of events from an event set.
|
|
* This is used to print out part of an EventSet, or in another order.
|
|
*/
|
|
struct EventMappingEntry {
|
|
Int group;
|
|
Int index;
|
|
Int offset;
|
|
};
|
|
typedef struct _EventMapping EventMapping;
|
|
struct _EventMapping {
|
|
EventSet* es;
|
|
Int size;
|
|
Int capacity;
|
|
struct EventMappingEntry entry[0];
|
|
};
|
|
|
|
/* Allocate space for an event mapping */
|
|
EventMapping* CLG_(get_eventmapping)(EventSet*);
|
|
void CLG_(append_event)(EventMapping*, const HChar*);
|
|
/* Returns event mapping as a character string. That string is dynamically
|
|
allocated and it is the caller's responsibility to free it.
|
|
The function never returns NULL. */
|
|
HChar *CLG_(eventmapping_as_string)(const EventMapping*);
|
|
/* Returns mapping cost as a character string. That string is dynamically
|
|
allocated and it is the caller's responsibility to free it.
|
|
The function never returns NULL. */
|
|
HChar *CLG_(mappingcost_as_string)(const EventMapping*, const ULong*);
|
|
|
|
#endif /* CLG_EVENTS */
|