/* For VG_CLO_DEFAULT_LOGPORT and VG_BUGS_TO. */
#include "core.h"
+#include "pub_core_options.h"
/*---------------------------------------------------------------*/
#include "tool.h"
#include "pub_tool_hashtable.h"
#include "pub_tool_mallocfree.h"
+#include "pub_tool_options.h"
#include "pub_tool_tooliface.h"
#include "cg_arch.h"
pub_core_execontext.h \
pub_core_hashtable.h \
pub_core_mallocfree.h \
+ pub_core_options.h \
pub_core_replacemalloc.h\
pub_core_sigframe.h \
pub_core_skiplist.h \
m_execontext.c \
m_hashtable.c \
m_mallocfree.c \
+ m_options.c \
m_skiplist.c \
m_stacktrace.c \
m_tooliface.c \
#define VALGRINDCLO "_VALGRIND_CLO"
-/* ---------------------------------------------------------------------
- Command-line-settable options
- ------------------------------------------------------------------ */
-
-/* Default destination port to be used in logging over a network, if
- none specified. */
-#define VG_CLO_DEFAULT_LOGPORT 1500
-
-/* The max number of suppression files. */
-#define VG_CLO_MAX_SFILES 10
-
/* Application-visible file descriptor limits */
extern Int VG_(fd_soft_limit);
extern Int VG_(fd_hard_limit);
-/* Vex iropt control */
-extern VexControl VG_(clo_vex_control);
-/* Should we stop collecting errors if too many appear? default: YES */
-extern Bool VG_(clo_error_limit);
-/* Enquire about whether to attach to a debugger at errors? default: NO */
-extern Bool VG_(clo_db_attach);
-/* The debugger command? default: whatever gdb ./configure found */
-extern Char* VG_(clo_db_command);
-/* Generating a suppression for each error? default: 0 (NO)
- Other values: 1 (yes, but ask user), 2 (yes, don't ask user) */
-extern Int VG_(clo_gen_suppressions);
-/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
-extern Int VG_(clo_sanity_level);
-/* Automatically attempt to demangle C++ names? default: YES */
-extern Bool VG_(clo_demangle);
-/* Simulate child processes? default: NO */
-extern Bool VG_(clo_trace_children);
-
-/* Where logging output is to be sent to.
-
- With --log-fd (and by default), clo_log_fd holds the file id, and is
- taken from the command line. (fd 2, stderr, is the default.)
- clo_log_name is irrelevant.
-
- With --log-file/--log-file-exactly, clo_log_name holds the log-file
- name, and is taken from the command line. clo_log_fd is then
- made to hold the relevant file id, by opening clo_log_name
- (concatenated with the process ID) for writing.
-
- With --log-socket, clo_log_name holds the hostname:portnumber pair,
- and is taken from the command line. clo_log_fd is then made to hold
- the relevant file handle, by opening a connection to that
- hostname:portnumber pair.
-
- Global default is to set log_to == VgLogTo_Fd and log_fd == 2
- (stderr). */
-extern Int VG_(clo_log_fd);
-extern Char* VG_(clo_log_name);
-
-/* Add timestamps to log messages? default: NO */
-extern Bool VG_(clo_time_stamp);
-
-/* The file descriptor to read for input. default: 0 == stdin */
-extern Int VG_(clo_input_fd);
-/* The number of suppression files specified. */
-extern Int VG_(clo_n_suppressions);
-/* The names of the suppression files. */
-extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
-
-/* DEBUG: print generated code? default: 00000000 ( == NO ) */
-extern Bool VG_(clo_trace_flags);
-/* DEBUG: do bb profiling? default: 00000000 ( == NO ) */
-extern Bool VG_(clo_profile_flags);
-/* DEBUG: if tracing codegen, be quiet until after this bb ( 0 ) */
-extern Int VG_(clo_trace_notbelow);
-/* DEBUG: print system calls? default: NO */
-extern Bool VG_(clo_trace_syscalls);
-/* DEBUG: print signal details? default: NO */
-extern Bool VG_(clo_trace_signals);
-/* DEBUG: print symtab details? default: NO */
-extern Bool VG_(clo_trace_symtab);
-/* DEBUG: print call-frame-info details? default: NO */
-extern Bool VG_(clo_trace_cfi);
-/* DEBUG: print redirection details? default: NO */
-extern Bool VG_(clo_trace_redir);
-/* DEBUG: print thread scheduling events? default: NO */
-extern Bool VG_(clo_trace_sched);
-/* DEBUG: print pthreads calls? default: NO */
-extern Bool VG_(clo_trace_pthreads);
-/* Display gory details for the k'th most popular error. default:
- Infinity. */
-extern Int VG_(clo_dump_error);
-/* Number of parents of a backtrace. Default: 8. */
-extern Int VG_(clo_backtrace_size);
-/* Engage miscellaneous weird hacks needed for some progs. */
-extern Char* VG_(clo_weird_hacks);
-
-/* Track open file descriptors? */
-extern Bool VG_(clo_track_fds);
-
-/* Should we run __libc_freeres at exit? Sometimes causes crashes.
- Default: YES. Note this is subservient to VG_(needs).libc_freeres;
- if the latter says False, then the setting of VG_(clo_weird_hacks)
- is ignored. Ie if a tool says no, I don't want this to run, that
- cannot be overridden from the command line. */
-extern Bool VG_(clo_run_libc_freeres);
-/* Generate branch-prediction hints? */
-extern Bool VG_(clo_branchpred);
-/* Continue stack traces below main()? Default: NO */
-extern Bool VG_(clo_show_below_main);
-/* Test each client pointer dereference to check it's within the
- client address space bounds */
-extern Bool VG_(clo_pointercheck);
-/* Model the pthread library */
-extern Bool VG_(clo_model_pthreads);
-
-/* HACK: Use hacked version of clone for Quadrics Elan3 drivers */
-extern Bool VG_(clo_support_elan3);
-
-/* Should we show VEX emulation warnings? Default: NO */
-extern Bool VG_(clo_show_emwarns);
-
-/* How much does the stack pointer have to change before tools
- consider a stack switch to have happened? Default: 2000000 bytes */
-extern Int VG_(clo_max_stackframe);
-
-/* Set up the libc freeres wrapper */
-extern void VGA_(intercept_libc_freeres_wrapper)(Addr);
-
-// Clean up the client by calling before the final reports
-extern void VGA_(final_tidyup)(ThreadId tid);
-
-// Arch-specific client requests
-extern Bool VGA_(client_requests)(ThreadId tid, UWord *args);
-
/* ---------------------------------------------------------------------
Profiling stuff
------------------------------------------------------------------ */
// Used by leakcheck
extern void VGA_(mark_from_registers)(ThreadId tid, void (*marker)(Addr));
+// Set up the libc freeres wrapper
+extern void VGA_(intercept_libc_freeres_wrapper)(Addr);
+
+// Clean up the client by calling before the final reports
+extern void VGA_(final_tidyup)(ThreadId tid);
+
+// Arch-specific client requests
+extern Bool VGA_(client_requests)(ThreadId tid, UWord *args);
+
// ---------------------------------------------------------------------
// Platform-specific things defined in eg. x86/*.c
*/
#include "core.h"
+#include "pub_core_options.h"
#include "pub_core_tooliface.h"
void VGA_(os_state_clear)(ThreadState *tst)
#include "core.h"
#include "pub_core_aspacemgr.h"
+#include "pub_core_options.h"
#include "pub_core_syscalls.h"
#include "pub_core_tooliface.h"
#include "pub_core_transtab.h"
*/
#include "core.h"
+#include "pub_core_options.h"
#include "demangle.h"
void VG_(demangle) ( Char* orig, Char* result, Int result_size )
#include "core.h"
#include "pub_core_errormgr.h"
#include "pub_core_execontext.h"
+#include "pub_core_options.h"
#include "pub_core_stacktrace.h"
#include "pub_core_tooliface.h"
#include "pub_core_translate.h"
#include "core.h"
#include "pub_core_execontext.h"
+#include "pub_core_options.h"
/*------------------------------------------------------------*/
/*--- Low-level ExeContext storage. ---*/
#include "core.h"
#include "pub_core_aspacemgr.h"
+#include "pub_core_options.h"
#include "valgrind.h"
//zz#include "memcheck/memcheck.h"
*/
#include "core.h"
+#include "pub_core_options.h"
#include "pub_core_replacemalloc.h"
/*------------------------------------------------------------*/
#include "core.h"
#include "pub_core_aspacemgr.h"
+#include "pub_core_options.h"
#include "pub_core_sigframe.h"
#include "pub_core_tooliface.h"
#include "core.h"
#include "pub_core_aspacemgr.h" /* find_segment */
+#include "pub_core_options.h"
#include "pub_core_sigframe.h"
#include "pub_core_tooliface.h"
*/
#include "core.h"
+#include "pub_core_options.h"
#include "pub_core_stacktrace.h"
/*------------------------------------------------------------*/
#ifndef __PRIV_SYSCALLS_H
#define __PRIV_SYSCALLS_H
+#include "pub_core_options.h"
+
// This is ugly, but the alternatives (ie. doing it "properly" with -I options
// and directories and more Makefiles) are even worse.
#if defined(VGP_amd64_linux)
#include "core.h"
#include "pub_core_aspacemgr.h"
+#include "pub_core_options.h"
#include "pub_core_tooliface.h"
#include "pub_core_translate.h"
#include "pub_core_transtab.h"
*/
#include "core.h"
+#include "pub_core_options.h"
#include "pub_core_tooliface.h"
// XXX: this module should not depend on m_translate!
#include "pub_core_translate.h"
--- /dev/null
+
+/*--------------------------------------------------------------------*/
+/*--- Command line options. pub_core_options.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+ This file is part of Valgrind, a dynamic binary instrumentation
+ framework.
+
+ Copyright (C) 2000-2005 Julian Seward
+ jseward@acm.org
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307, USA.
+
+ The GNU General Public License is contained in the file COPYING.
+*/
+
+#ifndef __PUB_CORE_OPTIONS_H
+#define __PUB_CORE_OPTIONS_H
+
+//--------------------------------------------------------------------
+// PURPOSE: This module holds the variables for all command line options,
+// plus some functions and macros for manipulating them. Almost every
+// other module imports this one, if only for VG_(clo_verbosity).
+//--------------------------------------------------------------------
+
+#include "pub_tool_options.h"
+
+/* Default destination port to be used in logging over a network, if
+ none specified. */
+#define VG_CLO_DEFAULT_LOGPORT 1500
+
+/* The max number of suppression files. */
+#define VG_CLO_MAX_SFILES 10
+
+/* Vex iropt control */
+extern VexControl VG_(clo_vex_control);
+/* Should we stop collecting errors if too many appear? default: YES */
+extern Bool VG_(clo_error_limit);
+/* Enquire about whether to attach to a debugger at errors? default: NO */
+extern Bool VG_(clo_db_attach);
+/* The debugger command? default: whatever gdb ./configure found */
+extern Char* VG_(clo_db_command);
+/* Generating a suppression for each error? default: 0 (NO)
+ Other values: 1 (yes, but ask user), 2 (yes, don't ask user) */
+extern Int VG_(clo_gen_suppressions);
+/* Sanity-check level: 0 = none, 1 (default), > 1 = expensive. */
+extern Int VG_(clo_sanity_level);
+/* Automatically attempt to demangle C++ names? default: YES */
+extern Bool VG_(clo_demangle);
+/* Simulate child processes? default: NO */
+extern Bool VG_(clo_trace_children);
+
+/* Where logging output is to be sent to.
+
+ With --log-fd (and by default), clo_log_fd holds the file id, and is
+ taken from the command line. (fd 2, stderr, is the default.)
+ clo_log_name is irrelevant.
+
+ With --log-file/--log-file-exactly, clo_log_name holds the log-file
+ name, and is taken from the command line. clo_log_fd is then
+ made to hold the relevant file id, by opening clo_log_name
+ (concatenated with the process ID) for writing.
+
+ With --log-socket, clo_log_name holds the hostname:portnumber pair,
+ and is taken from the command line. clo_log_fd is then made to hold
+ the relevant file handle, by opening a connection to that
+ hostname:portnumber pair.
+
+ Global default is to set log_to == VgLogTo_Fd and log_fd == 2
+ (stderr). */
+extern Int VG_(clo_log_fd);
+extern Char* VG_(clo_log_name);
+
+/* Add timestamps to log messages? default: NO */
+extern Bool VG_(clo_time_stamp);
+
+/* The file descriptor to read for input. default: 0 == stdin */
+extern Int VG_(clo_input_fd);
+/* The number of suppression files specified. */
+extern Int VG_(clo_n_suppressions);
+/* The names of the suppression files. */
+extern Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
+
+/* DEBUG: print generated code? default: 00000000 ( == NO ) */
+extern Bool VG_(clo_trace_flags);
+/* DEBUG: do bb profiling? default: 00000000 ( == NO ) */
+extern Bool VG_(clo_profile_flags);
+/* DEBUG: if tracing codegen, be quiet until after this bb ( 0 ) */
+extern Int VG_(clo_trace_notbelow);
+/* DEBUG: print system calls? default: NO */
+extern Bool VG_(clo_trace_syscalls);
+/* DEBUG: print signal details? default: NO */
+extern Bool VG_(clo_trace_signals);
+/* DEBUG: print symtab details? default: NO */
+extern Bool VG_(clo_trace_symtab);
+/* DEBUG: print call-frame-info details? default: NO */
+extern Bool VG_(clo_trace_cfi);
+/* DEBUG: print redirection details? default: NO */
+extern Bool VG_(clo_trace_redir);
+/* DEBUG: print thread scheduling events? default: NO */
+extern Bool VG_(clo_trace_sched);
+/* DEBUG: print pthreads calls? default: NO */
+extern Bool VG_(clo_trace_pthreads);
+/* Display gory details for the k'th most popular error. default:
+ Infinity. */
+extern Int VG_(clo_dump_error);
+/* Number of parents of a backtrace. Default: 8. */
+extern Int VG_(clo_backtrace_size);
+/* Engage miscellaneous weird hacks needed for some progs. */
+extern Char* VG_(clo_weird_hacks);
+
+/* Track open file descriptors? */
+extern Bool VG_(clo_track_fds);
+
+/* Should we run __libc_freeres at exit? Sometimes causes crashes.
+ Default: YES. Note this is subservient to VG_(needs).libc_freeres;
+ if the latter says False, then the setting of VG_(clo_weird_hacks)
+ is ignored. Ie if a tool says no, I don't want this to run, that
+ cannot be overridden from the command line. */
+extern Bool VG_(clo_run_libc_freeres);
+/* Generate branch-prediction hints? */
+extern Bool VG_(clo_branchpred);
+/* Continue stack traces below main()? Default: NO */
+extern Bool VG_(clo_show_below_main);
+/* Test each client pointer dereference to check it's within the
+ client address space bounds */
+extern Bool VG_(clo_pointercheck);
+/* Model the pthread library */
+extern Bool VG_(clo_model_pthreads);
+
+/* HACK: Use hacked version of clone for Quadrics Elan3 drivers */
+extern Bool VG_(clo_support_elan3);
+
+/* Should we show VEX emulation warnings? Default: NO */
+extern Bool VG_(clo_show_emwarns);
+
+/* How much does the stack pointer have to change before tools
+ consider a stack switch to have happened? Default: 2000000 bytes */
+extern Int VG_(clo_max_stackframe);
+
+/* Delay startup to allow GDB to be attached? Default: NO */
+extern Bool VG_(clo_wait_for_gdb);
+
+#endif // __PUB_CORE_OPTIONS_H
+
+/*--------------------------------------------------------------------*/
+/*--- end ---*/
+/*--------------------------------------------------------------------*/
#include "core.h"
#include "vg_symtab2.h"
+#include "pub_core_options.h"
/* Structure found in the .debug_line section. */
typedef struct
#include "pub_core_debuglog.h"
#include "pub_core_errormgr.h"
#include "pub_core_execontext.h"
+#include "pub_core_options.h"
#include "pub_core_syscalls.h"
#include "pub_core_tooliface.h"
#include "pub_core_transtab.h"
/*=== Command-line: variables, processing, etc ===*/
/*====================================================================*/
+// See pub_{core,tool}_options.h for explanations of all these.
+
/* Define, and set defaults. */
VexControl VG_(clo_vex_control);
Bool VG_(clo_error_limit) = True;
Int VG_(clo_verbosity) = 1;
Bool VG_(clo_demangle) = True;
Bool VG_(clo_trace_children) = False;
-
-/* See big comment in core.h for meaning of these two. */
-Int VG_(clo_log_fd) = 2;
-Char* VG_(clo_log_name) = NULL;
-
+Int VG_(clo_log_fd) = 2;
+Char* VG_(clo_log_name) = NULL;
Bool VG_(clo_time_stamp) = False;
-
Int VG_(clo_input_fd) = 0; /* stdin */
Int VG_(clo_n_suppressions) = 0;
Char* VG_(clo_suppressions)[VG_CLO_MAX_SFILES];
Char* VG_(clo_weird_hacks) = NULL;
Bool VG_(clo_run_libc_freeres) = True;
Bool VG_(clo_track_fds) = False;
-Bool VG_(clo_show_below_main) = False;
+Bool VG_(clo_show_below_main)= False;
Bool VG_(clo_pointercheck) = True;
Bool VG_(clo_support_elan3) = False;
Bool VG_(clo_branchpred) = False;
Bool VG_(clo_model_pthreads) = False;
Bool VG_(clo_show_emwarns) = False;
Int VG_(clo_max_stackframe) = 2000000;
-
-static Bool VG_(clo_wait_for_gdb) = False;
+Bool VG_(clo_wait_for_gdb) = False;
static void usage ( Bool debug_help )
#include "core.h"
#include "valgrind.h"
+#include "pub_core_options.h"
+
#include <time.h>
#include <sys/time.h>
#include "core.h"
#include "pub_core_aspacemgr.h"
#include "pub_core_debuglog.h" /* VG_(debugLog_vprintf) */
+#include "pub_core_options.h"
#include "pub_core_stacktrace.h"
#include "pub_core_syscalls.h"
#include "pub_core_tooliface.h"
#include "pub_core_aspacemgr.h"
#include "pub_core_skiplist.h"
+#include "pub_core_options.h"
#include "pub_core_transtab.h"
/*------------------------------------------------------------*/
#include "pub_core_dispatch.h"
#include "pub_core_errormgr.h"
+#include "pub_core_options.h"
#include "pub_core_replacemalloc.h"
#include "pub_core_stacktrace.h"
#include "pub_core_syscalls.h"
#include "pub_core_aspacemgr.h"
#include "pub_core_errormgr.h"
+#include "pub_core_options.h"
#include "pub_core_sigframe.h"
#include "pub_core_syscalls.h"
#include "pub_core_tooliface.h"
#include "pub_core_aspacemgr.h"
#include "pub_core_demangle.h"
+#include "pub_core_options.h"
#include "pub_core_tooliface.h"
#include <elf.h> /* ELF defns */
#include "tool.h"
#include "pub_tool_hashtable.h"
#include "pub_tool_mallocfree.h"
+#include "pub_tool_options.h"
#include "pub_tool_replacemalloc.h"
#include "pub_tool_tooliface.h"
pub_tool_execontext.h \
pub_tool_hashtable.h \
pub_tool_mallocfree.h \
+ pub_tool_options.h \
pub_tool_replacemalloc.h \
pub_tool_skiplist.h \
pub_tool_stacktrace.h \
--- /dev/null
+
+/*--------------------------------------------------------------------*/
+/*--- Command line options. pub_tool_options.h ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+ This file is part of Valgrind, a dynamic binary instrumentation
+ framework.
+
+ Copyright (C) 2000-2005 Julian Seward
+ jseward@acm.org
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307, USA.
+
+ The GNU General Public License is contained in the file COPYING.
+*/
+
+#ifndef __PUB_TOOL_OPTIONS_H
+#define __PUB_TOOL_OPTIONS_H
+
+/* Use these for recognising tool command line options -- stops comparing
+ once whitespace is reached. */
+#define VG_CLO_STREQ(s1,s2) (0==VG_(strcmp_ws)((s1),(s2)))
+#define VG_CLO_STREQN(nn,s1,s2) (0==VG_(strncmp_ws)((s1),(s2),(nn)))
+
+/* Higher-level command-line option recognisers; use in if/else chains */
+
+#define VG_BOOL_CLO(qq_arg, qq_option, qq_var) \
+ if (VG_CLO_STREQ(qq_arg, qq_option"=yes")) { (qq_var) = True; } \
+ else if (VG_CLO_STREQ(qq_arg, qq_option"=no")) { (qq_var) = False; }
+
+#define VG_STR_CLO(qq_arg, qq_option, qq_var) \
+ if (VG_CLO_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) { \
+ (qq_var) = &qq_arg[ VG_(strlen)(qq_option)+1 ]; \
+ }
+
+#define VG_NUM_CLO(qq_arg, qq_option, qq_var) \
+ if (VG_CLO_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) { \
+ (qq_var) = (Int)VG_(atoll)( &qq_arg[ VG_(strlen)(qq_option)+1 ] ); \
+ }
+
+/* Bounded integer arg */
+#define VG_BNUM_CLO(qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
+ if (VG_CLO_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) { \
+ (qq_var) = (Int)VG_(atoll)( &qq_arg[ VG_(strlen)(qq_option)+1 ] ); \
+ if ((qq_var) < (qq_lo)) (qq_var) = (qq_lo); \
+ if ((qq_var) > (qq_hi)) (qq_var) = (qq_hi); \
+ }
+
+/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
+extern Int VG_(clo_verbosity);
+
+/* Profile? */
+extern Bool VG_(clo_profile);
+
+/* Call this if a recognised option was bad for some reason.
+ Note: don't use it just because an option was unrecognised -- return 'False'
+ from VG_(tdict).tool_process_cmd_line_option) to indicate that. */
+extern void VG_(bad_option) ( Char* opt );
+
+#endif // __PUB_TOOL_OPTIONS_H
+
+/*--------------------------------------------------------------------*/
+/*--- end ---*/
+/*--------------------------------------------------------------------*/
extern const Char *VG_(libdir);
-/*====================================================================*/
-/*=== Command-line options ===*/
-/*====================================================================*/
-
/* Use this for normal null-termination-style string comparison */
#define VG_STREQ(s1,s2) (s1 != NULL && s2 != NULL \
&& VG_(strcmp)((s1),(s2))==0)
-/* Use these for recognising tool command line options -- stops comparing
- once whitespace is reached. */
-#define VG_CLO_STREQ(s1,s2) (0==VG_(strcmp_ws)((s1),(s2)))
-#define VG_CLO_STREQN(nn,s1,s2) (0==VG_(strncmp_ws)((s1),(s2),(nn)))
-
-/* Higher-level command-line option recognisers; use in if/else chains */
-
-#define VG_BOOL_CLO(qq_arg, qq_option, qq_var) \
- if (VG_CLO_STREQ(qq_arg, qq_option"=yes")) { (qq_var) = True; } \
- else if (VG_CLO_STREQ(qq_arg, qq_option"=no")) { (qq_var) = False; }
-
-#define VG_STR_CLO(qq_arg, qq_option, qq_var) \
- if (VG_CLO_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) { \
- (qq_var) = &qq_arg[ VG_(strlen)(qq_option)+1 ]; \
- }
-
-#define VG_NUM_CLO(qq_arg, qq_option, qq_var) \
- if (VG_CLO_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) { \
- (qq_var) = (Int)VG_(atoll)( &qq_arg[ VG_(strlen)(qq_option)+1 ] ); \
- }
-
-/* Bounded integer arg */
-#define VG_BNUM_CLO(qq_arg, qq_option, qq_var, qq_lo, qq_hi) \
- if (VG_CLO_STREQN(VG_(strlen)(qq_option)+1, qq_arg, qq_option"=")) { \
- (qq_var) = (Int)VG_(atoll)( &qq_arg[ VG_(strlen)(qq_option)+1 ] ); \
- if ((qq_var) < (qq_lo)) (qq_var) = (qq_lo); \
- if ((qq_var) > (qq_hi)) (qq_var) = (qq_hi); \
- }
-
-
-/* Verbosity level: 0 = silent, 1 (default), > 1 = more verbose. */
-extern Int VG_(clo_verbosity);
-
-/* Profile? */
-extern Bool VG_(clo_profile);
-
-/* Call this if a recognised option was bad for some reason.
- Note: don't use it just because an option was unrecognised -- return 'False'
- from VG_(tdict).tool_process_cmd_line_option) to indicate that. */
-extern void VG_(bad_option) ( Char* opt );
-
/* Client args */
extern Int VG_(client_argc);
extern Char** VG_(client_argv);
#include "tool.h"
#include "pub_tool_hashtable.h"
#include "pub_tool_mallocfree.h"
+#include "pub_tool_options.h"
#include "pub_tool_replacemalloc.h"
#include "pub_tool_stacktrace.h"
#include "pub_tool_tooliface.h"
#include "tool.h"
#include "pub_tool_hashtable.h"
#include "pub_tool_mallocfree.h"
+#include "pub_tool_options.h"
#include "pub_tool_replacemalloc.h"
#include "pub_tool_tooliface.h"