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