• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
pc_pre_clo_init(void)56 static 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 
159 VG_DETERMINE_INTERFACE_VERSION(pc_pre_clo_init)
160 
161 
162 /*--------------------------------------------------------------------*/
163 /*--- end                                                pc_main.c ---*/
164 /*--------------------------------------------------------------------*/
165