From: Nicholas Nethercote Date: Mon, 16 May 2005 23:31:24 +0000 (+0000) Subject: Added module m_options for holding all the command-line option stuff. X-Git-Tag: svn/VALGRIND_3_0_0~567 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=937a49ea053723094ff818081cdc3e7e80bda8bb;p=thirdparty%2Fvalgrind.git Added module m_options for holding all the command-line option stuff. Perhaps parts of process_cmd_line_option() should go in here, but I've not done that for now. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3751 --- diff --git a/auxprogs/valgrind-listener.c b/auxprogs/valgrind-listener.c index 488b842853..17155c9876 100644 --- a/auxprogs/valgrind-listener.c +++ b/auxprogs/valgrind-listener.c @@ -47,6 +47,7 @@ /* For VG_CLO_DEFAULT_LOGPORT and VG_BUGS_TO. */ #include "core.h" +#include "pub_core_options.h" /*---------------------------------------------------------------*/ diff --git a/cachegrind/cg_main.c b/cachegrind/cg_main.c index 1d134b1e18..036176cc57 100644 --- a/cachegrind/cg_main.c +++ b/cachegrind/cg_main.c @@ -32,6 +32,7 @@ #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" diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am index 1aa8dcb8e4..ed1a206edc 100644 --- a/coregrind/Makefile.am +++ b/coregrind/Makefile.am @@ -47,6 +47,7 @@ noinst_HEADERS = \ 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 \ @@ -80,6 +81,7 @@ stage2_SOURCES = \ m_execontext.c \ m_hashtable.c \ m_mallocfree.c \ + m_options.c \ m_skiplist.c \ m_stacktrace.c \ m_tooliface.c \ diff --git a/coregrind/core.h b/coregrind/core.h index 5a3503f812..c5e170bd69 100644 --- a/coregrind/core.h +++ b/coregrind/core.h @@ -92,136 +92,10 @@ typedef struct _ThreadState ThreadState; #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 ------------------------------------------------------------------ */ @@ -819,6 +693,15 @@ extern Int VGA_(ptrace_setregs_from_tst) ( Int pid, ThreadArchState* arch ); // 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 diff --git a/coregrind/linux/core_os.c b/coregrind/linux/core_os.c index 93a1661191..d0cd7a7139 100644 --- a/coregrind/linux/core_os.c +++ b/coregrind/linux/core_os.c @@ -29,6 +29,7 @@ */ #include "core.h" +#include "pub_core_options.h" #include "pub_core_tooliface.h" void VGA_(os_state_clear)(ThreadState *tst) diff --git a/coregrind/m_aspacemgr/aspacemgr.c b/coregrind/m_aspacemgr/aspacemgr.c index 4e609e02c1..97dd334484 100644 --- a/coregrind/m_aspacemgr/aspacemgr.c +++ b/coregrind/m_aspacemgr/aspacemgr.c @@ -32,6 +32,7 @@ #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" diff --git a/coregrind/m_demangle/demangle.c b/coregrind/m_demangle/demangle.c index b83d431bd5..8c3a03e0dd 100644 --- a/coregrind/m_demangle/demangle.c +++ b/coregrind/m_demangle/demangle.c @@ -29,6 +29,7 @@ */ #include "core.h" +#include "pub_core_options.h" #include "demangle.h" void VG_(demangle) ( Char* orig, Char* result, Int result_size ) diff --git a/coregrind/m_errormgr.c b/coregrind/m_errormgr.c index a636201000..df05c20e26 100644 --- a/coregrind/m_errormgr.c +++ b/coregrind/m_errormgr.c @@ -31,6 +31,7 @@ #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" diff --git a/coregrind/m_execontext.c b/coregrind/m_execontext.c index 59ea65c778..b27ec7db3a 100644 --- a/coregrind/m_execontext.c +++ b/coregrind/m_execontext.c @@ -30,6 +30,7 @@ #include "core.h" #include "pub_core_execontext.h" +#include "pub_core_options.h" /*------------------------------------------------------------*/ /*--- Low-level ExeContext storage. ---*/ diff --git a/coregrind/m_mallocfree.c b/coregrind/m_mallocfree.c index 7bb12c0fcb..f1f930f1d9 100644 --- a/coregrind/m_mallocfree.c +++ b/coregrind/m_mallocfree.c @@ -32,6 +32,7 @@ #include "core.h" #include "pub_core_aspacemgr.h" +#include "pub_core_options.h" #include "valgrind.h" //zz#include "memcheck/memcheck.h" diff --git a/coregrind/m_options.c b/coregrind/m_options.c new file mode 100644 index 0000000000..e69de29bb2 diff --git a/coregrind/m_replacemalloc/replacemalloc_core.c b/coregrind/m_replacemalloc/replacemalloc_core.c index 9ef336e2d3..bb3c7d3b5f 100644 --- a/coregrind/m_replacemalloc/replacemalloc_core.c +++ b/coregrind/m_replacemalloc/replacemalloc_core.c @@ -29,6 +29,7 @@ */ #include "core.h" +#include "pub_core_options.h" #include "pub_core_replacemalloc.h" /*------------------------------------------------------------*/ diff --git a/coregrind/m_sigframe/sigframe-amd64-linux.c b/coregrind/m_sigframe/sigframe-amd64-linux.c index df1e085434..a4e0ce3bf0 100644 --- a/coregrind/m_sigframe/sigframe-amd64-linux.c +++ b/coregrind/m_sigframe/sigframe-amd64-linux.c @@ -31,6 +31,7 @@ #include "core.h" #include "pub_core_aspacemgr.h" +#include "pub_core_options.h" #include "pub_core_sigframe.h" #include "pub_core_tooliface.h" diff --git a/coregrind/m_sigframe/sigframe-x86-linux.c b/coregrind/m_sigframe/sigframe-x86-linux.c index 9df64f9298..884f41b98f 100644 --- a/coregrind/m_sigframe/sigframe-x86-linux.c +++ b/coregrind/m_sigframe/sigframe-x86-linux.c @@ -31,6 +31,7 @@ #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" diff --git a/coregrind/m_stacktrace.c b/coregrind/m_stacktrace.c index 9cb3ffcccc..2c56d66776 100644 --- a/coregrind/m_stacktrace.c +++ b/coregrind/m_stacktrace.c @@ -29,6 +29,7 @@ */ #include "core.h" +#include "pub_core_options.h" #include "pub_core_stacktrace.h" /*------------------------------------------------------------*/ diff --git a/coregrind/m_syscalls/priv_syscalls.h b/coregrind/m_syscalls/priv_syscalls.h index 1d2100fa10..2dc0b1df05 100644 --- a/coregrind/m_syscalls/priv_syscalls.h +++ b/coregrind/m_syscalls/priv_syscalls.h @@ -30,6 +30,8 @@ #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) diff --git a/coregrind/m_translate.c b/coregrind/m_translate.c index 4ec0043a77..fd5b286abb 100644 --- a/coregrind/m_translate.c +++ b/coregrind/m_translate.c @@ -31,6 +31,7 @@ #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" diff --git a/coregrind/m_transtab.c b/coregrind/m_transtab.c index 9c44d4c73e..8846dd4778 100644 --- a/coregrind/m_transtab.c +++ b/coregrind/m_transtab.c @@ -30,6 +30,7 @@ */ #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" diff --git a/coregrind/pub_core_options.h b/coregrind/pub_core_options.h new file mode 100644 index 0000000000..bcdb0e42a8 --- /dev/null +++ b/coregrind/pub_core_options.h @@ -0,0 +1,162 @@ + +/*--------------------------------------------------------------------*/ +/*--- 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 ---*/ +/*--------------------------------------------------------------------*/ diff --git a/coregrind/vg_dwarf.c b/coregrind/vg_dwarf.c index fc7d0c2890..ba73a8fcd9 100644 --- a/coregrind/vg_dwarf.c +++ b/coregrind/vg_dwarf.c @@ -30,6 +30,7 @@ #include "core.h" #include "vg_symtab2.h" +#include "pub_core_options.h" /* Structure found in the .debug_line section. */ typedef struct diff --git a/coregrind/vg_main.c b/coregrind/vg_main.c index 4d09939ef4..0924c84859 100644 --- a/coregrind/vg_main.c +++ b/coregrind/vg_main.c @@ -36,6 +36,7 @@ #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" @@ -1399,6 +1400,8 @@ static void as_closepadfile(int padfile) /*=== 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; @@ -1409,13 +1412,9 @@ Int VG_(clo_sanity_level) = 1; 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]; @@ -1435,15 +1434,14 @@ Int VG_(clo_backtrace_size) = 12; 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 ) diff --git a/coregrind/vg_messages.c b/coregrind/vg_messages.c index 2780d6e9dd..ad5928f3d0 100644 --- a/coregrind/vg_messages.c +++ b/coregrind/vg_messages.c @@ -32,6 +32,8 @@ #include "core.h" #include "valgrind.h" +#include "pub_core_options.h" + #include #include diff --git a/coregrind/vg_mylibc.c b/coregrind/vg_mylibc.c index ec19b6ca0d..206f1e84b8 100644 --- a/coregrind/vg_mylibc.c +++ b/coregrind/vg_mylibc.c @@ -33,6 +33,7 @@ #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" diff --git a/coregrind/vg_redir.c b/coregrind/vg_redir.c index caada36859..1214e5839f 100644 --- a/coregrind/vg_redir.c +++ b/coregrind/vg_redir.c @@ -34,6 +34,7 @@ #include "pub_core_aspacemgr.h" #include "pub_core_skiplist.h" +#include "pub_core_options.h" #include "pub_core_transtab.h" /*------------------------------------------------------------*/ diff --git a/coregrind/vg_scheduler.c b/coregrind/vg_scheduler.c index b44f66ec0c..d6c0a87c00 100644 --- a/coregrind/vg_scheduler.c +++ b/coregrind/vg_scheduler.c @@ -62,6 +62,7 @@ #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" diff --git a/coregrind/vg_signals.c b/coregrind/vg_signals.c index 24f7c09997..c9e36c4a49 100644 --- a/coregrind/vg_signals.c +++ b/coregrind/vg_signals.c @@ -83,6 +83,7 @@ #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" diff --git a/coregrind/vg_symtab2.c b/coregrind/vg_symtab2.c index ab9dcecef0..a05f1308a7 100644 --- a/coregrind/vg_symtab2.c +++ b/coregrind/vg_symtab2.c @@ -35,6 +35,7 @@ #include "pub_core_aspacemgr.h" #include "pub_core_demangle.h" +#include "pub_core_options.h" #include "pub_core_tooliface.h" #include /* ELF defns */ diff --git a/helgrind/hg_main.c b/helgrind/hg_main.c index 09f22527bc..efc76543fe 100644 --- a/helgrind/hg_main.c +++ b/helgrind/hg_main.c @@ -32,6 +32,7 @@ #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" diff --git a/include/Makefile.am b/include/Makefile.am index f831906768..d35e71b46d 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -12,6 +12,7 @@ incinc_HEADERS = \ 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 \ diff --git a/include/pub_tool_options.h b/include/pub_tool_options.h new file mode 100644 index 0000000000..e321635bb2 --- /dev/null +++ b/include/pub_tool_options.h @@ -0,0 +1,78 @@ + +/*--------------------------------------------------------------------*/ +/*--- 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 ---*/ +/*--------------------------------------------------------------------*/ diff --git a/include/tool.h b/include/tool.h index a930165c17..904bc76bf1 100644 --- a/include/tool.h +++ b/include/tool.h @@ -64,55 +64,10 @@ 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); diff --git a/massif/ms_main.c b/massif/ms_main.c index 6f789e9d41..ce5deeef9c 100644 --- a/massif/ms_main.c +++ b/massif/ms_main.c @@ -37,6 +37,7 @@ #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" diff --git a/memcheck/mac_shared.h b/memcheck/mac_shared.h index 9a56bc39fd..1554fc6969 100644 --- a/memcheck/mac_shared.h +++ b/memcheck/mac_shared.h @@ -39,6 +39,7 @@ #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"