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