diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-18 13:45:19 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-18 13:45:19 +0000 |
commit | 4786ed291f735699c2150f3dd4dffa62ddb89f28 (patch) | |
tree | e91de16416cd20dd6bdbcf370772c52f6bc914af /lib/msan/msan.h | |
parent | b4a5f1c12ad45b35ebbceffc00bbc4ee788af90f (diff) |
[msan] Origin tracking with history, compiler-rt part.
Compiler-rt part of MSan implementation of advanced origin tracking,
when we record not only creation point, but all locations where
an uninitialized value was stored to memory, too.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@204152 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/msan.h')
-rw-r--r-- | lib/msan/msan.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lib/msan/msan.h b/lib/msan/msan.h index 755dd7483..73734e37c 100644 --- a/lib/msan/msan.h +++ b/lib/msan/msan.h @@ -32,6 +32,12 @@ #define MEM_IS_SHADOW(mem) \ ((uptr)mem >= 0x200000000000ULL && (uptr)mem <= 0x400000000000ULL) +// Chained stack trace format. +#define TRACE_MAGIC_MASK 0xFFFFFFFF00000000LLU +#define TRACE_MAKE_CHAINED(id) ((uptr)id | TRACE_MAGIC_MASK) +#define TRACE_TO_CHAINED_ID(u) ((uptr)u & (~TRACE_MAGIC_MASK)) +#define TRACE_IS_CHAINED(u) ((((uptr)u) & TRACE_MAGIC_MASK) == TRACE_MAGIC_MASK) + const int kMsanParamTlsSizeInWords = 100; const int kMsanRetvalTlsSizeInWords = 100; @@ -82,6 +88,14 @@ void ReportAtExitStatistics(); void UnpoisonParam(uptr n); void UnpoisonThreadLocalState(); +void CopyOrigin(void *dst, const void *src, uptr size, StackTrace *stack); +void MovePoison(void *dst, const void *src, uptr size, StackTrace *stack); +void CopyPoison(void *dst, const void *src, uptr size, StackTrace *stack); + +// Returns a "chained" origin id, pointing to the given stack trace followed by +// the previous origin id. +u32 ChainOrigin(u32 id, StackTrace *stack); + #define GET_MALLOC_STACK_TRACE \ StackTrace stack; \ stack.size = 0; \ @@ -90,6 +104,14 @@ void UnpoisonThreadLocalState(); StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \ common_flags()->fast_unwind_on_malloc) +#define GET_STORE_STACK_TRACE \ + StackTrace stack; \ + stack.size = 0; \ + if (__msan_get_track_origins() > 1 && msan_inited) \ + GetStackTrace(&stack, common_flags()->malloc_context_size, \ + StackTrace::GetCurrentPc(), GET_CURRENT_FRAME(), \ + common_flags()->fast_unwind_on_malloc) + class ScopedThreadLocalStateBackup { public: ScopedThreadLocalStateBackup() { Backup(); } |