1a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* 29a0cba4e767f487c2abaa35f95a3452d6bd0ff66njn This file is part of Callgrind, a Valgrind tool for call graph 3a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo profiling programs. 4a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 5ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes Copyright (C) 2002-2017, Josef Weidendorfer (Josef.Weidendorfer@gmx.de) 6a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 79a0cba4e767f487c2abaa35f95a3452d6bd0ff66njn This tool is derived from and contains lot of code from Cachegrind 8ed39800a83baf5bffbe391f3974eb2af0f415f80Elliott Hughes Copyright (C) 2002-2017 Nicholas Nethercote (njn@valgrind.org) 9a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 10a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo This program is free software; you can redistribute it and/or 11a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo modify it under the terms of the GNU General Public License as 12a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo published by the Free Software Foundation; either version 2 of the 13a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo License, or (at your option) any later version. 14a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 15a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo This program is distributed in the hope that it will be useful, but 16a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo WITHOUT ANY WARRANTY; without even the implied warranty of 17a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo General Public License for more details. 19a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 20a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo You should have received a copy of the GNU General Public License 21a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo along with this program; if not, write to the Free Software 22a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 23a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 02111-1307, USA. 24a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 25a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo The GNU General Public License is contained in the file COPYING. 26a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo*/ 27a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 28a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "config.h" // for VG_PREFIX 29a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 30a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#include "global.h" 31a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 32a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 33a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 34a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 35a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Function specific configuration options ---*/ 36a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*------------------------------------------------------------*/ 37a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 38a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Special value for separate_callers: automatic = adaptive */ 39a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CONFIG_AUTO -1 40a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 41a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CONFIG_DEFAULT -1 42a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CONFIG_FALSE 0 43a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define CONFIG_TRUE 1 44a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 45a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Logging configuration for a function */ 46a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _fn_config { 47a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int dump_before; 48a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int dump_after; 49a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int zero_before; 50a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int toggle_collect; 51a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 52a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int skip; /* Handle CALL to this function as JMP (= Skip)? */ 53a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int group; /* don't change caller dependency inside group !=0 */ 54a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int pop_on_jump; 55a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 56a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_callers; /* separate logging dependent on caller */ 57a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int separate_recursions; /* separate logging of rec. levels */ 58a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 59a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 60a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int verbosity; /* Change debug verbosity level while in function */ 61a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 62a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 63a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 64a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Configurations for function name prefix patterns. 65a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Currently, only very limit patterns are possible: 66a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Exact prefix patterns and "*::" are allowed. 67a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * E.g. 68a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - "abc" matches all functions starting with "abc". 69a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - "abc*::def" matches all functions starting with "abc" and 70a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * starting with "def" after the first "::" separator. 71a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * - "*::print(" matches C++ methods "print" in all classes 72a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * without namespace. I.e. "*" doesn't match a "::". 73a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 74a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * We build a trie from patterns, and for a given function, we 75a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * go down the tree and apply all non-default configurations. 76a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 77a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 78a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 79a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#define NODE_DEGREE 30 80a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 81a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* node of compressed trie search structure */ 82a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendotypedef struct _config_node config_node; 83a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostruct _config_node { 84a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Int length; 85a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 86a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_config* config; 87a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node* sub_node[NODE_DEGREE]; 88a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node* next; 89a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node* wild_star; 90a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node* wild_char; 91a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 9219f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar name[1]; 93a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}; 94a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 95a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* root of trie */ 96a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic config_node* fn_configs = 0; 97a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 98a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__ 99a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_config* new_fnc(void) 100a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 1010b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fn_config* fnc = (fn_config*) CLG_MALLOC("cl.clo.nf.1", 1029c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj sizeof(fn_config)); 103a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 1040b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->dump_before = CONFIG_DEFAULT; 1050b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->dump_after = CONFIG_DEFAULT; 1060b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->zero_before = CONFIG_DEFAULT; 1070b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->toggle_collect = CONFIG_DEFAULT; 1080b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->skip = CONFIG_DEFAULT; 1090b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->pop_on_jump = CONFIG_DEFAULT; 1100b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->group = CONFIG_DEFAULT; 1110b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->separate_callers = CONFIG_DEFAULT; 1120b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->separate_recursions = CONFIG_DEFAULT; 113a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 114a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 1150b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo fnc->verbosity = CONFIG_DEFAULT; 116a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 117a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 1180b23d6eb63a4146dfa17304a2e76ce91f4d5e001weidendo return fnc; 119a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 120a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 121a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 12219f91bbaedb4caef8a60ce94b0f507193cc0bc10florianstatic config_node* new_config(const HChar* name, int length) 123a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 124a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo int i; 1259c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj config_node* node = (config_node*) CLG_MALLOC("cl.clo.nc.1", 1269c606bd8634cd6b67bb41fa645b5c639668cfa2dsewardj sizeof(config_node) + length); 127a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 128a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo for(i=0;i<length;i++) { 129a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (name[i] == 0) break; 130a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->name[i] = name[i]; 131a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 132a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->name[i] = 0; 133a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 134a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->length = length; 135a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->config = 0; 136a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo for(i=0;i<NODE_DEGREE;i++) 137a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->sub_node[i] = 0; 138a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->next = 0; 139a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->wild_char = 0; 140a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->wild_star = 0; 141a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 142a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUG(3, " new_config('%s', len %d)\n", node->name, length); 143a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 144a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return node; 145a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 146a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 147a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__ 14819f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool is_wild(HChar n) 149a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 150a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return (n == '*') || (n == '?'); 151a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 152a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 153a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Recursively build up function matching tree (prefix tree). 154a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Returns function config object for pattern <name> 155a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * and starting at tree node <*pnode>. 156a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * 157a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Tree nodes (config_node) are created as needed, 158a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * tree root is stored into <*pnode>, and the created 159a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * leaf (fn_config) for the given pattern is returned. 160a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 16119f91bbaedb4caef8a60ce94b0f507193cc0bc10florianstatic fn_config* get_fnc2(config_node* node, const HChar* name) 162a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 163a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node *new_sub, *n, *nprev; 164a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo int offset, len; 165a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 166a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUG(3, " get_fnc2(%p, '%s')\n", node, name); 167a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 168a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (name[0] == 0) { 169a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (!node->config) node->config = new_fnc(); 170a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return node->config; 171a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 172a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 173a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (is_wild(*name)) { 174a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (*name == '*') { 175a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(name[1] == '*') name++; 176a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub = node->wild_star; 177a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 178a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo else 179a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub = node->wild_char; 180a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 181a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (!new_sub) { 182a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub = new_config(name, 1); 183a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (*name == '*') 184a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->wild_star = new_sub; 185a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo else 186a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->wild_char = new_sub; 187a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 188a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 189a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return get_fnc2( new_sub, name+1); 190a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 191a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 192a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n = node->sub_node[ name[0]%NODE_DEGREE ]; 193a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo nprev = 0; 194a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo len = 0; 195a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(n) { 196a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo for(len=0; name[len] == n->name[len]; len++); 197a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (len>0) break; 198a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo nprev = n; 199a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n = n->next; 200a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 201a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 202a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (!n) { 203a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo len = 1; 204a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(name[len] && (!is_wild(name[len]))) len++; 205a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub = new_config(name, len); 206a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub->next = node->sub_node[ name[0]%NODE_DEGREE ]; 207a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->sub_node[ name[0]%NODE_DEGREE ] = new_sub; 208a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 209a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (name[len] == 0) { 210a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub->config = new_fnc(); 211a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return new_sub->config; 212a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 213a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 214a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* recurse on wildcard */ 215a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return get_fnc2( new_sub, name+len); 216a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 217a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 218a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (len < n->length) { 219a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 220a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* split up the subnode <n> */ 221a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node *new_node; 222a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo int i; 223a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 224a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_node = new_config(n->name, len); 225a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (nprev) 226a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo nprev->next = new_node; 227a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo else 228a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo node->sub_node[ n->name[0]%NODE_DEGREE ] = new_node; 229a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_node->next = n->next; 230a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 231a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_node->sub_node[ n->name[len]%NODE_DEGREE ] = n; 232a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 233a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo for(i=0, offset=len; offset < n->length; i++, offset++) 234a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n->name[i] = n->name[offset]; 235a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n->name[i] = 0; 236a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n->length = i; 237a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 238a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo name += len; 239a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo offset = 0; 240a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(name[offset] && (!is_wild(name[offset]))) offset++; 241a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub = new_config(name, offset); 242a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* this sub_node of new_node could already be set: chain! */ 243a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub->next = new_node->sub_node[ name[0]%NODE_DEGREE ]; 244a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_node->sub_node[ name[0]%NODE_DEGREE ] = new_sub; 245a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 246a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (name[offset]==0) { 247a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub->config = new_fnc(); 248a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return new_sub->config; 249a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 250a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 251a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* recurse on wildcard */ 252a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return get_fnc2( new_sub, name+offset); 253a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 254a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 255a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo name += n->length; 256a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 257a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (name[0] == 0) { 258a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* name and node name are the same */ 259a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (!n->config) n->config = new_fnc(); 260a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return n->config; 261a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 262a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 263a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo offset = 1; 264a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(name[offset] && (!is_wild(name[offset]))) offset++; 265a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 266a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo new_sub = new_config(name, offset); 267141e76df1e812508ebbe820e710a3323891604c0weidendo new_sub->next = n->sub_node[ name[0]%NODE_DEGREE ]; 268141e76df1e812508ebbe820e710a3323891604c0weidendo n->sub_node[ name[0]%NODE_DEGREE ] = new_sub; 269a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 270a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return get_fnc2(new_sub, name+offset); 271a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 272a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 273141e76df1e812508ebbe820e710a3323891604c0weidendostatic void print_config_node(int depth, int hash, config_node* node) 274a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 275a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node* n; 276a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo int i; 277a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 278a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (node != fn_configs) { 27919f91bbaedb4caef8a60ce94b0f507193cc0bc10florian const HChar sp[] = " "; 280a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 281141e76df1e812508ebbe820e710a3323891604c0weidendo if (depth>40) depth=40; 282141e76df1e812508ebbe820e710a3323891604c0weidendo VG_(printf)("%s", sp+40-depth); 283141e76df1e812508ebbe820e710a3323891604c0weidendo if (hash >=0) VG_(printf)(" [hash %2d]", hash); 284141e76df1e812508ebbe820e710a3323891604c0weidendo else if (hash == -2) VG_(printf)(" [wildc ?]"); 285141e76df1e812508ebbe820e710a3323891604c0weidendo else if (hash == -3) VG_(printf)(" [wildc *]"); 286141e76df1e812508ebbe820e710a3323891604c0weidendo VG_(printf)(" '%s' (len %d)\n", node->name, node->length); 287a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 288a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo for(i=0;i<NODE_DEGREE;i++) { 289a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n = node->sub_node[i]; 290a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(n) { 291141e76df1e812508ebbe820e710a3323891604c0weidendo print_config_node(depth+1, i, n); 292a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n = n->next; 293a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 294a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 295141e76df1e812508ebbe820e710a3323891604c0weidendo if (node->wild_char) print_config_node(depth+1, -2, node->wild_char); 296141e76df1e812508ebbe820e710a3323891604c0weidendo if (node->wild_star) print_config_node(depth+1, -3, node->wild_star); 297a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 298a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 299a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* get a function config for a name pattern (from command line) */ 30019f91bbaedb4caef8a60ce94b0f507193cc0bc10florianstatic fn_config* get_fnc(const HChar* name) 301a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 302a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_config* fnc; 303a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 304a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUG(3, " +get_fnc(%s)\n", name); 305a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fn_configs == 0) 306a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_configs = new_config(name, 0); 307a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc = get_fnc2(fn_configs, name); 308a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 309a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUGIF(3) { 310a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUG(3, " -get_fnc(%s):\n", name); 311141e76df1e812508ebbe820e710a3323891604c0weidendo print_config_node(3, -1, fn_configs); 312a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 313a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return fnc; 314a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 315a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 316a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 317a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 318a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic void update_fn_config1(fn_node* fn, fn_config* fnc) 319a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 320a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->dump_before != CONFIG_DEFAULT) 321a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->dump_before = (fnc->dump_before == CONFIG_TRUE); 322a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 323a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->dump_after != CONFIG_DEFAULT) 324a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->dump_after = (fnc->dump_after == CONFIG_TRUE); 325a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 326a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->zero_before != CONFIG_DEFAULT) 327a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->zero_before = (fnc->zero_before == CONFIG_TRUE); 328a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 329a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->toggle_collect != CONFIG_DEFAULT) 330a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->toggle_collect = (fnc->toggle_collect == CONFIG_TRUE); 331a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 332a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->skip != CONFIG_DEFAULT) 333a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->skip = (fnc->skip == CONFIG_TRUE); 334a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 335a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->pop_on_jump != CONFIG_DEFAULT) 336a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->pop_on_jump = (fnc->pop_on_jump == CONFIG_TRUE); 337a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 338a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->group != CONFIG_DEFAULT) 339a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->group = fnc->group; 340a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 341a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->separate_callers != CONFIG_DEFAULT) 342a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->separate_callers = fnc->separate_callers; 343a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 344a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->separate_recursions != CONFIG_DEFAULT) 345a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->separate_recursions = fnc->separate_recursions; 346a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 347a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 348a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fnc->verbosity != CONFIG_DEFAULT) 349a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn->verbosity = fnc->verbosity; 350a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 351a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 352a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 353a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Recursively go down the function matching tree, 354a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * looking for a match to <name>. For every matching leaf, 355a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <fn> is updated with the pattern config. 356a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */ 35719f91bbaedb4caef8a60ce94b0f507193cc0bc10florianstatic void update_fn_config2(fn_node* fn, const HChar* name, 35819f91bbaedb4caef8a60ce94b0f507193cc0bc10florian config_node* node) 359a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 360a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo config_node* n; 361a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 362a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUG(3, " update_fn_config2('%s', node '%s'): \n", 363a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo name, node->name); 364a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if ((*name == 0) && node->config) { 365141e76df1e812508ebbe820e710a3323891604c0weidendo CLG_DEBUG(3, " found!\n"); 366a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo update_fn_config1(fn, node->config); 367a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return; 368a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 369a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 370a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n = node->sub_node[ name[0]%NODE_DEGREE ]; 371a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(n) { 372a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (VG_(strncmp)(name, n->name, n->length)==0) break; 373a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo n = n->next; 374a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 375141e76df1e812508ebbe820e710a3323891604c0weidendo if (n) { 376141e76df1e812508ebbe820e710a3323891604c0weidendo CLG_DEBUG(3, " '%s' matching at hash %d\n", 377141e76df1e812508ebbe820e710a3323891604c0weidendo n->name, name[0]%NODE_DEGREE); 378141e76df1e812508ebbe820e710a3323891604c0weidendo update_fn_config2(fn, name+n->length, n); 379141e76df1e812508ebbe820e710a3323891604c0weidendo } 380a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 381141e76df1e812508ebbe820e710a3323891604c0weidendo if (node->wild_char) { 382141e76df1e812508ebbe820e710a3323891604c0weidendo CLG_DEBUG(3, " skip '%c' for wildcard '?'\n", *name); 383141e76df1e812508ebbe820e710a3323891604c0weidendo update_fn_config2(fn, name+1, node->wild_char); 384141e76df1e812508ebbe820e710a3323891604c0weidendo } 385a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 386a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (node->wild_star) { 387141e76df1e812508ebbe820e710a3323891604c0weidendo CLG_DEBUG(3, " wildcard '*'\n"); 388a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo while(*name) { 389a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo update_fn_config2(fn, name, node->wild_star); 390a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo name++; 391a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 392a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo update_fn_config2(fn, name, node->wild_star); 393a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 394a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 395a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 396a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Update function config according to configs of name prefixes */ 397a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(update_fn_config)(fn_node* fn) 398a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 399a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_DEBUG(3, " update_fn_config('%s')\n", fn->name); 400a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (fn_configs) 401a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo update_fn_config2(fn, fn->name, fn_configs); 402a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 403a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 404a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 405a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/ 406a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Command line processing ---*/ 407a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/ 408a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 40919f91bbaedb4caef8a60ce94b0f507193cc0bc10florianBool CLG_(process_cmd_line_option)(const HChar* arg) 410a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 41119f91bbaedb4caef8a60ce94b0f507193cc0bc10florian const HChar* tmp_str; 412a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 41383df0b67a14425c484d8dda42b53f3ff0b598894njn if VG_BOOL_CLO(arg, "--skip-plt", CLG_(clo).skip_plt) {} 414a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 41583df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--collect-jumps", CLG_(clo).collect_jumps) {} 41683df0b67a14425c484d8dda42b53f3ff0b598894njn /* compatibility alias, deprecated option */ 41783df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--trace-jump", CLG_(clo).collect_jumps) {} 418a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 41983df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--combine-dumps", CLG_(clo).combine_dumps) {} 420a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 42183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--collect-atstart", CLG_(clo).collect_atstart) {} 422a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 42383df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--instr-atstart", CLG_(clo).instrument_atstart) {} 42483df0b67a14425c484d8dda42b53f3ff0b598894njn 42583df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--separate-threads", CLG_(clo).separate_threads) {} 42683df0b67a14425c484d8dda42b53f3ff0b598894njn 42783df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--compress-strings", CLG_(clo).compress_strings) {} 42883df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--compress-mangled", CLG_(clo).compress_mangled) {} 42983df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--compress-pos", CLG_(clo).compress_pos) {} 430a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 43183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO(arg, "--fn-skip", tmp_str) { 43283df0b67a14425c484d8dda42b53f3ff0b598894njn fn_config* fnc = get_fnc(tmp_str); 433a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->skip = CONFIG_TRUE; 434a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 435a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 43683df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO(arg, "--dump-before", tmp_str) { 43783df0b67a14425c484d8dda42b53f3ff0b598894njn fn_config* fnc = get_fnc(tmp_str); 438a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->dump_before = CONFIG_TRUE; 439a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 440a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 44183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO(arg, "--zero-before", tmp_str) { 44283df0b67a14425c484d8dda42b53f3ff0b598894njn fn_config* fnc = get_fnc(tmp_str); 443a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->zero_before = CONFIG_TRUE; 444a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 445a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 44683df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO(arg, "--dump-after", tmp_str) { 44783df0b67a14425c484d8dda42b53f3ff0b598894njn fn_config* fnc = get_fnc(tmp_str); 448a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->dump_after = CONFIG_TRUE; 449a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 450a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 45183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO(arg, "--toggle-collect", tmp_str) { 45283df0b67a14425c484d8dda42b53f3ff0b598894njn fn_config* fnc = get_fnc(tmp_str); 453a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->toggle_collect = CONFIG_TRUE; 454a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* defaults to initial collection off */ 455a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).collect_atstart = False; 456a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 457a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 45883df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_INT_CLO(arg, "--separate-recs", CLG_(clo).separate_recursions) {} 459a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 460a762b0f082d37b630c72d1d6388b34f76c851c76weidendo /* change handling of a jump between functions to ret+call */ 46183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_XACT_CLO(arg, "--pop-on-jump", CLG_(clo).pop_on_jump, True) {} 46283df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO( arg, "--pop-on-jump", tmp_str) { 46383df0b67a14425c484d8dda42b53f3ff0b598894njn fn_config* fnc = get_fnc(tmp_str); 464a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->pop_on_jump = CONFIG_TRUE; 465a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 466a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 467a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 46883df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_INT_CLO(arg, "--ct-verbose", CLG_(clo).verbose) {} 46983df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_INT_CLO(arg, "--ct-vstart", CLG_(clo).verbose_start) {} 470a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 47183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STREQN(12, arg, "--ct-verbose") { 472a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_config* fnc; 47319f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* s; 47483df0b67a14425c484d8dda42b53f3ff0b598894njn UInt n = VG_(strtoll10)(arg+12, &s); 47583df0b67a14425c484d8dda42b53f3ff0b598894njn if ((n <= 0) || *s != '=') return False; 476a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc = get_fnc(s+1); 477a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->verbosity = n; 478a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 479a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 480a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 48183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_XACT_CLO(arg, "--separate-callers=auto", 48283df0b67a14425c484d8dda42b53f3ff0b598894njn CLG_(clo).separate_callers, CONFIG_AUTO) {} 48383df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_INT_CLO( arg, "--separate-callers", 48483df0b67a14425c484d8dda42b53f3ff0b598894njn CLG_(clo).separate_callers) {} 485a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 48683df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STREQN(10, arg, "--fn-group") { 487a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_config* fnc; 48819f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* s; 48983df0b67a14425c484d8dda42b53f3ff0b598894njn UInt n = VG_(strtoll10)(arg+10, &s); 49083df0b67a14425c484d8dda42b53f3ff0b598894njn if ((n <= 0) || *s != '=') return False; 491a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc = get_fnc(s+1); 492a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->group = n; 493a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 494a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 49583df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STREQN(18, arg, "--separate-callers") { 496a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_config* fnc; 49719f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* s; 49883df0b67a14425c484d8dda42b53f3ff0b598894njn UInt n = VG_(strtoll10)(arg+18, &s); 49983df0b67a14425c484d8dda42b53f3ff0b598894njn if ((n <= 0) || *s != '=') return False; 500a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc = get_fnc(s+1); 501a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->separate_callers = n; 502a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 503a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 50483df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STREQN(15, arg, "--separate-recs") { 505a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fn_config* fnc; 50619f91bbaedb4caef8a60ce94b0f507193cc0bc10florian HChar* s; 50783df0b67a14425c484d8dda42b53f3ff0b598894njn UInt n = VG_(strtoll10)(arg+15, &s); 50883df0b67a14425c484d8dda42b53f3ff0b598894njn if ((n <= 0) || *s != '=') return False; 509a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc = get_fnc(s+1); 510a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo fnc->separate_recursions = n; 511a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 512a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 51383df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_STR_CLO(arg, "--callgrind-out-file", CLG_(clo).out_format) {} 51483df0b67a14425c484d8dda42b53f3ff0b598894njn 51583df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--mangle-names", CLG_(clo).mangle_names) {} 51683df0b67a14425c484d8dda42b53f3ff0b598894njn 51783df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--skip-direct-rec", 51883df0b67a14425c484d8dda42b53f3ff0b598894njn CLG_(clo).skip_direct_recursion) {} 51983df0b67a14425c484d8dda42b53f3ff0b598894njn 52083df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--dump-bbs", CLG_(clo).dump_bbs) {} 52183df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--dump-line", CLG_(clo).dump_line) {} 52283df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--dump-instr", CLG_(clo).dump_instr) {} 52383df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--dump-bb", CLG_(clo).dump_bb) {} 52483df0b67a14425c484d8dda42b53f3ff0b598894njn 52583df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_INT_CLO( arg, "--dump-every-bb", CLG_(clo).dump_every_bb) {} 52683df0b67a14425c484d8dda42b53f3ff0b598894njn 52783df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--collect-alloc", CLG_(clo).collect_alloc) {} 52883df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--collect-systime", CLG_(clo).collect_systime) {} 529320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo else if VG_BOOL_CLO(arg, "--collect-bus", CLG_(clo).collect_bus) {} 530320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo /* for option compatibility with cachegrind */ 531320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo else if VG_BOOL_CLO(arg, "--cache-sim", CLG_(clo).simulate_cache) {} 532320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo /* compatibility alias, deprecated option */ 53383df0b67a14425c484d8dda42b53f3ff0b598894njn else if VG_BOOL_CLO(arg, "--simulate-cache", CLG_(clo).simulate_cache) {} 534320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo /* for option compatibility with cachegrind */ 535320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo else if VG_BOOL_CLO(arg, "--branch-sim", CLG_(clo).simulate_branch) {} 536a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo else { 537a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo Bool isCachesimOption = (*CLG_(cachesim).parse_opt)(arg); 538a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 539a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* cache simulator is used if a simulator option is given */ 540a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo if (isCachesimOption) 541a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).simulate_cache = True; 542a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 543a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return isCachesimOption; 544a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo } 545a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 546a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo return True; 547a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 548a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 549a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_usage)(void) 550a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 551a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo VG_(printf)( 552a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n dump creation options:\n" 553cbf4e19974ee274e908e1d1f907d2bd3649a27d5weidendo" --callgrind-out-file=<f> Output file name [callgrind.out.%%p]\n" 554a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-line=no|yes Dump source lines of costs? [yes]\n" 555a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-instr=no|yes Dump instruction address of costs? [no]\n" 556a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --compress-strings=no|yes Compress strings in profile dump? [yes]\n" 557a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --compress-pos=no|yes Compress positions in profile dump? [yes]\n" 558a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --combine-dumps=no|yes Concat all dumps into same file [no]\n" 559a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL 560a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --compress-events=no|yes Compress events in profile dump? [no]\n" 561a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-bb=no|yes Dump basic block address of costs? [no]\n" 562a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-bbs=no|yes Dump basic block info? [no]\n" 563a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-skipped=no|yes Dump info on skipped functions in calls? [no]\n" 564a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --mangle-names=no|yes Mangle separation into names? [yes]\n" 565a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 566a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 567a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n activity options (for interactivity use callgrind_control):\n" 568a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-every-bb=<count> Dump every <count> basic blocks [0=never]\n" 569a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-before=<func> Dump when entering function\n" 570a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --zero-before=<func> Zero all costs when entering function\n" 571a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-after=<func> Dump when leaving function\n" 572a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL 573a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --dump-objs=no|yes Dump static object information [no]\n" 574a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 575a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 576a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n data collection options:\n" 577a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --instr-atstart=no|yes Do instrumentation at callgrind start [yes]\n" 578a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --collect-atstart=no|yes Collect at process/thread start [yes]\n" 579a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --toggle-collect=<func> Toggle collection on enter/leave function\n" 580a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --collect-jumps=no|yes Collect jumps? [no]\n" 581aeb8622e80e51a04e769b00d07b5eef74baca2c3weidendo" --collect-bus=no|yes Collect global bus events? [no]\n" 582a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL 583a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --collect-alloc=no|yes Collect memory allocation info? [no]\n" 584a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 585a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --collect-systime=no|yes Collect system call time info? [no]\n" 586a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 587a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n cost entity separation options:\n" 588a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --separate-threads=no|yes Separate data per thread [no]\n" 589a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --separate-callers=<n> Separate functions by call chain length [0]\n" 590a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --separate-callers<n>=<f> Separate <n> callers for function <f>\n" 5916559fd6374394f3f404d68f35b5d7e4d7049c4d8njn" --separate-recs=<n> Separate function recursions up to level [2]\n" 5926559fd6374394f3f404d68f35b5d7e4d7049c4d8njn" --separate-recs<n>=<f> Separate <n> recursions for function <f>\n" 5936559fd6374394f3f404d68f35b5d7e4d7049c4d8njn" --skip-plt=no|yes Ignore calls to/from PLT sections? [yes]\n" 594a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --skip-direct-rec=no|yes Ignore direct recursions? [yes]\n" 595a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --fn-skip=<function> Ignore calls to/from function?\n" 596a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL 597a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --fn-group<no>=<func> Put function into separation group <no>\n" 598a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 599320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo"\n simulation options:\n" 600320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo" --branch-sim=no|yes Do branch prediction simulation [no]\n" 601320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo" --cache-sim=no|yes Do cache simulation [no]\n" 602a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ); 603a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 604a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo (*CLG_(cachesim).print_opts)(); 605a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 606a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo// VG_(printf)("\n" 607a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo// " For full callgrind documentation, see\n" 608a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo// " "VG_PREFIX"/share/doc/callgrind/html/callgrind.html\n\n"); 609a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 610a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 611a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_debug_usage)(void) 612a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 613a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo VG_(printf)( 614a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 615a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 616a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --ct-verbose=<level> Verbosity of standard debug output [0]\n" 617a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --ct-vstart=<BB number> Only be verbose after basic block [0]\n" 618a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" --ct-verbose<level>=<func> Verbosity while in <func>\n" 619a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#else 620a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo" (none)\n" 621a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 622a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 623a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo ); 624a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 625a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 626a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 627a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_clo_defaults)(void) 628a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{ 629a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Default values for command line arguments */ 630a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 631a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* dump options */ 632cbf4e19974ee274e908e1d1f907d2bd3649a27d5weidendo CLG_(clo).out_format = 0; 633a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).combine_dumps = False; 634a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).compress_strings = True; 635a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).compress_mangled = False; 636a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).compress_events = False; 637a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).compress_pos = True; 638a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).mangle_names = True; 639a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).dump_line = True; 640a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).dump_instr = False; 641a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).dump_bb = False; 642a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).dump_bbs = False; 643a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 644a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).dump_every_bb = 0; 645a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 646a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Collection */ 647a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).separate_threads = False; 648a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).collect_atstart = True; 649a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).collect_jumps = False; 650a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).collect_alloc = False; 651a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).collect_systime = False; 652320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo CLG_(clo).collect_bus = False; 653a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 654a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).skip_plt = True; 655a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).separate_callers = 0; 656a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).separate_recursions = 2; 657a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).skip_direct_recursion = False; 658a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 659a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo /* Instrumentation */ 660a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).instrument_atstart = True; 661a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).simulate_cache = False; 662320705fdb4ee91a69030d2024eec6e9a613c86c4weidendo CLG_(clo).simulate_branch = False; 663a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo 664a762b0f082d37b630c72d1d6388b34f76c851c76weidendo /* Call graph */ 665a762b0f082d37b630c72d1d6388b34f76c851c76weidendo CLG_(clo).pop_on_jump = False; 666a762b0f082d37b630c72d1d6388b34f76c851c76weidendo 667a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG 668a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).verbose = 0; 669a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo CLG_(clo).verbose_start = 0; 670a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif 671a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo} 672