1
2/*--------------------------------------------------------------------*/
3/*--- Ptrcheck: a pointer-use checker.                             ---*/
4/*--- This file coordinates the h_ and sg_ subtools.               ---*/
5/*---                                                    pc_main.c ---*/
6/*--------------------------------------------------------------------*/
7
8/*
9   This file is part of Ptrcheck, a Valgrind tool for checking pointer
10   use in programs.
11
12   Copyright (C) 2008-2015 OpenWorks Ltd
13      info@open-works.co.uk
14
15   This program is free software; you can redistribute it and/or
16   modify it under the terms of the GNU General Public License as
17   published by the Free Software Foundation; either version 2 of the
18   License, or (at your option) any later version.
19
20   This program is distributed in the hope that it will be useful, but
21   WITHOUT ANY WARRANTY; without even the implied warranty of
22   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23   General Public License for more details.
24
25   You should have received a copy of the GNU General Public License
26   along with this program; if not, write to the Free Software
27   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
28   02111-1307, USA.
29
30   The GNU General Public License is contained in the file COPYING.
31
32   Neither the names of the U.S. Department of Energy nor the
33   University of California nor the names of its contributors may be
34   used to endorse or promote products derived from this software
35   without prior written permission.
36*/
37
38#include "pub_tool_basics.h"
39#include "pub_tool_libcassert.h"
40#include "pub_tool_libcprint.h"
41#include "pub_tool_execontext.h"
42#include "pub_tool_tooliface.h"
43#include "pub_tool_options.h"
44
45#include "sg_main.h"
46#include "pc_common.h"
47#include "h_main.h"
48
49
50//////////////////////////////////////////////////////////////
51//                                                          //
52// main                                                     //
53//                                                          //
54//////////////////////////////////////////////////////////////
55
56static void pc_pre_clo_init(void)
57{
58#if defined(VGO_darwin)
59   // This makes the (all-failing) regtests run much faster.
60   VG_(printf)("SGCheck doesn't work on Darwin yet, sorry.\n");
61   VG_(exit)(1);
62#endif
63#if defined(VGA_s390x)
64   /* fixs390: to be done. */
65   VG_(printf)("SGCheck doesn't work on s390x yet, sorry.\n");
66   VG_(exit)(1);
67#endif
68#if defined(VGA_ppc32) || defined(VGA_ppc64be) || defined(VGA_ppc64le)
69   VG_(printf)("SGCheck doesn't work on PPC yet, sorry.\n");
70   VG_(exit)(1);
71#endif
72#if defined(VGA_arm) || defined(VGA_arm64)
73   VG_(printf)("SGCheck doesn't work on ARM yet, sorry.\n");
74   VG_(exit)(1);
75#endif
76#if defined(VGA_mips32) || defined(VGA_mips64)
77   VG_(printf)("SGCheck doesn't work on MIPS yet, sorry.\n");
78   VG_(exit)(1);
79#endif
80#if defined(VGA_tilegx)
81   VG_(printf)("SGCheck doesn't work on TileGx yet, sorry.\n");
82   VG_(exit)(1);
83#endif
84
85   // Can't change the name until we change the names in suppressions
86   // too.
87   VG_(details_name)            ("exp-sgcheck");
88   VG_(details_version)         (NULL);
89   VG_(details_description)     ("a stack and global array "
90                                 "overrun detector");
91   VG_(details_copyright_author)(
92      "Copyright (C) 2003-2015, and GNU GPL'd, by OpenWorks Ltd et al.");
93   VG_(details_bug_reports_to)  (VG_BUGS_TO);
94   VG_(details_avg_translation_sizeB) ( 496 );
95
96   VG_(basic_tool_funcs)        (sg_post_clo_init,
97                                 h_instrument,
98                                 sg_fini);
99
100   VG_(needs_malloc_replacement)( h_replace_malloc,
101                                  h_replace___builtin_new,
102                                  h_replace___builtin_vec_new,
103                                  h_replace_memalign,
104                                  h_replace_calloc,
105                                  h_replace_free,
106                                  h_replace___builtin_delete,
107                                  h_replace___builtin_vec_delete,
108                                  h_replace_realloc,
109                                  h_replace_malloc_usable_size,
110                                  0 /* no need for client heap redzones */ );
111
112   VG_(needs_var_info)          ();
113
114   VG_(needs_core_errors)       ();
115   VG_(needs_tool_errors)       (pc_eq_Error,
116                                 pc_before_pp_Error,
117                                 pc_pp_Error,
118                                 True,/*show TIDs for errors*/
119                                 pc_update_Error_extra,
120                                 pc_is_recognised_suppression,
121                                 pc_read_extra_suppression_info,
122                                 pc_error_matches_suppression,
123                                 pc_get_error_name,
124                                 pc_get_extra_suppression_info,
125                                 pc_print_extra_suppression_use,
126                                 pc_update_extra_suppression_use);
127
128   VG_(needs_xml_output)        ();
129
130   //VG_(needs_syscall_wrapper)( h_pre_syscall,
131   //                            h_post_syscall );
132
133   VG_(needs_command_line_options)( pc_process_cmd_line_options,
134                                    pc_print_usage,
135                                    pc_print_debug_usage );
136
137   VG_(track_die_mem_stack)        ( sg_die_mem_stack );
138   VG_(track_pre_thread_ll_create) ( sg_pre_thread_ll_create );
139   VG_(track_pre_thread_first_insn)( sg_pre_thread_first_insn );
140
141   VG_(track_new_mem_mmap)         ( sg_new_mem_mmap );
142   VG_(track_new_mem_startup)      ( sg_new_mem_startup);
143   VG_(track_die_mem_munmap)       ( sg_die_mem_munmap );
144
145   /* Really we ought to give handlers for these, to
146      check that syscalls don't read across array boundaries. */
147   /*
148   VG_(track_pre_mem_read)         ( NULL );
149   VG_(track_pre_mem_read_asciiz)  ( NULL );
150   VG_(track_pre_mem_write)        ( NULL );
151   */
152
153   sg_pre_clo_init();
154
155   VG_(clo_vex_control).iropt_unroll_thresh = 0;
156   VG_(clo_vex_control).guest_chase_thresh = 0;
157}
158
159VG_DETERMINE_INTERFACE_VERSION(pc_pre_clo_init)
160
161
162/*--------------------------------------------------------------------*/
163/*--- end                                                pc_main.c ---*/
164/*--------------------------------------------------------------------*/
165