1a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/
2a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Callgrind                                                    ---*/
3a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*---                                                     events.c ---*/
4a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/
5a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
6a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*
7a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   This file is part of Callgrind, a Valgrind tool for call tracing.
8a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
9b3a1e4bffbdbbf38304f216af405009868f43628sewardj   Copyright (C) 2002-2015, Josef Weidendorfer (Josef.Weidendorfer@gmx.de)
10a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
11a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   This program is free software; you can redistribute it and/or
12a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   modify it under the terms of the GNU General Public License as
13a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   published by the Free Software Foundation; either version 2 of the
14a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   License, or (at your option) any later version.
15a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
16a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   This program is distributed in the hope that it will be useful, but
17a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   WITHOUT ANY WARRANTY; without even the implied warranty of
18a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   General Public License for more details.
20a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
21a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   You should have received a copy of the GNU General Public License
22a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   along with this program; if not, write to the Free Software
23a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   02111-1307, USA.
25a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
26a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   The GNU General Public License is contained in the file COPYING.
27a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo*/
28a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
29a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "global.h"
30a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
315bba5258a193d980fb116a8b04f96dc16d96aacfweidendo/* This should be 2**MAX_EVENTGROUP_COUNT */
325bba5258a193d980fb116a8b04f96dc16d96aacfweidendo#define MAX_EVENTSET_COUNT 1024
33a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
345bba5258a193d980fb116a8b04f96dc16d96aacfweidendostatic EventGroup* eventGroup[MAX_EVENTGROUP_COUNT];
355bba5258a193d980fb116a8b04f96dc16d96aacfweidendostatic EventSet* eventSetTable[MAX_EVENTSET_COUNT];
365bba5258a193d980fb116a8b04f96dc16d96aacfweidendostatic Bool eventSets_initialized = 0;
37a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
385bba5258a193d980fb116a8b04f96dc16d96aacfweidendostatic
395bba5258a193d980fb116a8b04f96dc16d96aacfweidendovoid initialize_event_sets(void)
40a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
415bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
42a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
435bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (eventSets_initialized) return;
44a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
455bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i< MAX_EVENTGROUP_COUNT; i++)
465bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	eventGroup[i] = 0;
47a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
485bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i< MAX_EVENTSET_COUNT; i++)
4919f91bbaedb4caef8a60ce94b0f507193cc0bc10florian	eventSetTable[i] = 0;
50a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
515bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eventSets_initialized = 1;
525bba5258a193d980fb116a8b04f96dc16d96aacfweidendo }
53a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
545bba5258a193d980fb116a8b04f96dc16d96aacfweidendostatic
555bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventGroup* new_event_group(int id, int n)
56a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
575bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg;
585bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
595bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    initialize_event_sets();
60a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
615bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id>=0 && id<MAX_EVENTGROUP_COUNT);
625bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(eventGroup[id]==0);
635bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
645bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg = (EventGroup*) CLG_MALLOC("cl.events.group.1",
6519f91bbaedb4caef8a60ce94b0f507193cc0bc10florian				  sizeof(EventGroup) + n * sizeof(HChar*));
665bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->size = n;
675bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eventGroup[id] = eg;
685bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eg;
69a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
70a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
7125f6c57962b259a52e3e617eb96fa14d6fdbe364florianEventGroup* CLG_(register_event_group) (int id, const HChar* n1)
72a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
735bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg = new_event_group(id, 1);
745bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[0] = n1;
755bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
765bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eg;
77a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
78a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
7925f6c57962b259a52e3e617eb96fa14d6fdbe364florianEventGroup* CLG_(register_event_group2)(int id, const HChar* n1,
8025f6c57962b259a52e3e617eb96fa14d6fdbe364florian                                        const HChar* n2)
81a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
825bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg = new_event_group(id, 2);
835bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[0] = n1;
845bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[1] = n2;
85a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
865bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eg;
87a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
88a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
8925f6c57962b259a52e3e617eb96fa14d6fdbe364florianEventGroup* CLG_(register_event_group3)(int id, const HChar* n1,
9025f6c57962b259a52e3e617eb96fa14d6fdbe364florian                                        const HChar* n2, const HChar* n3)
91a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
925bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg = new_event_group(id, 3);
935bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[0] = n1;
945bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[1] = n2;
955bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[2] = n3;
96a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
975bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eg;
98a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
99a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
10025f6c57962b259a52e3e617eb96fa14d6fdbe364florianEventGroup* CLG_(register_event_group4)(int id, const HChar* n1,
10125f6c57962b259a52e3e617eb96fa14d6fdbe364florian                                        const HChar* n2, const HChar* n3,
10225f6c57962b259a52e3e617eb96fa14d6fdbe364florian                                        const HChar* n4)
103a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
1045bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg = new_event_group(id, 4);
1055bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[0] = n1;
1065bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[1] = n2;
1075bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[2] = n3;
1085bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eg->name[3] = n4;
109a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1105bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eg;
1115bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}
112a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1135bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventGroup* CLG_(get_event_group)(int id)
1145bba5258a193d980fb116a8b04f96dc16d96aacfweidendo{
1155bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id>=0 && id<MAX_EVENTGROUP_COUNT);
1165bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
1175bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eventGroup[id];
118a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
119a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1205bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
1215bba5258a193d980fb116a8b04f96dc16d96aacfweidendostatic
1225bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventSet* eventset_from_mask(UInt mask)
123a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
1245bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventSet* es;
1255bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i, count, offset;
126a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1275bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (mask >= MAX_EVENTSET_COUNT) return 0;
128a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1295bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    initialize_event_sets();
1305bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (eventSetTable[mask]) return eventSetTable[mask];
1315bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
1325bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    es = (EventSet*) CLG_MALLOC("cl.events.eventset.1", sizeof(EventSet));
1335bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    es->mask = mask;
1345bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
1355bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    offset = 0;
1365bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    count = 0;
1375bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0;i<MAX_EVENTGROUP_COUNT;i++) {
1385bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	es->offset[i] = offset;
1395bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if ( ((mask & (1u<<i))==0) || (eventGroup[i]==0))
1405bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    continue;
1415bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
1425bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	offset += eventGroup[i]->size;
1435bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	count++;
1445bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    }
1455bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    es->size = offset;
1465bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    es->count = count;
1475bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
1485bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    eventSetTable[mask] = es;
1495bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return es;
150a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
151a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1525bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventSet* CLG_(get_event_set)(Int id)
153a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
1545bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id>=0 && id<MAX_EVENTGROUP_COUNT);
1555bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eventset_from_mask(1u << id);
1565bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}
157a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1585bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventSet* CLG_(get_event_set2)(Int id1, Int id2)
1595bba5258a193d980fb116a8b04f96dc16d96aacfweidendo{
1605bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id1>=0 && id1<MAX_EVENTGROUP_COUNT);
1615bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id2>=0 && id2<MAX_EVENTGROUP_COUNT);
1625bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eventset_from_mask((1u << id1) | (1u << id2));
1635bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}
164a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1655bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventSet* CLG_(add_event_group)(EventSet* es, Int id)
166a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
1675bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id>=0 && id<MAX_EVENTGROUP_COUNT);
1685bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!es) es = eventset_from_mask(0);
1695bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eventset_from_mask(es->mask | (1u << id));
1705bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}
171a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1725bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventSet* CLG_(add_event_group2)(EventSet* es, Int id1, Int id2)
1735bba5258a193d980fb116a8b04f96dc16d96aacfweidendo{
1745bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id1>=0 && id1<MAX_EVENTGROUP_COUNT);
1755bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(id2>=0 && id2<MAX_EVENTGROUP_COUNT);
1765bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!es) es = eventset_from_mask(0);
1775bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eventset_from_mask(es->mask | (1u << id1) | (1u << id2));
1785bba5258a193d980fb116a8b04f96dc16d96aacfweidendo}
179a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1805bba5258a193d980fb116a8b04f96dc16d96aacfweidendoEventSet* CLG_(add_event_set)(EventSet* es1, EventSet* es2)
1815bba5258a193d980fb116a8b04f96dc16d96aacfweidendo{
1825bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!es1) es1 = eventset_from_mask(0);
1835bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!es2) es2 = eventset_from_mask(0);
1845bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return eventset_from_mask(es1->mask | es2->mask);
185a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
186a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1875bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
188a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Get cost array for an event set */
189a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoULong* CLG_(get_eventset_cost)(EventSet* es)
190a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
1915bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return CLG_(get_costarray)(es->size);
192a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
193a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
194a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Set all costs of an event set to zero */
195a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_cost)(EventSet* es, ULong* cost)
196a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
1975bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
198a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
1995bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!cost) return;
200a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2015bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++)
2025bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	cost[i] = 0;
203a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
204a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
205a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Set all costs of an event set to zero */
206a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(init_cost_lz)(EventSet* es, ULong** cost)
207a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2085bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
209a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2105bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(cost != 0);
2115bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!(*cost))
2125bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	*cost = CLG_(get_eventset_cost)(es);
213a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2145bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++)
2155bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	(*cost)[i] = 0;
216a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
217a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
218a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(zero_cost)(EventSet* es, ULong* cost)
219a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2205bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
221a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2225bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!cost) return;
223a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2245bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0;i<es->size;i++)
2255bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	cost[i] = 0;
226a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
227a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
228a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBool CLG_(is_zero_cost)(EventSet* es, ULong* cost)
229a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2305bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
231a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2325bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!cost) return True;
233a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2345bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++)
2355bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (cost[i] != 0) return False;
2365bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
2375bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return True;
238a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
239a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
240a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_cost)(EventSet* es, ULong* dst, ULong* src)
241a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2425bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
243a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2445bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!src) {
2455bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	CLG_(zero_cost)(es, dst);
2465bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	return;
2475bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    }
2485bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(dst != 0);
249a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2505bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0;i<es->size;i++)
2515bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] = src[i];
252a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
253a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
254a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(copy_cost_lz)(EventSet* es, ULong** pdst, ULong* src)
255a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2565bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
2575bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    ULong* dst;
258a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2595bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(pdst != 0);
260a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2615bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!src) {
2625bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	CLG_(zero_cost)(es, *pdst);
2635bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	return;
2645bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    }
2655bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    dst = *pdst;
2665bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!dst)
2675bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst = *pdst = CLG_(get_eventset_cost)(es);
268a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2695bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0;i<es->size;i++)
2705bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] = src[i];
271a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
272a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
273a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(add_cost)(EventSet* es, ULong* dst, ULong* src)
274a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2755bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
276a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2775bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!src) return;
2785bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(dst != 0);
279a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
2805bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++)
2815bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] += src[i];
282a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
283a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
284a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(add_cost_lz)(EventSet* es, ULong** pdst, ULong* src)
285a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
2865bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
2875bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    ULong* dst;
2885bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
2895bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!src) return;
2905bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(pdst != 0);
2915bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
2925bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    dst = *pdst;
2935bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!dst) {
2945bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst = *pdst = CLG_(get_eventset_cost)(es);
2955bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	CLG_(copy_cost)(es, dst, src);
2965bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	return;
297a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
2985bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
2995bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++)
3005bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] += src[i];
301a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
302a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
303a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Adds src to dst and zeros src. Returns false if nothing changed */
304a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBool CLG_(add_and_zero_cost)(EventSet* es, ULong* dst, ULong* src)
305a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
3065bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
3075bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Bool is_nonzero = False;
308a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3095bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT((es != 0) && (dst != 0));
3105bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!src) return False;
311a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3125bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++) {
3135bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (src[i]==0) continue;
3145bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] += src[i];
3155bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	src[i] = 0;
3165bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	is_nonzero = True;
317a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
318a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3195bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return is_nonzero;
320a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
321a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
322a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Adds src to dst and zeros src. Returns false if nothing changed */
3235bba5258a193d980fb116a8b04f96dc16d96aacfweidendoBool CLG_(add_and_zero_cost2)(EventSet* esDst, ULong* dst,
3245bba5258a193d980fb116a8b04f96dc16d96aacfweidendo			      EventSet* esSrc, ULong* src)
3255bba5258a193d980fb116a8b04f96dc16d96aacfweidendo{
3265bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i,j;
3275bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Bool is_nonzero = False;
3285bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    UInt mask;
3295bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup *eg;
3305bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    ULong *egDst, *egSrc;
3315bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3325bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT((esDst != 0) && (dst != 0) && (esSrc != 0));
3335bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!src) return False;
3345bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3355bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0, mask=1; i<MAX_EVENTGROUP_COUNT; i++, mask=mask<<1) {
3365bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if ((esSrc->mask & mask)==0) continue;
3375bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (eventGroup[i] ==0) continue;
3385bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3395bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	/* if src has a subset, dst must have, too */
3405bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	CLG_ASSERT((esDst->mask & mask)>0);
3415bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	eg = eventGroup[i];
3425bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	egSrc = src + esSrc->offset[i];
3435bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	egDst = dst + esDst->offset[i];
3445bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	for(j=0; j<eg->size; j++) {
3455bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    if (egSrc[j]==0) continue;
3465bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    egDst[j] += egSrc[j];
3475bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    egSrc[j] = 0;
3485bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    is_nonzero = True;
3495bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	}
350a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
351a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3525bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return is_nonzero;
353a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
354a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3555bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3565bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
357a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Adds difference of new and old to dst, and set old to new.
358a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Returns false if nothing changed */
3590b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendoBool CLG_(add_diff_cost)(EventSet* es, ULong* dst, ULong* old, ULong* new_cost)
360a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
3615bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
3625bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Bool is_nonzero = False;
363a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3645bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT((es != 0) && (dst != 0));
3655bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(old && new_cost);
3665bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3675bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++) {
3685bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (new_cost[i] == old[i]) continue;
3695bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] += new_cost[i] - old[i];
3705bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	old[i] = new_cost[i];
3715bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	is_nonzero = True;
372a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
373a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3745bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return is_nonzero;
375a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
376a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3775bba5258a193d980fb116a8b04f96dc16d96aacfweidendoBool CLG_(add_diff_cost_lz)(EventSet* es, ULong** pdst, ULong* old, ULong* new_cost)
3785bba5258a193d980fb116a8b04f96dc16d96aacfweidendo{
3795bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i;
3805bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    ULong* dst;
3815bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Bool is_nonzero = False;
3825bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3835bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT((es != 0) && (pdst != 0));
3845bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(old && new_cost);
3855bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3865bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    dst = *pdst;
3875bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    if (!dst) {
3885bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst = *pdst = CLG_(get_eventset_cost)(es);
3895bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	CLG_(zero_cost)(es, dst);
390a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
391a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
3925bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i<es->size; i++) {
3935bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (new_cost[i] == old[i]) continue;
3945bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	dst[i] += new_cost[i] - old[i];
3955bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	old[i] = new_cost[i];
3965bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	is_nonzero = True;
3975bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    }
3985bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
3995bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return is_nonzero;
400a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
401a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4025bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
403a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Allocate space for an event mapping */
404a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoEventMapping* CLG_(get_eventmapping)(EventSet* es)
405a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
4065bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventMapping* em;
407a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4085bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(es != 0);
409a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4105bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    em = (EventMapping*) CLG_MALLOC("cl.events.geMapping.1",
4115bba5258a193d980fb116a8b04f96dc16d96aacfweidendo				    sizeof(EventMapping) +
4125bba5258a193d980fb116a8b04f96dc16d96aacfweidendo				    sizeof(struct EventMappingEntry) *
4135bba5258a193d980fb116a8b04f96dc16d96aacfweidendo				    es->size);
4145bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    em->capacity = es->size;
4155bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    em->size = 0;
4165bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    em->es = es;
417a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4185bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    return em;
419a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
420a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
42125f6c57962b259a52e3e617eb96fa14d6fdbe364florianvoid CLG_(append_event)(EventMapping* em, const HChar* n)
422a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
4235bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    Int i, j, offset = 0;
4245bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    UInt mask;
4255bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg;
4265bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
4275bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(em != 0);
4285bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0, mask=1; i<MAX_EVENTGROUP_COUNT; i++, mask=mask<<1) {
4295bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if ((em->es->mask & mask)==0) continue;
4305bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (eventGroup[i] ==0) continue;
4315bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
4325bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	eg = eventGroup[i];
4335bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	for(j=0; j<eg->size; j++, offset++) {
4345bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    if (VG_(strcmp)(n, eg->name[j])!=0)
4355bba5258a193d980fb116a8b04f96dc16d96aacfweidendo		    continue;
4365bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
4375bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    CLG_ASSERT(em->capacity > em->size);
4385bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    em->entry[em->size].group = i;
4395bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    em->entry[em->size].index = j;
4405bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    em->entry[em->size].offset = offset;
4415bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    em->size++;
4425bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    return;
4435bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	}
4445bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    }
445a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
446a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
447a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4485ee42a49a0701db915892bc349676f8cc5c60fbaflorian/* Returns pointer to dynamically string. The string will be overwritten
4495ee42a49a0701db915892bc349676f8cc5c60fbaflorian   with each invocation. */
4505ee42a49a0701db915892bc349676f8cc5c60fbaflorianHChar *CLG_(eventmapping_as_string)(const EventMapping* em)
451a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
4525ee42a49a0701db915892bc349676f8cc5c60fbaflorian    Int i;
4535bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    EventGroup* eg;
454a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4555bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    CLG_ASSERT(em != 0);
456a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4575ee42a49a0701db915892bc349676f8cc5c60fbaflorian    XArray *xa = VG_(newXA)(VG_(malloc), "cl.events.emas", VG_(free),
4585ee42a49a0701db915892bc349676f8cc5c60fbaflorian                            sizeof(HChar));
4595ee42a49a0701db915892bc349676f8cc5c60fbaflorian
4605bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=0; i< em->size; i++) {
4615ee42a49a0701db915892bc349676f8cc5c60fbaflorian	if (i > 0) {
4625ee42a49a0701db915892bc349676f8cc5c60fbaflorian           VG_(xaprintf)(xa, "%c", ' ');
4635ee42a49a0701db915892bc349676f8cc5c60fbaflorian        }
4645bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	eg = eventGroup[em->entry[i].group];
4655bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	CLG_ASSERT(eg != 0);
4665ee42a49a0701db915892bc349676f8cc5c60fbaflorian        VG_(xaprintf)(xa, "%s", eg->name[em->entry[i].index]);
4675bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    }
4685ee42a49a0701db915892bc349676f8cc5c60fbaflorian    VG_(xaprintf)(xa, "%c", '\0');   // zero terminate the string
4695ee42a49a0701db915892bc349676f8cc5c60fbaflorian
4705ee42a49a0701db915892bc349676f8cc5c60fbaflorian    HChar *buf = VG_(strdup)("cl.events.emas", VG_(indexXA)(xa, 0));
4715ee42a49a0701db915892bc349676f8cc5c60fbaflorian    VG_(deleteXA)(xa);
472a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4735ee42a49a0701db915892bc349676f8cc5c60fbaflorian    return buf;
474a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
475a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4765ee42a49a0701db915892bc349676f8cc5c60fbaflorian/* Returns pointer to dynamically allocated string. Caller needs to
4775ee42a49a0701db915892bc349676f8cc5c60fbaflorian   VG_(free) it. */
4785ee42a49a0701db915892bc349676f8cc5c60fbaflorianHChar *CLG_(mappingcost_as_string)(const EventMapping* em, const ULong* c)
479a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
4805ee42a49a0701db915892bc349676f8cc5c60fbaflorian    Int i, skipped = 0;
481a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
4825ee42a49a0701db915892bc349676f8cc5c60fbaflorian    if (!c || em->size==0) return VG_(strdup)("cl.events.mcas", "");
4835ee42a49a0701db915892bc349676f8cc5c60fbaflorian
4845ee42a49a0701db915892bc349676f8cc5c60fbaflorian    XArray *xa = VG_(newXA)(VG_(malloc), "cl.events.mcas", VG_(free),
4855ee42a49a0701db915892bc349676f8cc5c60fbaflorian                            sizeof(HChar));
486a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
487a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    /* At least one entry */
4885ee42a49a0701db915892bc349676f8cc5c60fbaflorian    VG_(xaprintf)(xa, "%llu", c[em->entry[0].offset]);
4895bba5258a193d980fb116a8b04f96dc16d96aacfweidendo
4905bba5258a193d980fb116a8b04f96dc16d96aacfweidendo    for(i=1; i<em->size; i++) {
4915bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	if (c[em->entry[i].offset] == 0) {
4925bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    skipped++;
4935bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    continue;
4945bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	}
4955bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	while(skipped>0) {
4965ee42a49a0701db915892bc349676f8cc5c60fbaflorian            VG_(xaprintf)(xa, " 0");
4975bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	    skipped--;
4985bba5258a193d980fb116a8b04f96dc16d96aacfweidendo	}
4995ee42a49a0701db915892bc349676f8cc5c60fbaflorian	VG_(xaprintf)(xa, " %llu", c[em->entry[i].offset]);
500a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
5015ee42a49a0701db915892bc349676f8cc5c60fbaflorian    VG_(xaprintf)(xa, "%c", '\0');   // zero terminate the string
5025ee42a49a0701db915892bc349676f8cc5c60fbaflorian
5035ee42a49a0701db915892bc349676f8cc5c60fbaflorian    HChar *buf = VG_(strdup)("cl.events.mas", VG_(indexXA)(xa, 0));
5045ee42a49a0701db915892bc349676f8cc5c60fbaflorian    VG_(deleteXA)(xa);
505a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
5065ee42a49a0701db915892bc349676f8cc5c60fbaflorian    return buf;
507a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
508