diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-08-27 14:08:15 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-08-27 14:08:15 +0000 |
commit | 0e38a67cd2d877e8680d65878c86c9e7e4fa4b1d (patch) | |
tree | deae959c842f51e9116cab87269ae3e02f280cfc /lib/msan/msan.cc | |
parent | 3354fa60c20cc5c99ecfb36d813b598dc1b96b80 (diff) | |
download | compiler-rt-0e38a67cd2d877e8680d65878c86c9e7e4fa4b1d.tar.gz compiler-rt-0e38a67cd2d877e8680d65878c86c9e7e4fa4b1d.tar.bz2 compiler-rt-0e38a67cd2d877e8680d65878c86c9e7e4fa4b1d.tar.xz |
[msan] Save/restore va_arg_overflow_tls in signal handlers.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@189351 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/msan.cc')
-rw-r--r-- | lib/msan/msan.cc | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index d7912fa8..c441a29d 100644 --- a/lib/msan/msan.cc +++ b/lib/msan/msan.cc @@ -230,11 +230,29 @@ void UnpoisonParam(uptr n) { internal_memset(__msan_param_tls, 0, n * sizeof(*__msan_param_tls)); } -void UnpoisonThreadLocalState() { +// Backup MSan runtime TLS state. +// Implementation must be async-signal-safe. +// Instances of this class may live on the signal handler stack, and data size +// may be an issue. +void ScopedThreadLocalStateBackup::Backup() { + va_arg_overflow_size_tls = __msan_va_arg_overflow_size_tls; +} + +void ScopedThreadLocalStateBackup::Restore() { + // A lame implementation that only keeps essential state and resets the rest. + __msan_va_arg_overflow_size_tls = va_arg_overflow_size_tls; + internal_memset(__msan_param_tls, 0, sizeof(__msan_param_tls)); internal_memset(__msan_retval_tls, 0, sizeof(__msan_retval_tls)); internal_memset(__msan_va_arg_tls, 0, sizeof(__msan_va_arg_tls)); - __msan_va_arg_overflow_size_tls = 0; + + if (__msan_get_track_origins()) { + internal_memset(&__msan_retval_origin_tls, 0, sizeof(__msan_retval_tls)); + internal_memset(__msan_param_origin_tls, 0, sizeof(__msan_param_origin_tls)); + } +} + +void UnpoisonThreadLocalState() { } } // namespace __msan |