Merge the Ptrcheck tool from branches/PTRCHECK r8619.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@8620 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/exp-ptrcheck/pc_main.c b/exp-ptrcheck/pc_main.c
new file mode 100644
index 0000000..deba949
--- /dev/null
+++ b/exp-ptrcheck/pc_main.c
@@ -0,0 +1,202 @@
+
+/*--------------------------------------------------------------------*/
+/*--- Ptrcheck: a pointer-use checker. ---*/
+/*--- This file coordinates the h_ and sg_ subtools. ---*/
+/*--- pc_main.c ---*/
+/*--------------------------------------------------------------------*/
+
+/*
+ This file is part of Ptrcheck, a Valgrind tool for checking pointer
+ use in programs.
+
+ Copyright (C) 2008-2008 OpenWorks Ltd
+ info@open-works.co.uk
+
+ 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.
+
+ Neither the names of the U.S. Department of Energy nor the
+ University of California nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without prior written permission.
+*/
+
+#include "pub_tool_basics.h"
+#include "pub_tool_libcassert.h"
+#include "pub_tool_execontext.h"
+#include "pub_tool_tooliface.h"
+#include "pub_tool_options.h"
+
+//#include "h_list.h" // Seg
+#include "sg_main.h"
+#include "pc_common.h"
+#include "h_main.h"
+
+
+//////////////////////////////////////////////////////////////
+// //
+// //
+// //
+//////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////
+// //
+// main //
+// //
+//////////////////////////////////////////////////////////////
+
+static void pc_fini ( Int exitcode ) {
+ h_fini( exitcode );
+ sg_fini( exitcode );
+}
+
+static void pc_die_mem_stack ( Addr old_SP, SizeT len ) {
+ /* h_die_mem_stack( old_SP, len ); */
+ sg_die_mem_stack( old_SP, len );
+}
+
+static
+void pc_pre_thread_ll_create ( ThreadId parent, ThreadId child ) {
+ /* h_pre_thread_ll_create(); */
+ sg_pre_thread_ll_create(parent,child);
+}
+
+static void pc_pre_thread_first_insn ( ThreadId tid ) {
+ /* h_pre_thread_first_insn(tid); */
+ sg_pre_thread_first_insn(tid);
+}
+
+static
+void pc_new_mem_mmap ( Addr a, SizeT len,
+ Bool rr, Bool ww, Bool xx, ULong di_handle )
+{
+ h_new_mem_mmap(a, len, rr, ww, xx, di_handle);
+ sg_new_mem_mmap(a, len, rr, ww, xx, di_handle);
+}
+
+static
+void pc_new_mem_startup ( Addr a, SizeT len,
+ Bool rr, Bool ww, Bool xx, ULong di_handle )
+{
+ h_new_mem_startup(a, len, rr, ww, xx, di_handle);
+ sg_new_mem_startup(a, len, rr, ww, xx, di_handle);
+}
+
+static void pc_die_mem_munmap ( Addr a, SizeT len ) {
+ h_die_mem_munmap(a, len);
+ sg_die_mem_munmap(a, len);
+}
+
+static void pc_pre_mem_read ( CorePart part, ThreadId tid, Char* s,
+ Addr base, SizeT size ) {
+ h_pre_mem_access(part, tid, s, base, size );
+ /* sg_pre_mem_read(part, tid, s, base, size); */
+}
+
+static void pc_pre_mem_read_asciiz ( CorePart part, ThreadId tid,
+ Char* s, Addr lo )
+{
+ h_pre_mem_read_asciiz(part, tid, s, lo);
+ /* sg_pre_mem_read_asciiz(part, tid, s, lo); */
+}
+
+static void pc_pre_mem_write ( CorePart part, ThreadId tid, Char* s,
+ Addr base, SizeT size ) {
+ h_pre_mem_access(part, tid, s, base, size);
+ /* sg_pre_mem_write(part, tid, s, base, size); */
+}
+
+static void pc_post_clo_init ( void )
+{
+ h_post_clo_init();
+ sg_post_clo_init();
+}
+
+static void pc_pre_clo_init(void)
+{
+ VG_(details_name) ("exp-ptrcheck");
+ VG_(details_version) (NULL);
+ VG_(details_description) ("a heap, stack & global array "
+ "overrun detector");
+ VG_(details_copyright_author)(
+ "Copyright (C) 2003-2008, and GNU GPL'd, by OpenWorks Ltd et al.");
+ VG_(details_bug_reports_to) (VG_BUGS_TO);
+
+ VG_(basic_tool_funcs) (pc_post_clo_init,
+ h_instrument,
+ pc_fini);
+
+ VG_(needs_malloc_replacement)( h_replace_malloc,
+ h_replace___builtin_new,
+ h_replace___builtin_vec_new,
+ h_replace_memalign,
+ h_replace_calloc,
+ h_replace_free,
+ h_replace___builtin_delete,
+ h_replace___builtin_vec_delete,
+ h_replace_realloc,
+ 0 /* no need for client heap redzones */ );
+
+ VG_(needs_var_info) ();
+
+ VG_(needs_core_errors) ();
+ VG_(needs_tool_errors) (pc_eq_Error,
+ pc_pp_Error,
+ True,/*show TIDs for errors*/
+ pc_update_Error_extra,
+ pc_is_recognised_suppression,
+ pc_read_extra_suppression_info,
+ pc_error_matches_suppression,
+ pc_get_error_name,
+ pc_print_extra_suppression_info);
+
+ VG_(needs_syscall_wrapper)( h_pre_syscall,
+ h_post_syscall );
+
+ VG_(needs_command_line_options)( pc_process_cmd_line_options,
+ pc_print_usage,
+ pc_print_debug_usage );
+
+ VG_(track_die_mem_stack) ( pc_die_mem_stack );
+ VG_(track_pre_thread_ll_create) ( pc_pre_thread_ll_create );
+ VG_(track_pre_thread_first_insn)( pc_pre_thread_first_insn );
+
+ VG_(track_new_mem_mmap) ( pc_new_mem_mmap );
+ VG_(track_new_mem_startup) ( pc_new_mem_startup);
+ VG_(track_die_mem_munmap) ( pc_die_mem_munmap );
+
+ VG_(track_pre_mem_read) ( pc_pre_mem_read );
+ VG_(track_pre_mem_read_asciiz) ( pc_pre_mem_read_asciiz );
+ VG_(track_pre_mem_write) ( pc_pre_mem_write );
+
+ VG_(track_post_reg_write_clientcall_return) ( h_post_reg_write_clientcall );
+ VG_(track_post_reg_write)( h_post_reg_write_demux );
+
+ h_pre_clo_init();
+ sg_pre_clo_init();
+
+ VG_(clo_vex_control).iropt_unroll_thresh = 0;
+ VG_(clo_vex_control).guest_chase_thresh = 0;
+}
+
+VG_DETERMINE_INTERFACE_VERSION(pc_pre_clo_init)
+
+
+/*--------------------------------------------------------------------*/
+/*--- end pc_main.c ---*/
+/*--------------------------------------------------------------------*/