decode-gcov.c revision b8a309ac940374ead27618508ab8f81665ff7d9d
13a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* -*- mode: C; c-file-style: "gnu" -*- */ 23a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington/* decode-gcov.c gcov decoder program 33a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 43a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Copyright (C) 2003 Red Hat Inc. 53a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 63a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Partially derived from gcov, 73a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Copyright (C) 1990, 1991, 1992, 1993, 1994, 1996, 1997, 1998, 83a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 1999, 2000, 2001, 2002 Free Software Foundation, Inc. 93a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * This file is NOT licensed under the Academic Free License 113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * as it is largely derived from gcov.c and gcov-io.h in the 123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * gcc source code. 133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * This program is free software; you can redistribute it and/or modify 153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * it under the terms of the GNU General Public License as published by 163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * the Free Software Foundation; either version 2 of the License, or 173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * (at your option) any later version. 183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * This program is distributed in the hope that it will be useful, 203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of 213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * GNU General Public License for more details. 233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * You should have received a copy of the GNU General Public License 253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * along with this program; if not, write to the Free Software 263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * 283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define DBUS_COMPILATION /* cheat */ 313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-list.h> 323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-string.h> 333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-sysdeps.h> 343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <dbus/dbus-marshal.h> 350cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington#include <dbus/dbus-hash.h> 363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#undef DBUS_COMPILATION 373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <stdio.h> 383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <stdlib.h> 393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#include <string.h> 403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 41b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington#ifndef DBUS_HAVE_INT64 42b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington#error "gcov support can't be built without 64-bit integer support" 43b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington#endif 44b29ea9115ea3277354b7ccbe442026279220f4acHavoc Pennington 453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondie (const char *message) 473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "%s", message); 493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington/* This bizarro function is from gcov-io.h in gcc source tree */ 533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int 543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfetch_long (long *dest, 553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *source, 563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington size_t bytes) 573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long value = 0; 593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (i = bytes - 1; (size_t) i > (sizeof (*dest) - 1); i--) 623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (source[i] & ((size_t) i == (bytes - 1) ? 127 : 255 )) 633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 1; 643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (; i >= 0; i--) 663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington value = value * 256 + (source[i] & ((size_t)i == (bytes - 1) ? 127 : 255)); 673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((source[bytes - 1] & 128) && (value > 0)) 693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington value = - value; 703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *dest = value; 723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 0; 733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int 763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfetch_long64 (dbus_int64_t *dest, 773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *source, 783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington size_t bytes) 793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t value = 0; 813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (i = bytes - 1; (size_t) i > (sizeof (*dest) - 1); i--) 843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (source[i] & ((size_t) i == (bytes - 1) ? 127 : 255 )) 853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 1; 863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (; i >= 0; i--) 883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington value = value * 256 + (source[i] & ((size_t)i == (bytes - 1) ? 127 : 255)); 893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((source[bytes - 1] & 128) && (value > 0)) 913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington value = - value; 923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *dest = value; 943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 0; 953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define BB_FILENAME (-1) 983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define BB_FUNCTION (-2) 993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define BB_ENDOFLIST 0 1003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t 1023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstring_get_int (const DBusString *str, 1033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int start, 1043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long *val) 1053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 1063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *p; 1073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((_dbus_string_get_length (str) - start) < 4) 1093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return FALSE; 1103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington p = _dbus_string_get_const_data (str); 1123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington p += start; 1143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fetch_long (val, p, 4); 1163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return TRUE; 1183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 1193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t 1213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstring_get_int64 (const DBusString *str, 1223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int start, 1233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t *val) 1243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 1253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *p; 1263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((_dbus_string_get_length (str) - start) < 8) 1283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return FALSE; 1293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington p = _dbus_string_get_const_data (str); 1313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington p += start; 1333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fetch_long64 (val, p, 8); 1353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return TRUE; 1373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 1383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t 1403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstring_get_string (const DBusString *str, 1413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int start, 1423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long terminator, 1433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString *val, 1443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int *end) 1453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 1463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 1473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n; 1483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = start; 1503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (string_get_int (str, i, &n)) 1513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 152cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington unsigned char b; 153cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 1553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (n == terminator) 1573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 1583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 159cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington b = n & 0xff; 160cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (b) 161cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 162cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_append_byte (val, b); 163cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington b = (n >> 8) & 0xff; 164cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (b) 165cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 166cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_append_byte (val, b); 167cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington b = (n >> 16) & 0xff; 168cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (b) 169cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 170cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_append_byte (val, b); 171cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington b = (n >> 24) & 0xff; 172cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (b) 173cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_append_byte (val, b); 174cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 175cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 176cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 1783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington *end = i; 1803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return TRUE; 1823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 1833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 184cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV 185cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington/* In gcc33 .bbg files, there's a function name of the form: 186cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * -1, length, name (padded to 4), -1, checksum 187cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */ 188cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstatic dbus_bool_t 189cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstring_get_function (const DBusString *str, 190cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int start, 191cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusString *funcname, 192cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int *checksum, 193cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int *next) 194cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington{ 195cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int end; 196cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington long val; 197cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int i; 198cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 199cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i = start; 200cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 201cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (str, i, &val)) 202cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no room for -1 before function name\n"); 203cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 204cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 205cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 206cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (val != -1) 207cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("value before function name is not -1\n"); 208cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 209cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (str, i, &val)) 210cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no length found for function name\n"); 211cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 212cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 213cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 214cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington end = i + val; 215cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (end > _dbus_string_get_length (str)) 216cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("Function name length points past end of file\n"); 217cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 218cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_append (funcname, 219cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_get_const_data (str) + i)) 220cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no memory\n"); 221cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 222cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington /* skip alignment padding the length doesn't include the nul so add 1 223cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */ 224cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i = _DBUS_ALIGN_VALUE (end + 1, 4); 225cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 226cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (str, i, &val) || 227cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington val != -1) 228cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("-1 at end of function name not found\n"); 229cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 230cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 231cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 232cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (str, i, &val)) 233cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no checksum found at end of function name\n"); 234cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 235cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 236cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 237cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *checksum = val; 238cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 239cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington *next = i; 240cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 241cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington return TRUE; 242cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington} 243cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */ 244cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 2453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 2463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondump_bb_file (const DBusString *contents) 2473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 2483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 2493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long val; 2503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions; 2513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 2523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions = 0; 2533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 2543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (string_get_int (contents, i, &val)) 2553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 2563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 2573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 2583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington switch (val) 2593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 2603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington case BB_FILENAME: 2613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 2623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString f; 2633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 2643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&f)) 2653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 2663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 2673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (string_get_string (contents, i, 2683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington BB_FILENAME, 2693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &f, &i)) 2703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 2713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("File %s\n", _dbus_string_get_const_data (&f)); 2723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 2733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&f); 2743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 2753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 2763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington case BB_FUNCTION: 2773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 2783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString f; 2793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&f)) 2803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 2813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 2823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (string_get_string (contents, i, 2833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington BB_FUNCTION, 2843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &f, &i)) 2853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 2863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Function %s\n", _dbus_string_get_const_data (&f)); 2873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 2883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&f); 2893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 2903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions += 1; 2913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 2923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 2933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington case BB_ENDOFLIST: 2943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("End of block\n"); 2953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 2963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington default: 2973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Line %ld\n", val); 2983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 2993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 3003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 3013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%d functions in file\n", n_functions); 3033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 3043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define FLAG_ON_TREE 0x1 3063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define FLAG_FAKE 0x2 3073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#define FLAG_FALL_THROUGH 0x4 3083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 3103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondump_bbg_file (const DBusString *contents) 3113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 3123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 3133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long val; 3143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions; 3153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_arcs; 3163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks; 3173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_arcs_off_tree; 318cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 3193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs_off_tree = 0; 3203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks = 0; 3213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs = 0; 3223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions = 0; 3233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 324cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (i < _dbus_string_get_length (contents)) 3253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 3263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n_blocks_in_func; 3273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n_arcs_in_func; 3283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int j; 329cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 330cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV 331cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington /* In gcc33 .bbg files, there's a function name of the form: 332cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * -1, length, name (padded to 4), -1, checksum 333cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * after that header on each function description, it's 334cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * the same as in gcc32 335cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */ 336cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 337cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 338cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusString funcname; 339cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int checksum; 340cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 341cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_init (&funcname)) 342cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no memory\n"); 343cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 344cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_function (contents, i, 345cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington &funcname, &checksum, &i)) 346cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("could not read function name\n"); 347cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 348cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf ("Function name is \"%s\" checksum %d\n", 349cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_get_const_data (&funcname), 350cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington checksum); 351cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 352cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_free (&funcname); 353cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 354cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */ 3553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 356cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 357cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no count of blocks in func found\n"); 3583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 360cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 361cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_blocks_in_func = val; 3623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &n_arcs_in_func)) 3643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 3653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 3673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Function has %ld blocks and %ld arcs\n", 3693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks_in_func, n_arcs_in_func); 3703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions += 1; 3723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks += n_blocks_in_func; 3733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs += n_arcs_in_func; 3743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington j = 0; 3763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (j < n_blocks_in_func) 3773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 3783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n_arcs_in_block; 3793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int k; 3803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &n_arcs_in_block)) 3823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 3833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 3853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" Block has %ld arcs\n", n_arcs_in_block); 3873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington k = 0; 3893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (k < n_arcs_in_block) 3903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 3913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long destination_block; 3923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long flags; 3933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &destination_block)) 3953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 3963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 3983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 3993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &flags)) 4003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 4013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 4033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" Arc has destination block %ld flags 0x%lx\n", 4053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington destination_block, flags); 4063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((flags & FLAG_ON_TREE) == 0) 4083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs_off_tree += 1; 4093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++k; 4113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 4123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (k < n_arcs_in_block) 4143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 4153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++j; 4173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 4183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (j < n_blocks_in_func) 4203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 4213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &val)) 4233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 4243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 4263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (val != -1) 4283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("-1 separator not found\n"); 4293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 4303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%d functions %d blocks %d arcs %d off-tree arcs in file\n", 4323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions, n_blocks, n_arcs, n_arcs_off_tree); 4333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 4343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 435cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifndef DBUS_HAVE_GCC33_GCOV 436cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 437cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington/* gcc 3.2 version: 438cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * The da file contains first a count of arcs in the file, 4393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * then a count of executions for all "off tree" arcs 4403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * in the file. 4413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 4423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 4433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtondump_da_file (const DBusString *contents) 4443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 4453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 4463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t val; 4473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_arcs; 4483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int claimed_n_arcs; 4493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 4513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int64 (contents, i, &val)) 4523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return; 4533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 8; 4553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%ld arcs in file\n", (long) val); 4573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington claimed_n_arcs = val; 4583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs = 0; 4603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (string_get_int64 (contents, i, &val)) 4613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 4623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 8; 4633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%ld executions of arc %d\n", 4653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington (long) val, n_arcs); 4663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++n_arcs; 4683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 4693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 4703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (n_arcs != claimed_n_arcs) 4713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 4723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("File claimed to have %d arcs but only had %d\n", 4733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington claimed_n_arcs, n_arcs); 4743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 4753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 4763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 477cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#else /* DBUS_HAVE_GCC33_GCOV */ 478cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 479cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington/* gcc 3.3 version: 480cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * The da file is more complex than 3.2. 481cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * 482cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * We have a magic value of "-123" only it isn't really 483cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * -123, it's -123 as encoded by the crackass gcov-io.h 484cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * routines. Anyway, 4 bytes. 485cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * 486cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * We then have: 487cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * 488cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * - 4 byte count of how many functions in the following list 489cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * - 4 byte length of random extra data 490cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * - the random extra data, just skip it, info pages have some 491cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * details on what might be in there or see __bb_exit_func in gcc 492cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * - then for each function (number of functions given above): 493cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * . -1, length, funcname, alignment padding, -1 494cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * . checksum 495cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * . 4 byte number of arcs in function 496cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * . 8 bytes each, a count of execution for each arc 497cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * 498cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * Now, the whole thing *starting with the magic* can repeat. 499cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * This is caused by multiple runs of the profiled app appending 500cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * to the file. 501cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */ 502cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstatic void 503cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtondump_da_file (const DBusString *contents) 504cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington{ 505cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int i; 506cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington dbus_int64_t v64; 507cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington long val; 508cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int n_sections; 509cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int total_functions; 510cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 511cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington total_functions = 0; 512cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_sections = 0; 513cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 514cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i = 0; 515cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (i < _dbus_string_get_length (contents)) 516cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 517cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int claimed_n_functions; 518cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int n_functions; 519cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int total_arcs; 520cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 521cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf (".da file section %d\n", n_sections); 522cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 523cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 524cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no magic found in .da file\n"); 525cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 526cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 527cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 528cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (val != -123) 529cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("wrong file magic in .da file\n"); 530cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 531cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 532cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no function count in .da file\n"); 533cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 534cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington claimed_n_functions = val; 535cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 536cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf ("%d functions expected in section %d of .da file\n", 537cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington claimed_n_functions, n_sections); 538cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 539cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 540cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no extra data length in .da file\n"); 541cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 542cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 543cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 544cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += val; 545cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 546cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington total_arcs = 0; 547cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_functions = 0; 548cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (n_functions < claimed_n_functions) 549cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 550cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusString funcname; 551cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int checksum; 552cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int claimed_n_arcs; 553cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int n_arcs; 554cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 555cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_init (&funcname)) 556cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no memory\n"); 557cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 558cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_function (contents, i, 559cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington &funcname, &checksum, &i)) 560cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("could not read function name\n"); 561cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 562cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 563cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no arc count for function\n"); 564cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 565cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 566cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington claimed_n_arcs = val; 567cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 568cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf (" %d arcs in function %d %s checksum %d\n", 569cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington claimed_n_arcs, n_functions, 570cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_get_const_data (&funcname), 571cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington checksum); 572cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 573cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_arcs = 0; 574cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (n_arcs < claimed_n_arcs) 575cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 576cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int64 (contents, i, &v64)) 577cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("did not get execution count for arc\n"); 578cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 579cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 8; 580cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 581cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf (" %ld executions of arc %d (total arcs %d)\n", 582cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington (long) v64, n_arcs, total_arcs + n_arcs); 583cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 584cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++n_arcs; 585cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 586cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 587cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_free (&funcname); 588cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 589cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington total_arcs += n_arcs; 590cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++n_functions; 591cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 592cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 593cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf ("total of %d functions and %d arcs in section %d\n", 594cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_functions, total_arcs, n_sections); 595cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 596cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington total_functions += n_functions; 597cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++n_sections; 598cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 599cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 600cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington printf ("%d total function sections in %d total .da file sections\n", 601cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington total_functions, n_sections); 602cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington} 603cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 604cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */ 605cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 6063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Arc Arc; 6073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Block Block; 6083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Function Function; 6093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct File File; 6103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Line Line; 6113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Arc 6133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 6143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int source; 6153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int target; 6163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t arc_count; 6173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int count_valid : 1; 6183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int on_tree : 1; 6193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int fake : 1; 6203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int fall_through : 1; 6213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *pred_next; 6223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *succ_next; 6233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}; 6243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Block 6263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 6273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *succ; 6283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *pred; 6293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t succ_count; 6303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t pred_count; 6313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t exec_count; 6323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *lines; 6333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int count_valid : 1; 6343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int on_tree : 1; 6353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int inside_dbus_build_tests : 1; 6363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}; 6373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Function 6393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 6403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington char *name; 641cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int checksum; 6423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *block_graph; 6433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks; 64477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington /* number of blocks in DBUS_BUILD_TESTS */ 64577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_test_blocks; 64677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_test_blocks_executed; 64777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington /* number of blocks outside DBUS_BUILD_TESTS */ 64877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_nontest_blocks; 64977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_nontest_blocks_executed; 65077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington /* Summary result flags */ 6513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int unused : 1; 6523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int inside_dbus_build_tests : 1; 6533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int partial : 1; /* only some of the blocks were executed */ 6543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}; 6553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Line 6573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 6583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int number; 6593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington char *text; 6603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *blocks; 6613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int inside_dbus_build_tests : 1; 6623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington unsigned int partial : 1; /* only some of the blocks were executed */ 6633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}; 6643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct File 6663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 6673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington char *name; 6683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *lines; 6693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines; 6703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *functions; 6713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}; 6723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 6743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfunction_add_arc (Function *function, 6753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long source, 6763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long target, 6773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long flags) 6783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 6793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *arc; 6803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = dbus_new0 (Arc, 1); 6823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (arc == NULL) 6833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 6843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->target = target; 6863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->source = source; 6873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->succ_next = function->block_graph[source].succ; 6893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function->block_graph[source].succ = arc; 6903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function->block_graph[source].succ_count += 1; 6913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->pred_next = function->block_graph[target].pred; 6933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function->block_graph[target].pred = arc; 6943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function->block_graph[target].pred_count += 1; 6953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((flags & FLAG_ON_TREE) != 0) 6973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->on_tree = TRUE; 6983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 6993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((flags & FLAG_FAKE) != 0) 7003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->fake = TRUE; 7013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((flags & FLAG_FALL_THROUGH) != 0) 7033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->fall_through = TRUE; 7043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 7053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic Arc* 7083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonreverse_arcs (Arc *arc) 7093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 7103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington struct Arc *prev = 0; 7113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington struct Arc *next; 7123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for ( ; arc; arc = next) 7143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 7153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington next = arc->succ_next; 7163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->succ_next = prev; 7173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington prev = arc; 7183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 7193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return prev; 7213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 7223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 7243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfunction_reverse_succ_arcs (Function *func) 7253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 7263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Must reverse the order of all succ arcs, to ensure that they match 7273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * the order of the data in the .da file. 7283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 7293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 7303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (i = 0; i < func->n_blocks; i++) 7323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->block_graph[i].succ) 7333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func->block_graph[i].succ = reverse_arcs (func->block_graph[i].succ); 7343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 7353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 7373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonget_functions_from_bbg (const DBusString *contents, 7383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList **functions) 7393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 7403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 7413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long val; 7423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions; 7433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_arcs; 7443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks; 7453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_arcs_off_tree; 7463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 7483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Loading arcs and blocks from .bbg file\n"); 7493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 7503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs_off_tree = 0; 7523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks = 0; 7533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs = 0; 7543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions = 0; 7553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 756cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (i < _dbus_string_get_length (contents)) 7573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 7583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func; 7593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n_blocks_in_func; 7603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n_arcs_in_func; 7613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int j; 762cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 763cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV 764cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusString funcname; 765cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int checksum; 766cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 767cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington /* In gcc33 .bbg files, there's a function name of the form: 768cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * -1, length, name (padded to 4), -1, checksum 769cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * after that header on each function description, it's 770cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * the same as in gcc32 771cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */ 772cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_init (&funcname)) 773cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no memory\n"); 774cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 775cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_function (contents, i, 776cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington &funcname, &checksum, &i)) 777cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("could not read function name\n"); 778cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif /* DBUS_HAVE_GCC33_GCOV */ 779cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 780cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 781cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington break; 7823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks_in_func = val; 7843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 7863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &n_arcs_in_func)) 7883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 7893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 7913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions += 1; 7933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks += n_blocks_in_func; 7943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs += n_arcs_in_func; 7953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 7963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func = dbus_new0 (Function, 1); 7973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func == NULL) 7983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 7993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 800cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV 801cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington func->name = _dbus_strdup (_dbus_string_get_const_data (&funcname)); 802cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington func->checksum = checksum; 803cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_free (&funcname); 804cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif 805cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 8063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func->block_graph = dbus_new0 (Block, n_blocks_in_func); 8073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func->n_blocks = n_blocks_in_func; 8083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington j = 0; 8103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (j < n_blocks_in_func) 8113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 8123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long n_arcs_in_block; 8133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int k; 8143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &n_arcs_in_block)) 8163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 8173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 8193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington k = 0; 8213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (k < n_arcs_in_block) 8223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 8233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long destination_block; 8243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long flags; 8253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &destination_block)) 8273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 8283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 8303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &flags)) 8323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 8333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 8353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if ((flags & FLAG_ON_TREE) == 0) 8373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs_off_tree += 1; 8383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function_add_arc (func, j, destination_block, 8403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington flags); 8413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++k; 8433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 8443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (k < n_arcs_in_block) 8463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 8473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++j; 8493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 8503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (j < n_blocks_in_func) 8523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 8533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function_reverse_succ_arcs (func); 8553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_list_append (functions, func)) 8573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 8583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int (contents, i, &val)) 8603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 8613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 8633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (val != -1) 865cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("-1 separator not found in .bbg file\n"); 8663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 8673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 8693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%d functions %d blocks %d arcs %d off-tree arcs in file\n", 8703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions, n_blocks, n_arcs, n_arcs_off_tree); 8713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 8723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 8733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_assert (n_functions == _dbus_list_get_length (functions)); 8743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 8753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 876cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#ifdef DBUS_HAVE_GCC33_GCOV 877cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonstatic void 878cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Penningtonadd_counts_from_da (const DBusString *contents, 879cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusList **functions) 880cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington{ 881cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int i; 882cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington dbus_int64_t v64; 883cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington long val; 884cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int n_sections; 885cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusList *link; 886cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington Function *current_func; 887cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int current_block; 888cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington Arc *current_arc; 889cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 890cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_sections = 0; 891cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 892cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i = 0; 893cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (i < _dbus_string_get_length (contents)) 894cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 895cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int claimed_n_functions; 896cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int n_functions; 897cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 898cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 899cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no magic found in .da file\n"); 900cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 901cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 902cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 903cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (val != -123) 904cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("wrong file magic in .da file\n"); 905cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 906cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 907cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no function count in .da file\n"); 908cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 909cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington claimed_n_functions = val; 910cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 911cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 912cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no extra data length in .da file\n"); 913cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 914cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 915cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 916cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += val; 917cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 918cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington link = _dbus_list_get_first_link (functions); 919cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (link == NULL) 920cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington goto no_more_functions; 921cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 922cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_functions = 0; 923cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (n_functions < claimed_n_functions && link != NULL) 924cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 925cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusString funcname; 926cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int checksum; 927cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int claimed_n_arcs; 928cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int n_arcs; 929cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 930cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_func = link->data; 931cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_block = 0; 932cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc = current_func->block_graph[current_block].succ; 933cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 934cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_init (&funcname)) 935cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no memory\n"); 936cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 937cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_function (contents, i, 938cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington &funcname, &checksum, &i)) 939cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("could not read function name\n"); 940cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 941cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_equal_c_str (&funcname, current_func->name)) 942cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 943cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, "Expecting .da info for %s but got %s\n", 944cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_func->name, 945cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_get_const_data (&funcname)); 946cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington exit (1); 947cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 948cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 949cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (checksum != current_func->checksum) 950cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die (".da file checksum doesn't match checksum from .bbg file\n"); 951cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 952cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int (contents, i, &val)) 953cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no arc count for function\n"); 954cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 955cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 4; 956cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington claimed_n_arcs = val; 957cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 958cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington /* For each arc in the profile, find the corresponding 959cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington * arc in the function and increment its count 960cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington */ 961cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington n_arcs = 0; 962cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (n_arcs < claimed_n_arcs) 963cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 964cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!string_get_int64 (contents, i, &v64)) 965cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("did not get execution count for arc\n"); 966cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 967cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i += 8; 968cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 969cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington /* Find the next arc in the function that isn't on tree */ 970cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington while (current_arc == NULL || 971cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc->on_tree) 972cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 973cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (current_arc == NULL) 974cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 975cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++current_block; 976cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 977cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (current_block >= current_func->n_blocks) 978cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("too many blocks in function\n"); 979cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 980cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc = current_func->block_graph[current_block].succ; 981cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 982cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington else 983cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 984cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc = current_arc->succ_next; 985cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 986cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 987cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 988cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_assert (current_arc != NULL); 989cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_assert (!current_arc->on_tree); 990cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 991cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc->arc_count = v64; 992cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc->count_valid = TRUE; 993cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_func->block_graph[current_block].succ_count -= 1; 994cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_func->block_graph[current_arc->target].pred_count -= 1; 995cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 996cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++n_arcs; 997cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 998cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington current_arc = current_arc->succ_next; 999cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1000cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1001cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_free (&funcname); 1002cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1003cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington link = _dbus_list_get_next_link (functions, link); 1004cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++n_functions; 1005cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1006cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (link == NULL && n_functions < claimed_n_functions) 1007cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1008cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, "Ran out of functions loading .da file\n"); 1009cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington goto no_more_functions; 1010cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1011cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1012cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1013cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington no_more_functions: 1014cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1015cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington ++n_sections; 1016cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1017cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington} 1018cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#else /* DBUS_HAVE_GCC33_GCOV */ 10193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 10203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonadd_counts_from_da (const DBusString *contents, 10213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList **functions) 10223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 10233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 10243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t val; 10253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_arcs; 10263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int claimed_n_arcs; 10273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 10283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *current_func; 10293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int current_block; 10303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *current_arc; 10313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 10333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Loading execution count for each arc from .da file\n"); 10343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 10353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 10373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!string_get_int64 (contents, i, &val)) 10383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return; 10393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 8; 10413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington claimed_n_arcs = val; 10433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (functions); 10453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (link == NULL) 10463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington goto done; 10473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_func = link->data; 10493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_block = 0; 10503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc = current_func->block_graph[current_block].succ; 10513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_arcs = 0; 10533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (string_get_int64 (contents, i, &val)) 10543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 10553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 8; 10563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (current_arc == NULL || 10583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc->on_tree) 10593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 10603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (current_arc == NULL) 10613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 10623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++current_block; 10633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (current_block == current_func->n_blocks) 10653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 10663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (functions, link); 10673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (link == NULL) 10683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 10693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Ran out of functions loading .da file\n"); 10703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington goto done; 10713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 10723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_func = link->data; 10733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_block = 0; 10743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 10753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc = current_func->block_graph[current_block].succ; 10773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 10783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 10793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 10803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc = current_arc->succ_next; 10813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 10823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 10833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_assert (current_arc != NULL); 10853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_assert (!current_arc->on_tree); 10863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc->arc_count = val; 10883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc->count_valid = TRUE; 10893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_func->block_graph[current_block].succ_count -= 1; 10903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_func->block_graph[current_arc->target].pred_count -= 1; 10913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++n_arcs; 10933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington current_arc = current_arc->succ_next; 10953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 10963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington done: 10983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 10993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (n_arcs != claimed_n_arcs) 11003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "File claimed to have %d arcs but only had %d\n", 11023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington claimed_n_arcs, n_arcs); 11033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 11043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 11053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 11073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%d arcs in file\n", n_arcs); 11083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 11093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 1110cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington#endif 11113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 11133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfunction_solve_graph (Function *func) 11143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 11153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int passes, changes; 11163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t total; 11173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 11183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Arc *arc; 11193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *block_graph; 11203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks; 11213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 11233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Solving function graph\n"); 11243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 11253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks = func->n_blocks; 11273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph = func->block_graph; 11283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* For every block in the file, 11303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington - if every exit/entrance arc has a known count, then set the block count 11313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington - if the block count is known, and every exit/entrance arc but one has 11323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington a known execution count, then set the count of the remaining arc 11333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington As arc counts are set, decrement the succ/pred count, but don't delete 11353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington the arc, that way we can easily tell when all arcs are known, or only 11363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington one arc is unknown. */ 11373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* The order that the basic blocks are iterated through is important. 11393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Since the code that finds spanning trees starts with block 0, low numbered 11403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arcs are put on the spanning tree in preference to high numbered arcs. 11413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Hence, most instrumented arcs are at the end. Graph solving works much 11423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington faster if we propagate numbers from the end to the start. 11433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington This takes an average of slightly more than 3 passes. */ 11453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington changes = 1; 11473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington passes = 0; 11483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (changes) 11493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington passes++; 11513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington changes = 0; 11523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 11533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (i = n_blocks - 1; i >= 0; i--) 11543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (! block_graph[i].count_valid) 11563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (block_graph[i].succ_count == 0) 11583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = 0; 11603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (arc = block_graph[i].succ; arc; 11613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = arc->succ_next) 11623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total += arc->arc_count; 11633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[i].exec_count = total; 11643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[i].count_valid = 1; 11653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington changes = 1; 11663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 11673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (block_graph[i].pred_count == 0) 11683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = 0; 11703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (arc = block_graph[i].pred; arc; 11713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = arc->pred_next) 11723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total += arc->arc_count; 11733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[i].exec_count = total; 11743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[i].count_valid = 1; 11753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington changes = 1; 11763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 11773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 11783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (block_graph[i].count_valid) 11793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (block_graph[i].succ_count == 1) 11813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 11823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = 0; 11833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* One of the counts will be invalid, but it is zero, 11843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington so adding it in also doesn't hurt. */ 11853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (arc = block_graph[i].succ; arc; 11863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = arc->succ_next) 11873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total += arc->arc_count; 11883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Calculate count for remaining arc by conservation. */ 11893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = block_graph[i].exec_count - total; 11903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Search for the invalid arc, and set its count. */ 11913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (arc = block_graph[i].succ; arc; 11923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = arc->succ_next) 11933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (! arc->count_valid) 11943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 11953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (! arc) 11963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("arc == NULL\n"); 11973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->count_valid = 1; 11983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->arc_count = total; 11993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[i].succ_count -= 1; 12003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[arc->target].pred_count -= 1; 12023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington changes = 1; 12033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 12043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (block_graph[i].pred_count == 1) 12053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 12063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = 0; 12073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* One of the counts will be invalid, but it is zero, 12083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington so adding it in also doesn't hurt. */ 12093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (arc = block_graph[i].pred; arc; 12103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = arc->pred_next) 12113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total += arc->arc_count; 12123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Calculate count for remaining arc by conservation. */ 12133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = block_graph[i].exec_count - total; 12143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Search for the invalid arc, and set its count. */ 12153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (arc = block_graph[i].pred; arc; 12163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc = arc->pred_next) 12173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (! arc->count_valid) 12183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 12193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (! arc) 12203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("arc == NULL\n"); 12213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->count_valid = 1; 12223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington arc->arc_count = total; 12233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[i].pred_count -= 1; 12243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block_graph[arc->source].succ_count -= 1; 12263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington changes = 1; 12273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 12283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 12293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 12303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 12313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* If the graph has been correctly solved, every block will have a 12333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * succ and pred count of zero. 12343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 1235cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1236cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington dbus_bool_t header = FALSE; 1237cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington for (i = 0; i < n_blocks; i++) 1238cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1239cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (block_graph[i].succ_count || block_graph[i].pred_count) 1240cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1241cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!header) 1242cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1243cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, "WARNING: Block graph solved incorrectly for function %s\n", 1244cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington func->name); 1245cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, " this error reflects a bug in decode-gcov.c or perhaps bogus data\n"); 1246cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington header = TRUE; 1247cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1248cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, " block %d has succ_count = %d pred_count = %d\n", 1249cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington i, (int) block_graph[i].succ_count, (int) block_graph[i].pred_count); 1250cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1251cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1252cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 12533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 12543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 12563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonsolve_graphs (DBusList **functions) 12573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 12583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 12593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (functions); 12613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 12623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 12633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 12643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington function_solve_graph (func); 12663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (functions, link); 12683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 12693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 12703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 12723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonload_functions_for_c_file (const DBusString *filename, 12733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList **functions) 12743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 12753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString bbg_filename; 12763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString da_filename; 1277b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington DBusString gcno_filename; 1278b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington DBusString gcda_filename; 12793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString contents; 1280b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington DBusString *name; 12813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusError error; 12823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1283b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington /* With latest gcc it's .gcno instead of .bbg and 1284b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington * gcda instead of .da 1285b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington */ 1286b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington 12873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_init (&error); 12883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 12893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&bbg_filename) || 12903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !_dbus_string_init (&da_filename) || 1291b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_init (&gcno_filename) || 1292b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_init (&gcda_filename) || 12933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !_dbus_string_copy (filename, 0, &bbg_filename, 0) || 12943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !_dbus_string_copy (filename, 0, &da_filename, 0) || 1295b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_copy (filename, 0, &gcno_filename, 0) || 1296b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_copy (filename, 0, &gcda_filename, 0) || 12973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !_dbus_string_init (&contents)) 12983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 12993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_shorten (&bbg_filename, 2); 13013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_shorten (&da_filename, 2); 13023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_append (&bbg_filename, ".bbg") || 1304b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_append (&da_filename, ".da") || 1305b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_append (&bbg_filename, ".gcno") || 1306b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington !_dbus_string_append (&bbg_filename, ".gcda")) 13073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 1308b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington 1309b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (_dbus_file_exists (_dbus_string_get_const_data (&gcno_filename))) 1310b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington name = &gcno_filename; 1311b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington else 1312b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington name = &bbg_filename; 1313b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington 1314b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (!_dbus_file_get_contents (&contents, name, 13153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 13163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 13173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Could not open file: %s\n", 13183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington error.message); 13193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 13203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 13213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington get_functions_from_bbg (&contents, functions); 13233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_set_length (&contents, 0); 13253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 1326b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (_dbus_file_exists (_dbus_string_get_const_data (&gcda_filename))) 1327b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington name = &gcda_filename; 1328b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington else 1329b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington name = &da_filename; 1330b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington 1331b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (!_dbus_file_get_contents (&contents, name, 13323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 13333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 1334cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington /* Try .libs/file.da */ 1335cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington int slash; 1336cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1337b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (_dbus_string_find_byte_backward (name, 1338b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington _dbus_string_get_length (name), 1339b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington '/', 1340b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington &slash)) 1341cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1342cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington DBusString libs; 1343cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_init_const (&libs, "/.libs"); 1344cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1345b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (!_dbus_string_copy (&libs, 0, name, slash)) 1346cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington die ("no memory"); 1347cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1348cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington dbus_error_free (&error); 1349b8a309ac940374ead27618508ab8f81665ff7d9dHavoc Pennington if (!_dbus_file_get_contents (&contents, name, 1350cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington &error)) 1351cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1352cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, "Could not open file: %s\n", 1353cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington error.message); 1354cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington exit (1); 1355cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1356cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 1357cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington else 1358cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1359cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, "Could not open file: %s\n", 1360cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington error.message); 1361cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington exit (1); 1362cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 13633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 13643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington add_counts_from_da (&contents, functions); 13663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington solve_graphs (functions); 13683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&contents); 13703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&da_filename); 13713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&bbg_filename); 13723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 13733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 13753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonget_lines_from_bb_file (const DBusString *contents, 13763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *fl) 13773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 13783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 13793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington long val; 13803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions; 13813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_bool_t in_our_file; 13823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 13833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func; 13843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int block; 13853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 13873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Getting line numbers for blocks from .bb file\n"); 13883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 13893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* There's this "filename" field in the .bb file which 13913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * mysteriously comes *after* the first function in the 13923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * file in the .bb file; and every .bb file seems to 13933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * have only one filename. I don't understand 13943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * what's going on here, so just set in_our_file = TRUE 13953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * at the start categorically. 13963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 13973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 13983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block = 0; 13993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func = NULL; 14003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington in_our_file = TRUE; 14013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&fl->functions); 14023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions = 0; 14033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 14043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (string_get_int (contents, i, &val)) 14053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i += 4; 14073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington switch (val) 14093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington case BB_FILENAME: 14113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString f; 14133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&f)) 14153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 14163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (string_get_string (contents, i, 14183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington BB_FILENAME, 14193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &f, &i)) 14203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* fl->name is a full path and the filename in .bb is 14223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * not. 14233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 14243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString tmp_str; 14253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_init_const (&tmp_str, fl->name); 14273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (_dbus_string_ends_with_c_str (&tmp_str, 14293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_get_const_data (&f))) 14303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington in_our_file = TRUE; 14313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 14323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington in_our_file = FALSE; 14333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 14353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, 14363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington "File %s in .bb, looking for %s, in_our_file = %d\n", 14373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_get_const_data (&f), 14383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fl->name, 14393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington in_our_file); 14403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 14413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&f); 14433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 14453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington case BB_FUNCTION: 14463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString f; 14483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&f)) 14493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 14503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (string_get_string (contents, i, 14523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington BB_FUNCTION, 14533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &f, &i)) 14543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 14563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Function %s\n", _dbus_string_get_const_data (&f)); 14573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 14583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block = 0; 14603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (in_our_file) 14623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (link == NULL) 14643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "No function object for function %s\n", 14663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_get_const_data (&f)); 14673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 14693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func = link->data; 14713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&fl->functions, link); 1472cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 14733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->name == NULL) 14743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 14753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_copy_data (&f, &func->name)) 14763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 14773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 14793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 1480cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington if (!_dbus_string_equal_c_str (&f, func->name)) 1481cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington { 1482cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington fprintf (stderr, "got function name \"%s\" (%d) from .bbg file, but \"%s\" (%d) from .bb file\n", 1483cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington func->name, strlen (func->name), 1484cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_get_const_data (&f), 1485cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington _dbus_string_get_length (&f)); 1486cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington 1487cd077dc8f2a8876f7ce50229e855d138b8310a0eHavoc Pennington } 14883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&f); 14933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 14943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_functions += 1; 14953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 14963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 14973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington case BB_ENDOFLIST: 14983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block += 1; 14993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 15003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington default: 15013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 15023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Line %ld\n", val); 15033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 15043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (val >= fl->n_lines) 15063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 15073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Line %ld but file only has %d lines\n", 15083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington val, fl->n_lines); 15093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (func != NULL) 15113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 15123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington val -= 1; /* To convert the 1-based line number to 0-based */ 15133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_assert (val >= 0); 15143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (block < func->n_blocks) 15163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 15173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_list_append (&func->block_graph[block].lines, 15183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &fl->lines[val])) 15193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 15203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_list_append (&fl->lines[val].blocks, 15233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &func->block_graph[block])) 15243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 15253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 15273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 15283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Line number for block %d but function only has %d blocks\n", 15293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington block, func->n_blocks); 15303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 15333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 15343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Line %ld given outside of any function\n", 15353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington val); 15363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 15393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 15433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%d functions in file\n", n_functions); 15443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 15453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 15463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 15493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonload_block_line_associations (const DBusString *filename, 15503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f) 15513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 15523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString bb_filename; 15533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString contents; 15543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusError error; 15553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_init (&error); 15573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&bb_filename) || 15593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !_dbus_string_copy (filename, 0, &bb_filename, 0) || 15603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !_dbus_string_init (&contents)) 15613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 15623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_shorten (&bb_filename, 2); 15643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_append (&bb_filename, ".bb")) 15663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 15673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_file_get_contents (&contents, &bb_filename, 15693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 15703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 15713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Could not open file: %s\n", 15723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington error.message); 15733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 15743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 15753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington get_lines_from_bb_file (&contents, f); 15773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&contents); 15793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&bb_filename); 15803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 15813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int 15833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtoncount_lines_in_string (const DBusString *str) 15843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 15853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines; 15863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *p; 15873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *prev; 15883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *end; 15893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *last_line_end; 15903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 15923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Counting lines in source file\n"); 15933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 15943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 15953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_lines = 0; 15963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington prev = NULL; 15973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington p = _dbus_string_get_const_data (str); 15983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington end = p + _dbus_string_get_length (str); 15993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington last_line_end = p; 16003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (p != end) 16013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* too lazy to handle \r\n as one linebreak */ 16033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (*p == '\n' || *p == '\r') 16043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++n_lines; 16063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington last_line_end = p + 1; 16073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington prev = p; 16103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++p; 16113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (last_line_end != p) 16143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++n_lines; 16153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return n_lines; 16173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 16183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 16203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonfill_line_content (const DBusString *str, 16213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *lines) 16223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 16233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines; 16243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *p; 16253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *prev; 16263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *end; 16273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *last_line_end; 16283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#if 0 16303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Saving contents of each line in source file\n"); 16313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington#endif 16323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_lines = 0; 16343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington prev = NULL; 16353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington p = _dbus_string_get_const_data (str); 16363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington end = p + _dbus_string_get_length (str); 16373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington last_line_end = p; 16383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (p != end) 16393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (*p == '\n' || *p == '\r') 16413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington lines[n_lines].text = dbus_malloc0 (p - last_line_end + 1); 16433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (lines[n_lines].text == NULL) 16443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 16453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington memcpy (lines[n_lines].text, last_line_end, p - last_line_end); 16473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington lines[n_lines].number = n_lines + 1; 16483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++n_lines; 16503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington last_line_end = p + 1; 16523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington prev = p; 16553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++p; 16563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (p != last_line_end) 16593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington memcpy (lines[n_lines].text, last_line_end, p - last_line_end); 16613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++n_lines; 16623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 16643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 16663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonmark_inside_dbus_build_tests (File *f) 16673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 16683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 16693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 16703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int inside_depth; 16713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington inside_depth = 0; 16733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 16743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < f->n_lines) 16753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *l = &f->lines[i]; 167727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington dbus_bool_t is_verbose; 167827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 167927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington is_verbose = strstr (l->text, "_dbus_verbose") != NULL; 16803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 16813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (inside_depth == 0) 16823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington const char *a, *b; 16843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 168527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington a = strstr (l->text, "#if"); 16863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington b = strstr (l->text, "DBUS_BUILD_TESTS"); 168727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (a && b && (a < b)) 16883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington inside_depth += 1; 16893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 16913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 16923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (strstr (l->text, "#if") != NULL) 16933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington inside_depth += 1; 16943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (strstr (l->text, "#endif") != NULL) 16953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington inside_depth -= 1; 16963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 16973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 169827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (inside_depth > 0 || is_verbose) 16993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 17003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Mark the line and its blocks */ 17013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *blink; 17023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington l->inside_dbus_build_tests = TRUE; 17043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington blink = _dbus_list_get_first_link (&l->blocks); 17063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (blink != NULL) 17073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 17083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *b = blink->data; 17093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington b->inside_dbus_build_tests = TRUE; 17113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington blink = _dbus_list_get_next_link (&l->blocks, blink); 17133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 17143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 17153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 17173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 17183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Now mark functions where for all blocks that are associated 17203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington * with a source line, the block is inside_dbus_build_tests. 17213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington */ 17223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&f->functions); 17233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 17243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 17253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 172627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 172727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington /* The issue is that some blocks aren't associated with a source line. 172827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington * Assume they are inside/outside tests according to the source 172927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington * line of the preceding block. For the first block, make it 173027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington * match the first following block with a line associated. 173127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington */ 173227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (func->block_graph[0].lines == NULL) 173327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 173427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington /* find first following line */ 173527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington i = 1; 173627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington while (i < func->n_blocks) 173727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 173827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (func->block_graph[i].lines != NULL) 173927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 174027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->block_graph[0].inside_dbus_build_tests = 174127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->block_graph[i].inside_dbus_build_tests; 174227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington break; 174327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 174427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 174527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington ++i; 174627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 174727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 174827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 174927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington /* Now mark all blocks but the first */ 175027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington i = 1; 175127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington while (i < func->n_blocks) 175227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 175327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (func->block_graph[i].lines == NULL) 175427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 175527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->block_graph[i].inside_dbus_build_tests = 175627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->block_graph[i-1].inside_dbus_build_tests; 175727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 175827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 175927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington ++i; 176027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 17613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 17633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < func->n_blocks) 17643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 17653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington /* Break as soon as any block is not a test block */ 17663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->block_graph[i].lines != NULL && 17673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !func->block_graph[i].inside_dbus_build_tests) 17683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington break; 17693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 17713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 17723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (i == func->n_blocks) 17743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func->inside_dbus_build_tests = TRUE; 17753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 17773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 17783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 17793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 178177eac31aee89346d1399193be6199b9b16fb77afHavoc Penningtonmark_coverage (File *f) 17823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 17833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 17843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 17853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 17873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < f->n_lines) 17883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 17893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *l = &f->lines[i]; 17903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *blink; 17913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks; 17923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks_executed; 17933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 17943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks = 0; 17953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks_executed = 0; 17963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington blink = _dbus_list_get_first_link (&l->blocks); 17973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (blink != NULL) 17983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 17993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *b = blink->data; 18003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (b->exec_count > 0) 18023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks_executed += 1; 18033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks += 1; 18053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington blink = _dbus_list_get_next_link (&l->blocks, blink); 18073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 18083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (n_blocks_executed > 0 && 18103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington n_blocks_executed < n_blocks) 18113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington l->partial = TRUE; 18123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 18143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 18153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&f->functions); 18173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 18183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 18193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 18203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 182177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_test_blocks; 182277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_test_blocks_executed; 182377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_nontest_blocks; 182477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington int n_nontest_blocks_executed; 182577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 182677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_test_blocks = 0; 182777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_test_blocks_executed = 0; 182877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_nontest_blocks = 0; 182977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_nontest_blocks_executed = 0; 18303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 18323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < func->n_blocks) 18333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 183477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (!func->block_graph[i].inside_dbus_build_tests) 183577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington { 183677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_nontest_blocks += 1; 183777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 183877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (func->block_graph[i].exec_count > 0) 183977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_nontest_blocks_executed += 1; 184077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington } 184177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington else 184277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington { 184377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_test_blocks += 1; 184477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 184577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (func->block_graph[i].exec_count > 0) 184677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_test_blocks_executed += 1; 184777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington } 18483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 18503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 185177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 185277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (n_nontest_blocks_executed > 0 && 185377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_nontest_blocks_executed < n_nontest_blocks) 18543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington func->partial = TRUE; 185577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 185677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (n_nontest_blocks_executed == 0 && 185777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington n_nontest_blocks > 0) 185877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->unused = TRUE; 185977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 186077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_test_blocks = n_test_blocks; 186177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_test_blocks_executed = n_test_blocks_executed; 186277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_nontest_blocks = n_nontest_blocks; 186377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_nontest_blocks_executed = n_nontest_blocks_executed; 18643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 18663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 18673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 18683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic File* 18703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonload_c_file (const DBusString *filename) 18713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 18723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString contents; 18733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusError error; 18743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f; 18753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington f = dbus_new0 (File, 1); 18773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (f == NULL) 18783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 18793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_copy_data (filename, &f->name)) 18813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 18823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&contents)) 18843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 18853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_init (&error); 18873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_file_get_contents (&contents, filename, 18893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 18903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 18913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Could not open file: %s\n", 18923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington error.message); 18933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_free (&error); 18943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 18953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 18963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington load_functions_for_c_file (filename, &f->functions); 18983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 18993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington f->n_lines = count_lines_in_string (&contents); 19003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington f->lines = dbus_new0 (Line, f->n_lines); 19013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (f->lines == NULL) 19023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 19033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fill_line_content (&contents, f->lines); 19053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&contents); 19073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington load_block_line_associations (filename, f); 19093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington mark_inside_dbus_build_tests (f); 191177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington mark_coverage (f); 19123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return f; 19143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 19153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef struct Stats Stats; 19173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstruct Stats 19193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 19203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks; 19213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks_executed; 19223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_blocks_inside_dbus_build_tests; 19233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines; /* lines that have blocks on them */ 19253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines_executed; 19263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines_partial; 19273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_lines_inside_dbus_build_tests; 19283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions; 19303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions_executed; 19313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions_partial; 19323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int n_functions_inside_dbus_build_tests; 19333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington}; 19343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic dbus_bool_t 19363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonline_was_executed (Line *l) 19373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 19383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 19393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&l->blocks); 19413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 19423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 19433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *b = link->data; 19443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (b->exec_count > 0) 19463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return TRUE; 19473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&l->blocks, link); 19493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 19503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return FALSE; 19523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 19533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic int 19563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonline_exec_count (Line *l) 19573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 19583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 19593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_int64_t total; 19603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total = 0; 19623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&l->blocks); 19633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 19643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 19653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *b = link->data; 19663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington total += b->exec_count; 19683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&l->blocks, link); 19703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 19713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return total; 19733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 19743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 19763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonmerge_stats_for_file (Stats *stats, 19773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f) 19783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 19793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 19803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 19813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington for (i = 0; i < f->n_lines; ++i) 19833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 19843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *l = &f->lines[i]; 19853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (l->inside_dbus_build_tests) 19873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 19883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_lines_inside_dbus_build_tests += 1; 19893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington continue; 19903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 19913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (line_was_executed (l)) 19933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_lines_executed += 1; 19943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (l->blocks != NULL) 19963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_lines += 1; 19973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 19983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (l->partial) 19993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_lines_partial += 1; 20003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&f->functions); 20033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 20043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 20063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->inside_dbus_build_tests) 20083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_functions_inside_dbus_build_tests += 1; 20093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 20103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_functions += 1; 20123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!func->unused) 20143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_functions_executed += 1; 20153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->partial) 20173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington stats->n_functions_partial += 1; 20183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 202077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington stats->n_blocks_inside_dbus_build_tests += 202177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_test_blocks; 202277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 202377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington stats->n_blocks_executed += 202477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_nontest_blocks_executed; 202577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 202677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington stats->n_blocks += 202777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington func->n_nontest_blocks; 20283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 20303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 20323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington/* The output of this matches gcov exactly ("diff" shows no difference) */ 20343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 20353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_annotated_source_gcov_format (File *f) 20363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 20373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 20383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 20403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < f->n_lines) 20413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *l = &f->lines[i]; 20433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (l->blocks != NULL) 20453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int exec_count; 20473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exec_count = line_exec_count (l); 20493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (exec_count > 0) 20513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%12d %s\n", 20523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exec_count, l->text); 20533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 20543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" ###### %s\n", l->text); 20553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 20573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("\t\t%s\n", l->text); 20593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 20623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 20643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 20663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_annotated_source (File *f) 20673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 20683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 20693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 20713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < f->n_lines) 20723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *l = &f->lines[i]; 20743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (l->inside_dbus_build_tests) 20763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("*"); 20773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 20783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" "); 20793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (l->blocks != NULL) 20813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int exec_count; 20833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exec_count = line_exec_count (l); 20853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (exec_count > 0) 20873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("%12d %s\n", 20883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exec_count, l->text); 20893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 20903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" ###### %s\n", l->text); 20913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 20933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 20943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("\t\t%s\n", l->text); 20953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 20973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 20983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 20993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 21003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 21023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_block_superdetails (File *f) 21033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 21043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 21053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 21063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&f->functions); 21083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 21093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 21113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("=== %s():\n", func->name); 21133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 0; 21153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < func->n_blocks) 21163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Block *b = &func->block_graph[i]; 21183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *l; 21193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" %5d executed %d times%s\n", i, 21213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington (int) b->exec_count, 21223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington b->inside_dbus_build_tests ? 21233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington " [inside DBUS_BUILD_TESTS]" : ""); 21243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington l = _dbus_list_get_first_link (&b->lines); 21263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (l != NULL) 21273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Line *line = l->data; 21293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("4%d\t%s\n", line->number, line->text); 21313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington l = _dbus_list_get_next_link (&b->lines, l); 21333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 21363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 21393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 21413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 21433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_one_file (const DBusString *filename) 21443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 21453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (_dbus_string_ends_with_c_str (filename, ".bb")) 21463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString contents; 21483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusError error; 21493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&contents)) 21513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 21523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_init (&error); 21543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_file_get_contents (&contents, filename, 21563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 21573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Could not open file: %s\n", 21593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington error.message); 21603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_free (&error); 21613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 21623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dump_bb_file (&contents); 21653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&contents); 21673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (_dbus_string_ends_with_c_str (filename, ".bbg")) 21693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString contents; 21713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusError error; 21723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&contents)) 21743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 21753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_init (&error); 21773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_file_get_contents (&contents, filename, 21793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 21803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Could not open file: %s\n", 21823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington error.message); 21833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_free (&error); 21843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 21853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dump_bbg_file (&contents); 21883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&contents); 21903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 21913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (_dbus_string_ends_with_c_str (filename, ".da")) 21923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 21933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString contents; 21943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusError error; 21953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_string_init (&contents)) 21973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 21983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 21993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_init (&error); 22003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_file_get_contents (&contents, filename, 22023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington &error)) 22033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 22043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Could not open file: %s\n", 22053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington error.message); 22063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_error_free (&error); 22073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 22083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 22093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dump_da_file (&contents); 22113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_free (&contents); 22133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 22143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (_dbus_string_ends_with_c_str (filename, ".c")) 22153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 22163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f; 22173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington f = load_c_file (filename); 22193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington print_annotated_source (f); 22213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 22223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 22233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 22243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Unknown file type %s\n", 22253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_get_const_data (filename)); 22263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 22273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 22283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 22293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonstatic void 22313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonprint_untested_functions (File *f) 22323a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 22333a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 22343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington dbus_bool_t found; 22353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington found = FALSE; 22373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&f->functions); 22383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 22393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 22403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 22413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->unused && 22433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !func->inside_dbus_build_tests) 22443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington found = TRUE; 22453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 22473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 22483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!found) 22503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return; 225127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 22523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("Untested functions in %s\n", f->name); 22533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("=======\n"); 22543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&f->functions); 22563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 22573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 22583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Function *func = link->data; 22593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (func->unused && 22613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington !func->inside_dbus_build_tests) 22623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf (" %s\n", func->name); 22633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 22653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 22663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington printf ("\n"); 22683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 22693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 22700cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Penningtonstatic void 227177eac31aee89346d1399193be6199b9b16fb77afHavoc Penningtonprint_poorly_tested_functions (File *f, 227277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington Stats *stats) 227377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington{ 227477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington DBusList *link; 227577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington dbus_bool_t found; 227677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 227777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#define TEST_FRACTION(function) ((function)->n_nontest_blocks_executed / (double) (function)->n_nontest_blocks) 227877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 227977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#define AVERAGE_COVERAGE ((stats)->n_blocks_executed / (double) (stats)->n_blocks) 228077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 228177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington#define POORLY_TESTED(function) (!(function)->unused && \ 228277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington (function)->n_nontest_blocks > 0 && \ 228377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington TEST_FRACTION (function) < AVERAGE_COVERAGE) 228477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 228577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington found = FALSE; 228677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington link = _dbus_list_get_first_link (&f->functions); 228777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington while (link != NULL) 228877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington { 228977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington Function *func = link->data; 229077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 229177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (POORLY_TESTED (func)) 229277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington found = TRUE; 229377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 229477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 229577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington } 229677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 229777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (!found) 229877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington return; 229977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 230077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington printf ("Below average functions in %s\n", f->name); 230177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington printf ("=======\n"); 230277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 230377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington link = _dbus_list_get_first_link (&f->functions); 230477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington while (link != NULL) 230577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington { 230677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington Function *func = link->data; 230777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 230877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington if (POORLY_TESTED (func)) 230977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington printf (" %s (%d%%)\n", func->name, 231077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington (int) (TEST_FRACTION (func) * 100)); 231177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 231277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 231377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington } 231477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 231577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington printf ("\n"); 231677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington} 231777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 231827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonstatic int 231927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonfunc_cmp (const void *a, 232027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington const void *b) 232127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington{ 232227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Function *af = *(Function**) a; 232327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Function *bf = *(Function**) b; 232427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington int a_untested = af->n_nontest_blocks - af->n_nontest_blocks_executed; 232527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington int b_untested = bf->n_nontest_blocks - bf->n_nontest_blocks_executed; 232627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 232727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington /* Sort by number of untested blocks */ 232827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington return b_untested - a_untested; 232927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington} 233027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 233127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonstatic void 233227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Penningtonprint_n_untested_blocks_by_function (File *f, 233327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Stats *stats) 233427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington{ 233527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington DBusList *link; 233627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Function **funcs; 233727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington int n_found; 233827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington int i; 233927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 234027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington n_found = 0; 234127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington link = _dbus_list_get_first_link (&f->functions); 234227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington while (link != NULL) 234327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 234427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Function *func = link->data; 234527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 234627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (func->n_nontest_blocks_executed < 234727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->n_nontest_blocks) 234827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington n_found += 1; 234927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 235027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 235127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 235227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 235327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (n_found == 0) 235427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington return; 235527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 235627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington /* make an array so we can use qsort */ 235727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 235827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington funcs = dbus_new (Function*, n_found); 235927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (funcs == NULL) 236027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington return; 236127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 236227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington i = 0; 236327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington link = _dbus_list_get_first_link (&f->functions); 236427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington while (link != NULL) 236527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 236627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Function *func = link->data; 236727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 236827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington if (func->n_nontest_blocks_executed < 236927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->n_nontest_blocks) 237027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 237127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington funcs[i] = func; 237227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington ++i; 237327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 237427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 237527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington link = _dbus_list_get_next_link (&f->functions, link); 237627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 237727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 237827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington _dbus_assert (i == n_found); 237927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 238027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington qsort (funcs, n_found, sizeof (Function*), 238127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func_cmp); 238227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 238327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf ("Incomplete functions in %s\n", f->name); 238427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf ("=======\n"); 238527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 238627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington i = 0; 238727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington while (i < n_found) 238827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 238927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington Function *func = funcs[i]; 239027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 239127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf (" %s (%d/%d untested blocks)\n", 239227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->name, 239327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->n_nontest_blocks - func->n_nontest_blocks_executed, 239427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington func->n_nontest_blocks); 239527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 239627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington ++i; 239727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 239827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 239927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington dbus_free (funcs); 240027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 240127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf ("\n"); 240227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington} 240327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 240477eac31aee89346d1399193be6199b9b16fb77afHavoc Penningtonstatic void 24050cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Penningtonprint_stats (Stats *stats, 24060cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington const char *of_what) 24070cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington{ 24080cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington int completely; 24090cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24100cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf ("Summary (%s)\n", of_what); 24110cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf ("=======\n"); 24120cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf (" %g%% blocks executed (%d of %d)\n", 24130cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington (stats->n_blocks_executed / (double) stats->n_blocks) * 100.0, 24140cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_blocks_executed, 24150cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_blocks); 24160cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 241727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf (" (ignored %d blocks of test-only/debug-only code)\n", 24180cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_blocks_inside_dbus_build_tests); 24190cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24200cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf (" %g%% functions executed (%d of %d)\n", 24210cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington (stats->n_functions_executed / (double) stats->n_functions) * 100.0, 24220cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_functions_executed, 24230cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_functions); 24240cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24250cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington completely = stats->n_functions_executed - stats->n_functions_partial; 24260cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf (" %g%% functions completely executed (%d of %d)\n", 24270cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington (completely / (double) stats->n_functions) * 100.0, 24280cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington completely, 24290cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_functions); 24300cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 243127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf (" (ignored %d functions of test-only/debug-only code)\n", 24320cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_functions_inside_dbus_build_tests); 24330cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24340cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf (" %g%% lines executed (%d of %d)\n", 24350cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington (stats->n_lines_executed / (double) stats->n_lines) * 100.0, 24360cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_lines_executed, 24370cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_lines); 24380cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24390cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington completely = stats->n_lines_executed - stats->n_lines_partial; 24400cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf (" %g%% lines completely executed (%d of %d)\n", 24410cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington (completely / (double) stats->n_lines) * 100.0, 24420cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington completely, 24430cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_lines); 24440cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 244527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington printf (" (ignored %d lines of test-only/debug-only code)\n", 24460cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats->n_lines_inside_dbus_build_tests); 24470cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24480cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington printf ("\n"); 24490cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington} 24500cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 24513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtontypedef enum 24523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 24533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington MODE_PRINT, 24543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington MODE_REPORT, 24553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington MODE_BLOCKS, 24563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington MODE_GCOV 24573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} Mode; 24583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonint 24603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Penningtonmain (int argc, char **argv) 24613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington{ 24623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusString filename; 24633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington int i; 24643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Mode m; 24653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (argc < 2) 24673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 24683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Must specify files on command line\n"); 24693a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 1; 24703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 24713a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24723a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington m = MODE_PRINT; 24733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington i = 1; 24743a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24753a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (strcmp (argv[i], "--report") == 0) 24763a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 24773a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington m = MODE_REPORT; 24783a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 24793a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 24803a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (strcmp (argv[i], "--blocks") == 0) 24813a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 24823a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington m = MODE_BLOCKS; 24833a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 24843a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 24853a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (strcmp (argv[i], "--gcov") == 0) 24863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 24873a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington m = MODE_GCOV; 24883a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 24893a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 24903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24913a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24923a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (i == argc) 24933a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 24943a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Must specify files on command line\n"); 24953a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 1; 24963a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 24973a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 24983a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (m == MODE_PRINT) 24993a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25003a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < argc) 25013a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25023a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_init_const (&filename, argv[i]); 25033a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25043a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington print_one_file (&filename); 25053a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25063a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 25073a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25083a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25093a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (m == MODE_BLOCKS || m == MODE_GCOV) 25103a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25113a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < argc) 25123a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25133a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f; 25143a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25153a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_init_const (&filename, argv[i]); 25163a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25173a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington f = load_c_file (&filename); 25183a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (m == MODE_BLOCKS) 25203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington print_block_superdetails (f); 25213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (m == MODE_GCOV) 25223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington print_annotated_source_gcov_format (f); 25233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 25253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else if (m == MODE_REPORT) 25283a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25293a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington Stats stats = { 0, }; 25303a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *files; 25313a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington DBusList *link; 25320cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington DBusHashTable *stats_by_dir; 25330cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington DBusHashIter iter; 25343a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25353a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington files = NULL; 25363a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (i < argc) 25373a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25383a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_init_const (&filename, argv[i]); 25393a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25403a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (_dbus_string_ends_with_c_str (&filename, ".c")) 25413a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25423a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f; 25433a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25443a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington f = load_c_file (&filename); 25453a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25463a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington if (!_dbus_list_append (&files, f)) 25473a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington die ("no memory\n"); 25483a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington else 25503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington fprintf (stderr, "Unknown file type %s\n", 25523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington _dbus_string_get_const_data (&filename)); 25533a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington exit (1); 25543a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25553a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25563a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington ++i; 25573a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25583a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25593a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&files); 25603a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 25613a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 25623a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f = link->data; 25633a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25643a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington merge_stats_for_file (&stats, f); 25653a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25663a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&files, link); 25673a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 25683a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25690cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington print_stats (&stats, "all files"); 25703a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25710cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington stats_by_dir = _dbus_hash_table_new (DBUS_HASH_STRING, 25720cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington dbus_free, dbus_free); 25733a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25740cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington link = _dbus_list_get_first_link (&files); 25750cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington while (link != NULL) 25760cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington { 25770cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington File *f = link->data; 25780cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington DBusString dirname; 25790cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington char *dirname_c; 25800cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington Stats *dir_stats; 25810cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 25820cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington _dbus_string_init_const (&filename, f->name); 25830cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 25840cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington if (!_dbus_string_init (&dirname)) 25850cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington die ("no memory\n"); 25863a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25870cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington if (!_dbus_string_get_dirname (&filename, &dirname) || 25880cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington !_dbus_string_copy_data (&dirname, &dirname_c)) 25890cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington die ("no memory\n"); 25903a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 25910cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington dir_stats = _dbus_hash_table_lookup_string (stats_by_dir, 25920cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington dirname_c); 25930cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 25940cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington if (dir_stats == NULL) 25950cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington { 25960cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington dir_stats = dbus_new0 (Stats, 1); 25970cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington if (!_dbus_hash_table_insert_string (stats_by_dir, dirname_c, 25980cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington dir_stats)) 25990cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington die ("no memory\n"); 26000cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington } 26010cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington else 26020cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington dbus_free (dirname_c); 26030cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 26040cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington merge_stats_for_file (dir_stats, f); 26050cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 26060cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington link = _dbus_list_get_next_link (&files, link); 26070cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington } 26080cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 26090cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington _dbus_hash_iter_init (stats_by_dir, &iter); 26100cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington while (_dbus_hash_iter_next (&iter)) 26110cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington { 26120cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington const char *dirname = _dbus_hash_iter_get_string_key (&iter); 26130cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington Stats *dir_stats = _dbus_hash_iter_get_value (&iter); 26140cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 26150cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington print_stats (dir_stats, dirname); 26160cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington } 26170cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington 26180cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington _dbus_hash_table_unref (stats_by_dir); 26193a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 26203a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_first_link (&files); 26213a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington while (link != NULL) 26223a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington { 26233a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington File *f = link->data; 26243a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 26253a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington print_untested_functions (f); 26263a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 26273a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington link = _dbus_list_get_next_link (&files, link); 26280cc7669fb899cfe5beb7e0069fe2a71a08b6abaaHavoc Pennington } 262977eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 263077eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington link = _dbus_list_get_first_link (&files); 263177eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington while (link != NULL) 263277eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington { 263377eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington File *f = link->data; 263477eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 263577eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington print_poorly_tested_functions (f, &stats); 263677eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington 263777eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington link = _dbus_list_get_next_link (&files, link); 263877eac31aee89346d1399193be6199b9b16fb77afHavoc Pennington } 263927b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 264027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington link = _dbus_list_get_first_link (&files); 264127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington while (link != NULL) 264227b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington { 264327b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington File *f = link->data; 264427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 264527b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington print_n_untested_blocks_by_function (f, &stats); 264627b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington 264727b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington link = _dbus_list_get_next_link (&files, link); 264827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington } 26493a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington } 26503a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington 26513a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington return 0; 26523a96e4ffd99ec3f125e1891155ecb751b6e313a1Havoc Pennington} 2653