+2004-07-20 Frank Ch. Eigler <fche@redhat.com>
+
+ * mf-impl.h (__mf_options): Add ignore_reads and timestamps fields.
+ * mf-runtime.c (options): Give them a name.
+ (__mf_set_default_options): Set them.
+ (__mf_insert_new_object, __mfu_unregister): Optionalize timestamps.
+ (__mf_violation): Warning cleanup.
+ * mf-impl.h (MF_VALIDATE_EXTENT): Support ignore_reads option.
+ * splay-tree.c (splay_tree_delete_helper): Remove obsolete decl.
+
2004-07-15 Frank Ch. Eigler <fche@redhat.com>
g++/15861
/* Emit internal tracing message. */
unsigned verbose_trace;
- /* Support multiple threads. XXX: not yet implemented. */
- /* unsigned multi_threaded; */
-
/* Wipe stack/heap objects upon unwind. */
unsigned wipe_stack;
unsigned wipe_heap;
/* Maintain this many stack frames for contexts. */
unsigned backtrace;
+ /* Ignore read operations even if mode_check is in effect. */
+ unsigned ignore_reads;
+
+ /* Collect register/unregister timestamps. */
+ unsigned timestamps;
+
#ifdef LIBMUDFLAPTH
/* Thread stack size. */
unsigned thread_stack;
}
mudflap_mode;
-
/* How to handle a violation. */
-
enum
{
viol_nop, /* Return control to application. */
extern enum __mf_state_enum __mf_state;
#endif
extern int __mf_starting_p;
-
extern struct __mf_options __mf_opts;
/* ------------------------------------------------------------------------ */
#define MF_VALIDATE_EXTENT(value,size,acc,context) \
do { \
if (UNLIKELY (size > 0 && __MF_CACHE_MISS_P (value, size))) \
+ if (acc == __MF_CHECK_WRITE || ! __mf_opts.ignore_reads) \
__mf_check ((void *) (value), (size), acc, "(" context ")"); \
} while (0)
#define BEGIN_PROTECT(fname, ...) \
__mf_opts.persistent_count = 100;
__mf_opts.crumple_zone = 32;
__mf_opts.backtrace = 4;
+ __mf_opts.timestamps = 1;
__mf_opts.mudflap_mode = mode_check;
__mf_opts.violation_mode = viol_nop;
__mf_opts.heur_std_data = 1;
{"abbreviate",
"abbreviate repetitive listings",
set_option, 1, &__mf_opts.abbreviate},
+ {"timestamps",
+ "track object lifetime timestamps",
+ set_option, 1, &__mf_opts.timestamps},
+ {"ignore-reads",
+ "ignore read accesses - assume okay",
+ set_option, 1, &__mf_opts.ignore_reads},
{"wipe-stack",
"wipe stack objects at unwind",
set_option, 1, &__mf_opts.wipe_stack},
new_obj->name = name;
new_obj->alloc_pc = pc;
#if HAVE_GETTIMEOFDAY
- gettimeofday (& new_obj->alloc_time, NULL);
+ if (__mf_opts.timestamps)
+ gettimeofday (& new_obj->alloc_time, NULL);
#endif
#if LIBMUDFLAPTH
new_obj->alloc_thread = pthread_self ();
old_obj->deallocated_p = 1;
old_obj->dealloc_pc = (uintptr_t) __builtin_return_address (0);
#if HAVE_GETTIMEOFDAY
- gettimeofday (& old_obj->dealloc_time, NULL);
+ if (__mf_opts.timestamps)
+ gettimeofday (& old_obj->dealloc_time, NULL);
#endif
#ifdef LIBMUDFLAPTH
old_obj->dealloc_thread = pthread_self ();
{
unsigned dead_p;
unsigned num_helpful = 0;
- struct timeval now;
+ struct timeval now = { 0, 0 };
#if HAVE_GETTIMEOFDAY
gettimeofday (& now, NULL);
#endif