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-2013 OpenWorks Ltd 13 info (at) 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 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-2013, 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