Anna,<div><br></div><div>Some ASan users need to be able to register malloc hooks and query allocator about current memory usage of the program.</div><div>(In some sense, with these interface functions ASan may mimic allocator from gperftools).</div>
<div><br></div><div>What do you mean by extra data collection?</div><div><br><div class="gmail_quote">On Mon, Aug 27, 2012 at 10:20 PM, Anna Zaks <span dir="ltr"><<a href="mailto:ganna@apple.com" target="_blank">ganna@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Alexey,<br>
<br>
I am curious what is the motivation/use case for these callbacks. I guess it would allow a mechanism for extra data collection..<br>
<br>
Thanks,<br>
Anna.<br>
<div class="HOEnZb"><div class="h5">On Aug 22, 2012, at 3:12 AM, Alexey Samsonov wrote:<br>
<br>
> Author: samsonov<br>
> Date: Wed Aug 22 05:12:47 2012<br>
> New Revision: 162355<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=162355&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=162355&view=rev</a><br>
> Log:<br>
> [ASan] make ASan malloc/free hooks weak interface functions, overridable by user. Now the user can control malloc/free hooks without recompiling ASan runtime<br>
><br>
> Added:<br>
> compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc<br>
> Modified:<br>
> compiler-rt/trunk/lib/asan/asan_allocator.cc<br>
> compiler-rt/trunk/lib/asan/asan_interface.h<br>
> compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
><br>
> Modified: compiler-rt/trunk/lib/asan/asan_allocator.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_allocator.cc?rev=162355&r1=162354&r2=162355&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_allocator.cc?rev=162355&r1=162354&r2=162355&view=diff</a><br>
> ==============================================================================<br>
> --- compiler-rt/trunk/lib/asan/asan_allocator.cc (original)<br>
> +++ compiler-rt/trunk/lib/asan/asan_allocator.cc Wed Aug 22 05:12:47 2012<br>
> @@ -788,45 +788,38 @@<br>
><br>
> } // namespace __asan<br>
><br>
> -// Malloc hooks declaration.<br>
> -// ASAN_NEW_HOOK(ptr, size) is called immediately after<br>
> -// allocation of "size" bytes, which returned "ptr".<br>
> -// ASAN_DELETE_HOOK(ptr) is called immediately before<br>
> -// deallocation of "ptr".<br>
> -// If ASAN_NEW_HOOK or ASAN_DELETE_HOOK is defined, user<br>
> -// program must provide implementation of this hook.<br>
> -// If macro is undefined, the hook is no-op.<br>
> -#ifdef ASAN_NEW_HOOK<br>
> -extern "C" void ASAN_NEW_HOOK(void *ptr, uptr size);<br>
> -#else<br>
> -static inline void ASAN_NEW_HOOK(void *ptr, uptr size) { }<br>
> -#endif<br>
> -<br>
> -#ifdef ASAN_DELETE_HOOK<br>
> -extern "C" void ASAN_DELETE_HOOK(void *ptr);<br>
> -#else<br>
> -static inline void ASAN_DELETE_HOOK(void *ptr) { }<br>
> -#endif<br>
> +// Default (no-op) implementation of malloc hooks.<br>
> +extern "C" {<br>
> +SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE<br>
> +void __asan_malloc_hook(void *ptr, uptr size) {<br>
> + (void)ptr;<br>
> + (void)size;<br>
> +}<br>
> +SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE<br>
> +void __asan_free_hook(void *ptr) {<br>
> + (void)ptr;<br>
> +}<br>
> +} // extern "C"<br>
><br>
> namespace __asan {<br>
><br>
> SANITIZER_INTERFACE_ATTRIBUTE<br>
> void *asan_memalign(uptr alignment, uptr size, AsanStackTrace *stack) {<br>
> void *ptr = (void*)Allocate(alignment, size, stack);<br>
> - ASAN_NEW_HOOK(ptr, size);<br>
> + __asan_malloc_hook(ptr, size);<br>
> return ptr;<br>
> }<br>
><br>
> SANITIZER_INTERFACE_ATTRIBUTE<br>
> void asan_free(void *ptr, AsanStackTrace *stack) {<br>
> - ASAN_DELETE_HOOK(ptr);<br>
> + __asan_free_hook(ptr);<br>
> Deallocate((u8*)ptr, stack);<br>
> }<br>
><br>
> SANITIZER_INTERFACE_ATTRIBUTE<br>
> void *asan_malloc(uptr size, AsanStackTrace *stack) {<br>
> void *ptr = (void*)Allocate(0, size, stack);<br>
> - ASAN_NEW_HOOK(ptr, size);<br>
> + __asan_malloc_hook(ptr, size);<br>
> return ptr;<br>
> }<br>
><br>
> @@ -834,17 +827,17 @@<br>
> void *ptr = (void*)Allocate(0, nmemb * size, stack);<br>
> if (ptr)<br>
> REAL(memset)(ptr, 0, nmemb * size);<br>
> - ASAN_NEW_HOOK(ptr, nmemb * size);<br>
> + __asan_malloc_hook(ptr, nmemb * size);<br>
> return ptr;<br>
> }<br>
><br>
> void *asan_realloc(void *p, uptr size, AsanStackTrace *stack) {<br>
> if (p == 0) {<br>
> void *ptr = (void*)Allocate(0, size, stack);<br>
> - ASAN_NEW_HOOK(ptr, size);<br>
> + __asan_malloc_hook(ptr, size);<br>
> return ptr;<br>
> } else if (size == 0) {<br>
> - ASAN_DELETE_HOOK(p);<br>
> + __asan_free_hook(p);<br>
> Deallocate((u8*)p, stack);<br>
> return 0;<br>
> }<br>
> @@ -853,7 +846,7 @@<br>
><br>
> void *asan_valloc(uptr size, AsanStackTrace *stack) {<br>
> void *ptr = (void*)Allocate(kPageSize, size, stack);<br>
> - ASAN_NEW_HOOK(ptr, size);<br>
> + __asan_malloc_hook(ptr, size);<br>
> return ptr;<br>
> }<br>
><br>
> @@ -864,7 +857,7 @@<br>
> size = kPageSize;<br>
> }<br>
> void *ptr = (void*)Allocate(kPageSize, size, stack);<br>
> - ASAN_NEW_HOOK(ptr, size);<br>
> + __asan_malloc_hook(ptr, size);<br>
> return ptr;<br>
> }<br>
><br>
> @@ -872,7 +865,7 @@<br>
> AsanStackTrace *stack) {<br>
> void *ptr = Allocate(alignment, size, stack);<br>
> CHECK(IsAligned((uptr)ptr, alignment));<br>
> - ASAN_NEW_HOOK(ptr, size);<br>
> + __asan_malloc_hook(ptr, size);<br>
> *memptr = ptr;<br>
> return 0;<br>
> }<br>
><br>
> Modified: compiler-rt/trunk/lib/asan/asan_interface.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interface.h?rev=162355&r1=162354&r2=162355&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_interface.h?rev=162355&r1=162354&r2=162355&view=diff</a><br>
> ==============================================================================<br>
> --- compiler-rt/trunk/lib/asan/asan_interface.h (original)<br>
> +++ compiler-rt/trunk/lib/asan/asan_interface.h Wed Aug 22 05:12:47 2012<br>
> @@ -175,6 +175,17 @@<br>
> // ASan runtime options. See asan_flags.h for details.<br>
> const char* __asan_default_options()<br>
> SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE;<br>
> +<br>
> + // Malloc hooks that may be overriden by user.<br>
> + // __asan_malloc_hook(ptr, size) is called immediately after<br>
> + // allocation of "size" bytes, which returned "ptr".<br>
> + // __asan_free_hook(ptr) is called immediately before<br>
> + // deallocation of "ptr".<br>
> + // If user doesn't provide implementations of these hooks, they are no-op.<br>
> + void __asan_malloc_hook(void *ptr, uptr size)<br>
> + SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE;<br>
> + void __asan_free_hook(void *ptr)<br>
> + SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE;<br>
> } // extern "C"<br>
><br>
> #endif // ASAN_INTERFACE_H<br>
><br>
> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=162355&r1=162354&r2=162355&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=162355&r1=162354&r2=162355&view=diff</a><br>
> ==============================================================================<br>
> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)<br>
> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Wed Aug 22 05:12:47 2012<br>
> @@ -250,6 +250,8 @@<br>
> case 31: __asan_default_options(); break;<br>
> case 32: __asan_before_dynamic_init(0, 0); break;<br>
> case 33: __asan_after_dynamic_init(); break;<br>
> + case 34: __asan_malloc_hook(0, 0); break;<br>
> + case 35: __asan_free_hook(0); break;<br>
> }<br>
> }<br>
><br>
><br>
> Added: compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc?rev=162355&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc?rev=162355&view=auto</a><br>
> ==============================================================================<br>
> --- compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc (added)<br>
> +++ compiler-rt/trunk/lib/asan/lit_tests/malloc_hook.cc Wed Aug 22 05:12:47 2012<br>
> @@ -0,0 +1,20 @@<br>
> +// RUN: %clangxx_asan -O2 %s -o %t<br>
> +// RUN: %t 2>&1 | FileCheck %s<br>
> +#include <stdio.h><br>
> +#include <stdlib.h><br>
> +<br>
> +extern "C" {<br>
> +// Note: avoid calling functions that allocate memory in malloc/free<br>
> +// to avoid infinite recursion.<br>
> +void __asan_malloc_hook(void *ptr, size_t sz) { puts("MallocHook"); }<br>
> +void __asan_free_hook(void *ptr) { puts("FreeHook"); }<br>
> +} // extern "C"<br>
> +<br>
> +int main() {<br>
> + volatile int *x = new int;<br>
> + // CHECK: MallocHook<br>
> + *x = 0;<br>
> + delete x;<br>
> + // CHECK: FreeHook<br>
> + return 0;<br>
> +}<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div><br>
</div>