[llvm-commits] [compiler-rt] r162355 - in /compiler-rt/trunk/lib/asan: asan_allocator.cc asan_interface.h asan_rtl.cc lit_tests/malloc_hook.cc

Alexey Samsonov samsonov at google.com
Tue Aug 28 00:44:17 PDT 2012


Anna,

Some ASan users need to be able to register malloc hooks and query
allocator about current memory usage of the program.
(In some sense, with these interface functions ASan may mimic allocator
from gperftools).

What do you mean by extra data collection?

On Mon, Aug 27, 2012 at 10:20 PM, Anna Zaks <ganna at apple.com> wrote:

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


-- 
Alexey Samsonov, MSK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120828/3241d174/attachment.html>


More information about the llvm-commits mailing list