Callgrind merge: code


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5780 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/callgrind/events.h b/callgrind/events.h
new file mode 100644
index 0000000..d2cad1e
--- /dev/null
+++ b/callgrind/events.h
@@ -0,0 +1,113 @@
+/*--------------------------------------------------------------------*/
+/*--- Callgrind                                                    ---*/
+/*---                                                     events.h ---*/
+/*--- (C) 2004-2005, Josef Weidendorfer                            ---*/
+/*--------------------------------------------------------------------*/
+
+
+/* Abstractions for 64-bit cost lists (events.h) */
+
+#ifndef CG_EVENTS
+#define CG_EVENTS
+
+#include "pub_tool_basics.h"
+
+#define CLG_(str) VGAPPEND(vgCallgrind_,str)
+
+/* An event type */
+typedef struct _EventType EventType;
+struct _EventType {
+  Char* name;
+  Char* description;
+  Int id;
+};
+
+EventType* CLG_(register_eventtype)(Char*);
+EventType* CLG_(get_eventtype)(Char*);
+EventType* CLG_(get_eventtype_byindex)(Int id);
+
+/* An event set is a ordered list of event types, which comes down
+ * to some description for ordered lists of costs.
+ * Often, costs of 2 event types are related, e.g. one is always smaller
+ * than the other. This is useful to speed up arithmetics on cost lists:
+ * Each event type in the set has a <nextTop>. All indexes before are
+ * promised to hold smaller values than the current.
+ */
+typedef struct _EventSetEntry EventSetEntry;
+struct _EventSetEntry {
+  EventType* type;
+  Int nextTop;
+};
+typedef struct _EventSet EventSet;
+struct _EventSet {
+  Char* name;
+  Int size;
+  Int capacity;
+  EventSetEntry e[0];
+};
+
+
+/* Some events out of an event set.
+ * Used to print out part of an EventSet, or in another order.
+ */
+typedef struct _EventMapping EventMapping;
+struct _EventMapping {
+  EventSet* set;
+  Int size;
+  Int capacity;
+  Int index[0];
+};
+
+  
+/* Allocate space for an event set */
+EventSet* CLG_(get_eventset)(Char* n, Int capacity);
+/* Incorporate a event type into a set, get start offset */
+Int CLG_(add_eventtype)(EventSet* dst, EventType*);
+/* Incorporate event types into a set, with ... < second < first */
+Int CLG_(add_dep_event2)(EventSet* dst, EventType* e1, EventType* e2);
+Int CLG_(add_dep_event3)(EventSet* dst,
+			EventType* e1, EventType* e2, EventType* e3);
+Int CLG_(add_dep_event4)(EventSet* dst,
+			EventType* e1, EventType* e2, EventType* e3,
+			EventType* e4);
+/* Incorporate one event set into another, get start offset */
+Int CLG_(add_eventset)(EventSet* dst, EventSet* src);
+/* Returns number of characters written */
+Int CLG_(sprint_eventset)(Char* buf, EventSet*);
+/* Allocate cost array for an event set */
+ULong* CLG_(get_eventset_cost)(EventSet*);
+
+/* Operations on costs. A cost pointer of 0 means zero cost.
+ * Functions ending in _lz allocate costs lazy if needed
+ */
+/* Set costs according full capacity 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*);
+Bool CLG_(is_equal_cost)(EventSet*,ULong*,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_cost_lz)(EventSet*,ULong** pdst, 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);
+Bool CLG_(add_diff_cost_lz)(EventSet*,ULong** pdst, ULong* old, ULong* new);
+/* Returns number of characters written */
+Int CLG_(sprint_cost)(Char* buf, EventSet*, ULong*);
+
+/* Allocate space for an event mapping */
+EventMapping* CLG_(get_eventmapping)(EventSet*);
+void CLG_(append_event)(EventMapping*, Char*);
+/* Returns number of characters written */
+Int CLG_(sprint_eventmapping)(Char* buf, EventMapping*);
+/* Returns number of characters written */
+Int CLG_(sprint_mappingcost)(Char* buf, EventMapping*, ULong*);
+
+#endif /* CG_EVENTS */