diff options
| author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-04-02 11:06:35 +0000 |
|---|---|---|
| committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-04-02 11:06:35 +0000 |
| commit | a55fcd35e9b6777363bb36cf1b204afb68adc36a (patch) | |
| tree | 211cf36f852b9d8d25acfa3898e4269a59f2ef0e /compiler-rt/lib/msan/msan.cc | |
| parent | 2c66a22e564feab3674e431700d1932908fba340 (diff) | |
| download | bcm5719-llvm-a55fcd35e9b6777363bb36cf1b204afb68adc36a.tar.gz bcm5719-llvm-a55fcd35e9b6777363bb36cf1b204afb68adc36a.zip | |
[msan] Precise origin handling in __unaligned_(load|store)*.
llvm-svn: 205412
Diffstat (limited to 'compiler-rt/lib/msan/msan.cc')
| -rw-r--r-- | compiler-rt/lib/msan/msan.cc | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc index 7a93b663185..4b6578ef4ce 100644 --- a/compiler-rt/lib/msan/msan.cc +++ b/compiler-rt/lib/msan/msan.cc @@ -509,40 +509,43 @@ u32 __msan_get_umr_origin() { u16 __sanitizer_unaligned_load16(const uu16 *p) { __msan_retval_tls[0] = *(uu16 *)MEM_TO_SHADOW((uptr)p); if (__msan_get_track_origins()) - __msan_retval_origin_tls = *(uu32 *)(MEM_TO_ORIGIN((uptr)p) & ~3UL); + __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p)); return *p; } u32 __sanitizer_unaligned_load32(const uu32 *p) { __msan_retval_tls[0] = *(uu32 *)MEM_TO_SHADOW((uptr)p); if (__msan_get_track_origins()) - __msan_retval_origin_tls = *(uu32 *)(MEM_TO_ORIGIN((uptr)p) & ~3UL); + __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p)); return *p; } u64 __sanitizer_unaligned_load64(const uu64 *p) { __msan_retval_tls[0] = *(uu64 *)MEM_TO_SHADOW((uptr)p); if (__msan_get_track_origins()) - __msan_retval_origin_tls = *(uu32 *)(MEM_TO_ORIGIN((uptr)p) & ~3UL); + __msan_retval_origin_tls = GetOriginIfPoisoned((uptr)p, sizeof(*p)); return *p; } void __sanitizer_unaligned_store16(uu16 *p, u16 x) { - *(uu16 *)MEM_TO_SHADOW((uptr)p) = __msan_param_tls[1]; - if (__msan_get_track_origins()) + u16 s = __msan_param_tls[1]; + *(uu16 *)MEM_TO_SHADOW((uptr)p) = s; + if (s && __msan_get_track_origins()) if (uu32 o = __msan_param_origin_tls[2]) - __msan_set_origin(p, 2, o); + SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o); *p = x; } void __sanitizer_unaligned_store32(uu32 *p, u32 x) { - *(uu32 *)MEM_TO_SHADOW((uptr)p) = __msan_param_tls[1]; - if (__msan_get_track_origins()) + u32 s = __msan_param_tls[1]; + *(uu32 *)MEM_TO_SHADOW((uptr)p) = s; + if (s && __msan_get_track_origins()) if (uu32 o = __msan_param_origin_tls[2]) - __msan_set_origin(p, 4, o); + SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o); *p = x; } void __sanitizer_unaligned_store64(uu64 *p, u64 x) { - *(uu64 *)MEM_TO_SHADOW((uptr)p) = __msan_param_tls[1]; - if (__msan_get_track_origins()) + u64 s = __msan_param_tls[1]; + *(uu64 *)MEM_TO_SHADOW((uptr)p) = s; + if (s && __msan_get_track_origins()) if (uu32 o = __msan_param_origin_tls[2]) - __msan_set_origin(p, 8, o); + SetOriginIfPoisoned((uptr)p, (uptr)&s, sizeof(s), o); *p = x; } |

