diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-03-14 11:47:03 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-03-14 11:47:03 +0000 |
commit | 58b52b5efb7641b27c1728be0946889f335d83e1 (patch) | |
tree | 068139f62875a972c2180c9f0d37481023c0f338 /lib | |
parent | 7cbbb2943527ff852bdace822c8592cfc7e450d7 (diff) |
[msan] Options for switching between fast and cfi unwinders in run time.
Does not change default behavior.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@177057 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/msan/msan.cc | 9 | ||||
-rw-r--r-- | lib/msan/msan.h | 2 | ||||
-rw-r--r-- | lib/msan/msan_flags.h | 4 |
3 files changed, 12 insertions, 3 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index c1b21430f..a1f8d0fb9 100644 --- a/lib/msan/msan.cc +++ b/lib/msan/msan.cc @@ -127,6 +127,8 @@ static void ParseFlagsFromString(Flags *f, const char *str) { ParseFlag(str, &f->report_umrs, "report_umrs"); ParseFlag(str, &f->verbosity, "verbosity"); ParseFlag(str, &f->strip_path_prefix, "strip_path_prefix"); + ParseFlag(str, &f->fast_unwind_on_fatal, "fast_unwind_on_fatal"); + ParseFlag(str, &f->fast_unwind_on_malloc, "fast_unwind_on_malloc"); } static void InitializeFlags(Flags *f, const char *options) { @@ -140,6 +142,8 @@ static void InitializeFlags(Flags *f, const char *options) { f->report_umrs = true; f->verbosity = 0; f->strip_path_prefix = ""; + f->fast_unwind_on_fatal = false; + f->fast_unwind_on_malloc = true; // Override from user-specified string. if (__msan_default_options) @@ -195,7 +199,7 @@ void PrintWarningWithOrigin(uptr pc, uptr bp, u32 origin) { ++msan_report_count; StackTrace stack; - GetStackTrace(&stack, kStackTraceMax, pc, bp, /*fast*/false); + GetStackTrace(&stack, kStackTraceMax, pc, bp, flags()->fast_unwind_on_fatal); u32 report_origin = (__msan_track_origins && OriginIsValid(origin)) ? origin : 0; @@ -294,7 +298,8 @@ void __msan_set_expect_umr(int expect_umr) { GET_CALLER_PC_BP_SP; (void)sp; StackTrace stack; - GetStackTrace(&stack, kStackTraceMax, pc, bp, /*fast*/false); + GetStackTrace(&stack, kStackTraceMax, pc, bp, + flags()->fast_unwind_on_fatal); ReportExpectedUMRNotFound(&stack); Die(); } diff --git a/lib/msan/msan.h b/lib/msan/msan.h index 123dd36bf..1880b8ef3 100644 --- a/lib/msan/msan.h +++ b/lib/msan/msan.h @@ -79,7 +79,7 @@ void UnpoisonMappedDSO(struct link_map *map); if (__msan_get_track_origins() && msan_inited) \ GetStackTrace(&stack, flags()->num_callers, \ StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \ - /* fast */ true) + flags()->fast_unwind_on_malloc) } // namespace __msan diff --git a/lib/msan/msan_flags.h b/lib/msan/msan_flags.h index 0c41c2eb2..cfaf96327 100644 --- a/lib/msan/msan_flags.h +++ b/lib/msan/msan_flags.h @@ -26,6 +26,10 @@ struct Flags { bool poison_in_malloc; // default: true bool report_umrs; const char *strip_path_prefix; + // Use fast (frame-pointer-based) unwinder on fatal errors (if available). + bool fast_unwind_on_fatal; + // Use fast (frame-pointer-based) unwinder on malloc/free (if available). + bool fast_unwind_on_malloc; }; Flags *flags(); |