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