summaryrefslogtreecommitdiff
path: root/lib/msan/msan.cc
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-08-27 14:08:15 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2013-08-27 14:08:15 +0000
commit0e38a67cd2d877e8680d65878c86c9e7e4fa4b1d (patch)
treedeae959c842f51e9116cab87269ae3e02f280cfc /lib/msan/msan.cc
parent3354fa60c20cc5c99ecfb36d813b598dc1b96b80 (diff)
downloadcompiler-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.cc22
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