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_ppc64) 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 81 // Can't change the name until we change the names in suppressions 82 // too. 83 VG_(details_name) ("exp-sgcheck"); 84 VG_(details_version) (NULL); 85 VG_(details_description) ("a stack and global array " 86 "overrun detector"); 87 VG_(details_copyright_author)( 88 "Copyright (C) 2003-2013, and GNU GPL'd, by OpenWorks Ltd et al."); 89 VG_(details_bug_reports_to) (VG_BUGS_TO); 90 VG_(details_avg_translation_sizeB) ( 496 ); 91 92 VG_(basic_tool_funcs) (sg_post_clo_init, 93 h_instrument, 94 sg_fini); 95 96 VG_(needs_malloc_replacement)( h_replace_malloc, 97 h_replace___builtin_new, 98 h_replace___builtin_vec_new, 99 h_replace_memalign, 100 h_replace_calloc, 101 h_replace_free, 102 h_replace___builtin_delete, 103 h_replace___builtin_vec_delete, 104 h_replace_realloc, 105 h_replace_malloc_usable_size, 106 0 /* no need for client heap redzones */ ); 107 108 VG_(needs_var_info) (); 109 110 VG_(needs_core_errors) (); 111 VG_(needs_tool_errors) (pc_eq_Error, 112 pc_before_pp_Error, 113 pc_pp_Error, 114 True,/*show TIDs for errors*/ 115 pc_update_Error_extra, 116 pc_is_recognised_suppression, 117 pc_read_extra_suppression_info, 118 pc_error_matches_suppression, 119 pc_get_error_name, 120 pc_get_extra_suppression_info, 121 pc_print_extra_suppression_use, 122 pc_update_extra_suppression_use); 123 124 VG_(needs_xml_output) (); 125 126 //VG_(needs_syscall_wrapper)( h_pre_syscall, 127 // h_post_syscall ); 128 129 VG_(needs_command_line_options)( pc_process_cmd_line_options, 130 pc_print_usage, 131 pc_print_debug_usage ); 132 133 VG_(track_die_mem_stack) ( sg_die_mem_stack ); 134 VG_(track_pre_thread_ll_create) ( sg_pre_thread_ll_create ); 135 VG_(track_pre_thread_first_insn)( sg_pre_thread_first_insn ); 136 137 VG_(track_new_mem_mmap) ( sg_new_mem_mmap ); 138 VG_(track_new_mem_startup) ( sg_new_mem_startup); 139 VG_(track_die_mem_munmap) ( sg_die_mem_munmap ); 140 141 /* Really we ought to give handlers for these, to 142 check that syscalls don't read across array boundaries. */ 143 /* 144 VG_(track_pre_mem_read) ( NULL ); 145 VG_(track_pre_mem_read_asciiz) ( NULL ); 146 VG_(track_pre_mem_write) ( NULL ); 147 */ 148 149 sg_pre_clo_init(); 150 151 VG_(clo_vex_control).iropt_unroll_thresh = 0; 152 VG_(clo_vex_control).guest_chase_thresh = 0; 153 } 154 155 VG_DETERMINE_INTERFACE_VERSION(pc_pre_clo_init) 156 157 158 /*--------------------------------------------------------------------*/ 159 /*--- end pc_main.c ---*/ 160 /*--------------------------------------------------------------------*/ 161