summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-03-14 11:47:03 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-03-14 11:47:03 +0000
commit58b52b5efb7641b27c1728be0946889f335d83e1 (patch)
tree068139f62875a972c2180c9f0d37481023c0f338 /lib
parent7cbbb2943527ff852bdace822c8592cfc7e450d7 (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.cc9
-rw-r--r--lib/msan/msan.h2
-rw-r--r--lib/msan/msan_flags.h4
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();