From c935ca8c3ce9bdc3de211e93634da83a6eaacbe2 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Fri, 27 Jun 2014 12:48:01 +0000 Subject: [PATCH] [msan] Add store_context_size= flag. A new flag to control stack trace size for store event (in track-origins=2 mode) independently of malloc_context_size. llvm-svn: 211896 --- compiler-rt/lib/msan/msan.cc | 3 +++ compiler-rt/lib/msan/msan.h | 12 ++++++------ compiler-rt/lib/msan/msan_flags.h | 1 + compiler-rt/test/msan/chained_origin_empty_stack.cc | 3 ++- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc index 58a5af4..6d681b1 100644 --- a/compiler-rt/lib/msan/msan.cc +++ b/compiler-rt/lib/msan/msan.cc @@ -145,6 +145,8 @@ static void ParseFlagsFromString(Flags *f, const char *str) { ParseFlag(str, &f->wrap_signals, "wrap_signals", ""); ParseFlag(str, &f->print_stats, "print_stats", ""); ParseFlag(str, &f->atexit, "atexit", ""); + ParseFlag(str, &f->store_context_size, "store_context_size", ""); + if (f->store_context_size < 1) f->store_context_size = 1; // keep_going is an old name for halt_on_error, // and it has inverse meaning. @@ -177,6 +179,7 @@ static void InitializeFlags(Flags *f, const char *options) { f->print_stats = false; f->atexit = false; f->halt_on_error = !&__msan_keep_going; + f->store_context_size = 20; // Override from user-specified string. if (__msan_default_options) diff --git a/compiler-rt/lib/msan/msan.h b/compiler-rt/lib/msan/msan.h index 2105791..f8b79a7 100644 --- a/compiler-rt/lib/msan/msan.h +++ b/compiler-rt/lib/msan/msan.h @@ -104,12 +104,12 @@ u32 ChainOrigin(u32 id, StackTrace *stack); StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \ common_flags()->fast_unwind_on_malloc) -#define GET_STORE_STACK_TRACE_PC_BP(pc, bp) \ - StackTrace stack; \ - stack.size = 0; \ - if (__msan_get_track_origins() > 1 && msan_inited) \ - GetStackTrace(&stack, common_flags()->malloc_context_size, pc, bp, \ - common_flags()->fast_unwind_on_malloc) +#define GET_STORE_STACK_TRACE_PC_BP(pc, bp) \ + StackTrace stack; \ + stack.size = 0; \ + if (__msan_get_track_origins() > 1 && msan_inited) \ + GetStackTrace(&stack, flags()->store_context_size, pc, bp, \ + common_flags()->fast_unwind_on_malloc) #define GET_FATAL_STACK_TRACE_PC_BP(pc, bp) \ StackTrace stack; \ diff --git a/compiler-rt/lib/msan/msan_flags.h b/compiler-rt/lib/msan/msan_flags.h index e9ea32b..9b93f11 100644 --- a/compiler-rt/lib/msan/msan_flags.h +++ b/compiler-rt/lib/msan/msan_flags.h @@ -30,6 +30,7 @@ struct Flags { bool print_stats; bool halt_on_error; bool atexit; + int store_context_size; // like malloc_context_size, but for uninit stores }; Flags *flags(); diff --git a/compiler-rt/test/msan/chained_origin_empty_stack.cc b/compiler-rt/test/msan/chained_origin_empty_stack.cc index d4c1bc5..36727e3 100644 --- a/compiler-rt/test/msan/chained_origin_empty_stack.cc +++ b/compiler-rt/test/msan/chained_origin_empty_stack.cc @@ -1,5 +1,5 @@ // RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -m64 -O3 %s -o %t && \ -// RUN: MSAN_OPTIONS=malloc_context_size=1 not %run %t 2>&1 | FileCheck %s +// RUN: MSAN_OPTIONS=store_context_size=1 not %run %t 2>&1 | FileCheck %s // Test that stack trace for the intermediate store is not empty. @@ -8,6 +8,7 @@ // CHECK: Uninitialized value was stored to memory at // CHECK: #0 {{.*}} in fn_g +// CHECK-NOT: #1 // CHECK: Uninitialized value was created by an allocation of 'z' in the stack frame of function 'main' // CHECK: #0 {{.*}} in main -- 2.7.4