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>