diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-02-25 08:43:10 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-02-25 08:43:10 +0000 |
commit | 8a6b5e551ab8a331f7e7bc4bfcd74926fbffa3f6 (patch) | |
tree | 41d035ff1adc2bf63f537d5410d001667b1e72d2 /lib/tsan/rtl | |
parent | 55249d128eb72e58e102057751a8271310768b4c (diff) |
[TSan] Add interceptor for malloc_usable_size()
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@176013 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/tsan/rtl')
-rw-r--r-- | lib/tsan/rtl/tsan_interceptors.cc | 5 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_mman.cc | 8 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_mman.h | 1 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_stat.h | 1 |
4 files changed, 15 insertions, 0 deletions
diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index 81b859510..25dfe9c01 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -403,6 +403,11 @@ TSAN_INTERCEPTOR(void, cfree, void *p) { user_free(thr, pc, p); } +TSAN_INTERCEPTOR(uptr, malloc_usable_size, void *p) { + SCOPED_INTERCEPTOR_RAW(malloc_usable_size, p); + return user_alloc_usable_size(thr, pc, p); +} + #define OPERATOR_NEW_BODY(mangled_name) \ if (cur_thread()->in_symbolizer) \ return __libc_malloc(size); \ diff --git a/lib/tsan/rtl/tsan_mman.cc b/lib/tsan/rtl/tsan_mman.cc index 7ddcee2a9..fb324834e 100644 --- a/lib/tsan/rtl/tsan_mman.cc +++ b/lib/tsan/rtl/tsan_mman.cc @@ -127,6 +127,14 @@ void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz) { return p2; } +uptr user_alloc_usable_size(ThreadState *thr, uptr pc, void *p) { + CHECK_GT(thr->in_rtl, 0); + if (p == 0) + return 0; + MBlock *b = (MBlock*)allocator()->GetMetaData(p); + return (b) ? b->size : 0; +} + MBlock *user_mblock(ThreadState *thr, void *p) { CHECK_NE(p, (void*)0); Allocator *a = allocator(); diff --git a/lib/tsan/rtl/tsan_mman.h b/lib/tsan/rtl/tsan_mman.h index dc31acd75..4a9240f66 100644 --- a/lib/tsan/rtl/tsan_mman.h +++ b/lib/tsan/rtl/tsan_mman.h @@ -31,6 +31,7 @@ void *user_alloc(ThreadState *thr, uptr pc, uptr sz, void user_free(ThreadState *thr, uptr pc, void *p); void *user_realloc(ThreadState *thr, uptr pc, void *p, uptr sz); void *user_alloc_aligned(ThreadState *thr, uptr pc, uptr sz, uptr align); +uptr user_alloc_usable_size(ThreadState *thr, uptr pc, void *p); // Given the pointer p into a valid allocated block, // returns the descriptor of the block. MBlock *user_mblock(ThreadState *thr, void *p); diff --git a/lib/tsan/rtl/tsan_stat.h b/lib/tsan/rtl/tsan_stat.h index 0b4ef832d..e4362b034 100644 --- a/lib/tsan/rtl/tsan_stat.h +++ b/lib/tsan/rtl/tsan_stat.h @@ -102,6 +102,7 @@ enum StatType { StatInt_realloc, StatInt_free, StatInt_cfree, + StatInt_malloc_usable_size, StatInt_mmap, StatInt_mmap64, StatInt_munmap, |