clo.c revision a17f2a36b7fde9ee842f92412eacbf94b66af59d
1a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*
2a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   This file is part of Callgrind, a Valgrind skin for call graph
3a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   profiling programs.
4a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
5a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   Copyright (C) 2002-2005, Josef Weidendorfer (Josef.Weidendorfer@gmx.de)
6a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
7a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   This skin is derived from and contains lot of code from Cachegrind
8a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   Copyright (C) 2002 Nicholas Nethercote (njn25@cam.ac.uk)
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
92a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  Char name[1];
93a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo};
94a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
95a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* root of trie */
96a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic config_node* fn_configs = 0;
97a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
98a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__
99a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendofn_config* new_fnc(void)
100a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
101a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   fn_config* new = (fn_config*) CLG_MALLOC(sizeof(fn_config));
102a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
103a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->dump_before  = CONFIG_DEFAULT;
104a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->dump_after   = CONFIG_DEFAULT;
105a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->zero_before  = CONFIG_DEFAULT;
106a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->toggle_collect = CONFIG_DEFAULT;
107a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->skip         = CONFIG_DEFAULT;
108a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->pop_on_jump  = CONFIG_DEFAULT;
109a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->group        = CONFIG_DEFAULT;
110a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->separate_callers    = CONFIG_DEFAULT;
111a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->separate_recursions = CONFIG_DEFAULT;
112a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
113a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG
114a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   new->verbosity    = CONFIG_DEFAULT;
115a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
116a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
117a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   return new;
118a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
119a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
120a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
121a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic config_node* new_config(Char* name, int length)
122a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
123a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    int i;
124a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    config_node* node = (config_node*) CLG_MALLOC(sizeof(config_node) + length);
125a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
126a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    for(i=0;i<length;i++) {
127a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      if (name[i] == 0) break;
128a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      node->name[i] = name[i];
129a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
130a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->name[i] = 0;
131a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
132a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->length = length;
133a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->config = 0;
134a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    for(i=0;i<NODE_DEGREE;i++)
135a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	node->sub_node[i] = 0;
136a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->next = 0;
137a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->wild_char = 0;
138a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->wild_star = 0;
139a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
140a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    CLG_DEBUG(3, "   new_config('%s', len %d)\n", node->name, length);
141a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
142a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return node;
143a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
144a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
145a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic __inline__
146a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBool is_wild(Char n)
147a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
148a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  return (n == '*') || (n == '?');
149a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
150a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
151a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Recursively build up function matching tree (prefix tree).
152a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Returns function config object for pattern <name>
153a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * and starting at tree node <*pnode>.
154a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo *
155a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * Tree nodes (config_node) are created as needed,
156a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * tree root is stored into <*pnode>, and the created
157a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * leaf (fn_config) for the given pattern is returned.
158a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */
159a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic fn_config* get_fnc2(config_node* node, Char* name)
160a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
161a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  config_node *new_sub, *n, *nprev;
162a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  int offset, len;
163a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
164a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_DEBUG(3, "  get_fnc2(%p, '%s')\n", node, name);
165a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
166a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (name[0] == 0) {
167a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (!node->config) node->config = new_fnc();
168a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return node->config;
169a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
170a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
171a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (is_wild(*name)) {
172a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (*name == '*') {
173a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      while(name[1] == '*') name++;
174a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      new_sub = node->wild_star;
175a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
176a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    else
177a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      new_sub = node->wild_char;
178a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
179a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (!new_sub) {
180a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      new_sub = new_config(name, 1);
181a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      if (*name == '*')
182a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	node->wild_star = new_sub;
183a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      else
184a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	node->wild_char = new_sub;
185a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
186a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
187a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return get_fnc2( new_sub, name+1);
188a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
189a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
190a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  n = node->sub_node[ name[0]%NODE_DEGREE ];
191a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  nprev = 0;
192a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  len = 0;
193a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  while(n) {
194a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    for(len=0; name[len] == n->name[len]; len++);
195a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (len>0) break;
196a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    nprev = n;
197a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    n = n->next;
198a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
199a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
200a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (!n) {
201a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    len = 1;
202a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    while(name[len] && (!is_wild(name[len]))) len++;
203a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_sub = new_config(name, len);
204a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_sub->next = node->sub_node[ name[0]%NODE_DEGREE ];
205a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    node->sub_node[ name[0]%NODE_DEGREE ] = new_sub;
206a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
207a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (name[len] == 0) {
208a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      new_sub->config = new_fnc();
209a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      return new_sub->config;
210a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
211a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
212a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    /* recurse on wildcard */
213a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return get_fnc2( new_sub, name+len);
214a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
215a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
216a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (len < n->length) {
217a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
218a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    /* split up the subnode <n> */
219a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    config_node *new_node;
220a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    int i;
221a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
222a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_node = new_config(n->name, len);
223a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (nprev)
224a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      nprev->next = new_node;
225a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    else
226a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      node->sub_node[ n->name[0]%NODE_DEGREE ] = new_node;
227a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_node->next = n->next;
228a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
229a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_node->sub_node[ n->name[len]%NODE_DEGREE ] = n;
230a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
231a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    for(i=0, offset=len; offset < n->length; i++, offset++)
232a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      n->name[i] = n->name[offset];
233a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    n->name[i] = 0;
234a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    n->length = i;
235a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
236a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    name += len;
237a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    offset = 0;
238a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    while(name[offset] && (!is_wild(name[offset]))) offset++;
239a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_sub  = new_config(name, offset);
240a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    /* this sub_node of new_node could already be set: chain! */
241a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_sub->next = new_node->sub_node[ name[0]%NODE_DEGREE ];
242a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    new_node->sub_node[ name[0]%NODE_DEGREE ] = new_sub;
243a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
244a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (name[offset]==0) {
245a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      new_sub->config = new_fnc();
246a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      return new_sub->config;
247a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
248a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
249a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    /* recurse on wildcard */
250a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return get_fnc2( new_sub, name+offset);
251a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
252a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
253a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  name += n->length;
254a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
255a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (name[0] == 0) {
256a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    /* name and node name are the same */
257a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (!n->config) n->config = new_fnc();
258a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return n->config;
259a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
260a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
261a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  offset = 1;
262a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  while(name[offset] && (!is_wild(name[offset]))) offset++;
263a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
264a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  new_sub = new_config(name, offset);
265a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  new_sub->next = n->sub_node[ name[offset]%NODE_DEGREE ];
266a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  n->sub_node[ name[offset]%NODE_DEGREE ] = new_sub;
267a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
268a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  return get_fnc2(new_sub, name+offset);
269a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
270a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
271a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic void print_config_node(int s, config_node* node)
272a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
273a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  config_node* n;
274a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  int i;
275a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
276a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (node != fn_configs) {
277a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    char sp[] = "                                        ";
278a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
279a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (s>40) s=40;
280a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    VG_(printf)(sp+40-s);
281a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    VG_(printf)("'%s'/%d\n", node->name, node->length);
282a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
283a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  for(i=0;i<NODE_DEGREE;i++) {
284a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    n = node->sub_node[i];
285a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    while(n) {
286a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      print_config_node(s+1, n);
287a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      n = n->next;
288a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
289a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
290a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (node->wild_char) print_config_node(s+1, node->wild_char);
291a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (node->wild_star) print_config_node(s+1, node->wild_star);
292a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
293a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
294a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* get a function config for a name pattern (from command line) */
295a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic fn_config* get_fnc(Char* name)
296a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
297a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  fn_config* fnc;
298a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
299a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_DEBUG(3, " +get_fnc(%s)\n", name);
300a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  if (fn_configs == 0)
301a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    fn_configs = new_config(name, 0);
302a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  fnc =  get_fnc2(fn_configs, name);
303a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
304a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_DEBUGIF(3) {
305a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    CLG_DEBUG(3, " -get_fnc(%s):\n", name);
306a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    print_config_node(3, fn_configs);
307a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  }
308a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  return fnc;
309a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
310a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
311a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
312a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
313a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic void update_fn_config1(fn_node* fn, fn_config* fnc)
314a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
315a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->dump_before != CONFIG_DEFAULT)
316a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->dump_before = (fnc->dump_before == CONFIG_TRUE);
317a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
318a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->dump_after != CONFIG_DEFAULT)
319a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->dump_after = (fnc->dump_after == CONFIG_TRUE);
320a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
321a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->zero_before != CONFIG_DEFAULT)
322a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->zero_before = (fnc->zero_before == CONFIG_TRUE);
323a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
324a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->toggle_collect != CONFIG_DEFAULT)
325a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->toggle_collect = (fnc->toggle_collect == CONFIG_TRUE);
326a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
327a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->skip != CONFIG_DEFAULT)
328a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->skip = (fnc->skip == CONFIG_TRUE);
329a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
330a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->pop_on_jump != CONFIG_DEFAULT)
331a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->pop_on_jump = (fnc->pop_on_jump == CONFIG_TRUE);
332a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
333a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->group != CONFIG_DEFAULT)
334a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->group = fnc->group;
335a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
336a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->separate_callers != CONFIG_DEFAULT)
337a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->separate_callers = fnc->separate_callers;
338a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
339a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->separate_recursions != CONFIG_DEFAULT)
340a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->separate_recursions = fnc->separate_recursions;
341a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
342a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG
343a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fnc->verbosity != CONFIG_DEFAULT)
344a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	fn->verbosity = fnc->verbosity;
345a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
346a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
347a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
348a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Recursively go down the function matching tree,
349a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * looking for a match to <name>. For every matching leaf,
350a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo * <fn> is updated with the pattern config.
351a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo */
352a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic void update_fn_config2(fn_node* fn, Char* name, config_node* node)
353a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
354a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    config_node* n;
355a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
356a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    CLG_DEBUG(3, "  update_fn_config2('%s', node '%s'): \n",
357a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	     name, node->name);
358a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if ((*name == 0) && node->config) {
359a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      CLG_DEBUG(3, "Found!\n");
360a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      update_fn_config1(fn, node->config);
361a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      return;
362a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
363a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
364a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    n = node->sub_node[ name[0]%NODE_DEGREE ];
365a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    while(n) {
366a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      if (VG_(strncmp)(name, n->name, n->length)==0) break;
367a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      n = n->next;
368a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
369a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (n) update_fn_config2(fn, name+n->length, n);
370a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
371a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (node->wild_char)
372a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      update_fn_config2(fn, name+1, node->wild_char);
373a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
374a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (node->wild_star) {
375a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      while(*name) {
376a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	update_fn_config2(fn, name, node->wild_star);
377a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	name++;
378a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      }
379a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      update_fn_config2(fn, name, node->wild_star);
380a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
381a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
382a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
383a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/* Update function config according to configs of name prefixes */
384a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(update_fn_config)(fn_node* fn)
385a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
386a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    CLG_DEBUG(3, "  update_fn_config('%s')\n", fn->name);
387a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (fn_configs)
388a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo      update_fn_config2(fn, fn->name, fn_configs);
389a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
390a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
391a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
392a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/
393a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--- Command line processing                                      ---*/
394a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo/*--------------------------------------------------------------------*/
395a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
396a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic Char* getUInt(Char* s, UInt* pn)
397a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
398a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    UInt n = 0;
399a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    while((*s >='0') && (*s <='9')) {
400a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	n = 10*n + (*s-'0');
401a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	s++;
402a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
403a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (pn) *pn = n;
404a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return s;
405a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
406a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
407a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo__attribute__((unused))
408a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendostatic UWord getUWord(Char* s)
409a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
410a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    UWord n = 0;
411a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    Bool isHex = False;
412a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
413a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if ((s[0] == '0') && (s[1] == 'x')) {
414a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	isHex = True;
415a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	s += 2;
416a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
417a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
418a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    if (!isHex) {
419a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	while((*s >='0') && (*s <='9')) {
420a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    n = 10*n + (*s-'0');
421a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    s++;
422a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	}
423a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
424a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    else {
425a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	while(1) {
426a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    if ((*s >='0') && (*s <='9')) {
427a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		n = 16*n + (*s-'0');
428a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		s++;
429a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		continue;
430a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    }
431a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    if ((*s >='a') && (*s <='f')) {
432a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		n = 16*n + (*s-'a'+10);
433a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		s++;
434a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		continue;
435a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    }
436a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    if ((*s >='A') && (*s <='F')) {
437a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		n = 16*n + (*s-'A'+10);
438a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		s++;
439a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo		continue;
440a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    }
441a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	    break;
442a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	}
443a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    }
444a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
445a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    return n;
446a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
447a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
448a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendoBool CLG_(process_cmd_line_option)(Char* arg)
449a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
450a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   if (0 == VG_(strcmp)(arg, "--skip-plt=yes"))
451a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).skip_plt = True;
452a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--skip-plt=no"))
453a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).skip_plt = False;
454a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
455a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-jumps=yes"))
456a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_jumps = True;
457a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-jumps=no"))
458a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_jumps = False;
459a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   /* compatibility alias, deprecated option */
460a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--trace-jump=yes"))
461a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_jumps = True;
462a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--trace-jump=no"))
463a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_jumps = False;
464a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
465a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--combine-dumps=yes"))
466a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).combine_dumps = True;
467a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--combine-dumps=no"))
468a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).combine_dumps = False;
469a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
470a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-atstart=yes"))
471a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_atstart = True;
472a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-atstart=no"))
473a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_atstart = False;
474a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
475a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--instr-atstart=yes"))
476a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).instrument_atstart = True;
477a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--instr-atstart=no"))
478a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).instrument_atstart = False;
479a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
480a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--separate-threads=yes"))
481a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).separate_threads = True;
482a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--separate-threads=no"))
483a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).separate_threads = False;
484a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
485a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--compress-strings=yes"))
486a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).compress_strings = True;
487a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--compress-strings=no"))
488a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).compress_strings = False;
489a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
490a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--compress-mangled=yes"))
491a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).compress_mangled = True;
492a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--compress-mangled=no"))
493a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).compress_mangled = False;
494a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
495a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--compress-pos=yes"))
496a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).compress_pos = True;
497a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--compress-pos=no"))
498a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).compress_pos = False;
499a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
500a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--fn-skip=", 10)) {
501a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc = get_fnc(arg+10);
502a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->skip = CONFIG_TRUE;
503a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
504a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
505a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--dump-before=", 14)) {
506a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc = get_fnc(arg+14);
507a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->dump_before = CONFIG_TRUE;
508a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
509a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
510a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--zero-before=", 14)) {
511a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc = get_fnc(arg+14);
512a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->zero_before = CONFIG_TRUE;
513a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
514a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
515a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--dump-after=", 13)) {
516a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc = get_fnc(arg+13);
517a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->dump_after = CONFIG_TRUE;
518a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
519a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
520a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--toggle-collect=", 17)) {
521a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc = get_fnc(arg+17);
522a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->toggle_collect = CONFIG_TRUE;
523a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       /* defaults to initial collection off */
524a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_atstart = False;
525a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
526a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
527a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--separate-recs=", 16))
528a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo        CLG_(clo).separate_recursions = (Int)VG_(atoll)(&arg[16]);
529a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
530a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   /* workaround to find runtime_resolve (needs special handling) */
531a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--pop-on-jump=", 14)) {
532a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc = get_fnc(arg+14);
533a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->pop_on_jump = CONFIG_TRUE;
534a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
535a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
536a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG
537a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--ct-verbose=", 13))
538a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo        CLG_(clo).verbose = (Int)VG_(atoll)(&arg[13]);
539a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
540a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--ct-vstart=", 12))
541a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo        CLG_(clo).verbose_start = (ULong)VG_(atoll)(&arg[12]);
542a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
543a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--ct-verbose", 12)) {
544a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       UInt n;
545a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc;
546a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       Char* s = getUInt(arg+12, &n);
547a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       if ((n == 0) || *s != '=') return False;
548a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc = get_fnc(s+1);
549a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->verbosity = n;
550a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
551a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
552a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
553a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--separate-callers=", 19)) {
554a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo     if (0 == VG_(strcmp)(arg+19, "auto"))
555a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).separate_callers = CONFIG_AUTO;
556a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo     else
557a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).separate_callers = (Int)VG_(atoll)(&arg[19]);
558a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
559a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
560a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--fn-group", 10)) {
561a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       UInt n;
562a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc;
563a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       Char* s = getUInt(arg+10, &n);
564a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       if ((n == 0) || *s != '=') return False;
565a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc = get_fnc(s+1);
566a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->group = n;
567a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
568a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
569a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--separate-callers", 18)) {
570a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       UInt n;
571a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc;
572a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       Char* s = getUInt(arg+18, &n);
573a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       if ((n == 0) || *s != '=') return False;
574a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc = get_fnc(s+1);
575a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->separate_callers = n;
576a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
577a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
578a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--separate-recs", 15)) {
579a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       UInt n;
580a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fn_config* fnc;
581a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       Char* s = getUInt(arg+15, &n);
582a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       if ((n == 0) || *s != '=') return False;
583a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc = get_fnc(s+1);
584a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       fnc->separate_recursions = n;
585a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
586a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
587a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--base=", 7))
588a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).filename_base = VG_(strdup)(arg+7);
589a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
590a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--mangle-names=yes"))
591a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).mangle_names = True;
592a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--mangle-names=no"))
593a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).mangle_names = False;
594a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
595a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--skip-direct-rec=yes"))
596a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).skip_direct_recursion = True;
597a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--skip-direct-rec=no"))
598a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).skip_direct_recursion = False;
599a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
600a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-bbs=yes"))
601a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_bbs = True;
602a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-bbs=no"))
603a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_bbs = False;
604a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
605a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-line=yes"))
606a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_line = True;
607a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-line=no"))
608a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_line = False;
609a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
610a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-instr=yes"))
611a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_instr = True;
612a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-instr=no"))
613a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_instr = False;
614a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
615a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-bb=yes"))
616a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_bb = True;
617a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--dump-bb=no"))
618a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).dump_bb = False;
619a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
620a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strncmp)(arg, "--dump-every-bb=", 16))
621a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo        CLG_(clo).dump_every_bb = (Int)VG_(atoll)(&arg[16]);
622a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
623a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
624a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-alloc=yes"))
625a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_alloc = True;
626a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-alloc=no"))
627a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_alloc = False;
628a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
629a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-systime=yes"))
630a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_systime = True;
631a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--collect-systime=no"))
632a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).collect_systime = False;
633a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
634a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--simulate-cache=yes"))
635a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).simulate_cache = True;
636a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else if (0 == VG_(strcmp)(arg, "--simulate-cache=no"))
637a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       CLG_(clo).simulate_cache = False;
638a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
639a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   else {
640a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       Bool isCachesimOption = (*CLG_(cachesim).parse_opt)(arg);
641a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
642a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       /* cache simulator is used if a simulator option is given */
643a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       if (isCachesimOption)
644a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo	   CLG_(clo).simulate_cache = True;
645a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
646a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo       return isCachesimOption;
647a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   }
648a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
649a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   return True;
650a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
651a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
652a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_usage)(void)
653a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
654a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   VG_(printf)(
655a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n   dump creation options:\n"
656a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --base=<prefix>           Prefix for profile files [" DEFAULT_DUMPNAME "]\n"
657a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-line=no|yes        Dump source lines of costs? [yes]\n"
658a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-instr=no|yes       Dump instruction address of costs? [no]\n"
659a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --compress-strings=no|yes Compress strings in profile dump? [yes]\n"
660a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --compress-pos=no|yes     Compress positions in profile dump? [yes]\n"
661a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --combine-dumps=no|yes    Concat all dumps into same file [no]\n"
662a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL
663a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --compress-events=no|yes  Compress events in profile dump? [no]\n"
664a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-bb=no|yes          Dump basic block address of costs? [no]\n"
665a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-bbs=no|yes         Dump basic block info? [no]\n"
666a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-skipped=no|yes     Dump info on skipped functions in calls? [no]\n"
667a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --mangle-names=no|yes     Mangle separation into names? [yes]\n"
668a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
669a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
670a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n   activity options (for interactivity use callgrind_control):\n"
671a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-every-bb=<count>   Dump every <count> basic blocks [0=never]\n"
672a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-before=<func>      Dump when entering function\n"
673a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --zero-before=<func>      Zero all costs when entering function\n"
674a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-after=<func>       Dump when leaving function\n"
675a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL
676a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --dump-objs=no|yes        Dump static object information [no]\n"
677a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
678a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
679a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n   data collection options:\n"
680a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --instr-atstart=no|yes    Do instrumentation at callgrind start [yes]\n"
681a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --collect-atstart=no|yes  Collect at process/thread start [yes]\n"
682a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --toggle-collect=<func>   Toggle collection on enter/leave function\n"
683a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --collect-jumps=no|yes    Collect jumps? [no]\n"
684a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL
685a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --collect-alloc=no|yes    Collect memory allocation info? [no]\n"
686a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
687a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --collect-systime=no|yes  Collect system call time info? [no]\n"
688a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
689a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"\n   cost entity separation options:\n"
690a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --separate-threads=no|yes Separate data per thread [no]\n"
691a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --separate-callers=<n>    Separate functions by call chain length [0]\n"
692a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --separate-recs=<n>       Separate function recursions upto level [2]\n"
693a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --skip-plt=no|yes         Ignore calls to/from PLT sections? [yes]\n"
694a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --separate-recs<n>=<f>    Separate <n> recursions for function <f>\n"
695a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --separate-callers<n>=<f> Separate <n> callers for function <f>\n"
696a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --skip-direct-rec=no|yes  Ignore direct recursions? [yes]\n"
697a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --fn-skip=<function>      Ignore calls to/from function?\n"
698a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_EXPERIMENTAL
699a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --fn-group<no>=<func>     Put function into separation group <no>\n"
700a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
701a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    );
702a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
703a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo   (*CLG_(cachesim).print_opts)();
704a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
705a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo//   VG_(printf)("\n"
706a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo//	       "  For full callgrind documentation, see\n"
707a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo//	       "  "VG_PREFIX"/share/doc/callgrind/html/callgrind.html\n\n");
708a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
709a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
710a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(print_debug_usage)(void)
711a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
712a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    VG_(printf)(
713a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
714a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG
715a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --ct-verbose=<level>       Verbosity of standard debug output [0]\n"
716a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --ct-vstart=<BB number>    Only be verbose after basic block [0]\n"
717a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    --ct-verbose<level>=<func> Verbosity while in <func>\n"
718a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#else
719a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo"    (none)\n"
720a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
721a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
722a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo    );
723a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
724a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
725a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
726a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendovoid CLG_(set_clo_defaults)(void)
727a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo{
728a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  /* Default values for command line arguments */
729a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
730a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  /* dump options */
731a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).filename_base    = 0;
732a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).combine_dumps    = False;
733a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).compress_strings = True;
734a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).compress_mangled = False;
735a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).compress_events  = False;
736a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).compress_pos     = True;
737a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).mangle_names     = True;
738a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).dump_line        = True;
739a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).dump_instr       = False;
740a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).dump_bb          = False;
741a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).dump_bbs         = False;
742a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
743a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).dump_every_bb    = 0;
744a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
745a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  /* Collection */
746a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).separate_threads = False;
747a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).collect_atstart  = True;
748a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).collect_jumps    = False;
749a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).collect_alloc    = False;
750a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).collect_systime  = False;
751a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
752a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).skip_plt         = True;
753a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).separate_callers = 0;
754a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).separate_recursions = 2;
755a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).skip_direct_recursion = False;
756a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
757a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  /* Instrumentation */
758a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).instrument_atstart = True;
759a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).simulate_cache = False;
760a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo
761a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#if CLG_ENABLE_DEBUG
762a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).verbose = 0;
763a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo  CLG_(clo).verbose_start = 0;
764a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo#endif
765a17f2a36b7fde9ee842f92412eacbf94b66af59dweidendo}
766