diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2013-08-13 15:29:42 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2013-08-13 15:29:42 +0000 |
commit | 43e62df906327f6ffa492edb933af1195143d149 (patch) | |
tree | f16a7f62b8cb72ca7db9b4fd1cae4ef3b8898350 /lib/asan/asan_dll_thunk.cc | |
parent | 68cd60c77470fd6e0f86bad1e4c68796d516cc06 (diff) | |
download | compiler-rt-43e62df906327f6ffa492edb933af1195143d149.tar.gz compiler-rt-43e62df906327f6ffa492edb933af1195143d149.tar.bz2 compiler-rt-43e62df906327f6ffa492edb933af1195143d149.tar.xz |
[ASan/Win] Hook some memory allocation functions; passes simple sanity test now
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@188278 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/asan/asan_dll_thunk.cc')
-rw-r--r-- | lib/asan/asan_dll_thunk.cc | 112 |
1 files changed, 89 insertions, 23 deletions
diff --git a/lib/asan/asan_dll_thunk.cc b/lib/asan/asan_dll_thunk.cc index d11b0086..24b3a975 100644 --- a/lib/asan/asan_dll_thunk.cc +++ b/lib/asan/asan_dll_thunk.cc @@ -20,60 +20,126 @@ // Using #ifdef rather than relying on Makefiles etc. // simplifies the build procedure. #ifdef ASAN_DLL_THUNK -#include <windows.h> -// ------------------------- Helper macros ------------------ {{{1 +// ----------------- Helper functions and macros --------------------- {{{1 +extern "C" { +void *__stdcall GetModuleHandleA(const char *module_name); +void *__stdcall GetProcAddress(void *module, const char *proc_name); +void abort(); +} -static FARPROC getRealProcAddressOrDie(const char *name) { - FARPROC ret = GetProcAddress(GetModuleHandle(NULL), name); +static void *getRealProcAddressOrDie(const char *name) { + void *ret = GetProcAddress(GetModuleHandleA(0), name); if (!ret) abort(); return ret; } -#define WRAP_VV(name) \ +#define WRAP_V_V(name) \ extern "C" void name() { \ typedef void (*fntype)(); \ fntype fn = (fntype)getRealProcAddressOrDie(#name); \ fn(); \ } -#define WRAP_VW(name) \ +#define WRAP_V_W(name) \ extern "C" void name(void *arg) { \ typedef void (*fntype)(void *arg); \ fntype fn = (fntype)getRealProcAddressOrDie(#name); \ fn(arg); \ } -#define WRAP_VWW(name) \ +#define WRAP_V_WW(name) \ extern "C" void name(void *arg1, void *arg2) { \ typedef void (*fntype)(void *, void *); \ fntype fn = (fntype)getRealProcAddressOrDie(#name); \ fn(arg1, arg2); \ } + +#define WRAP_W_W(name) \ + extern "C" void *name(void *arg) { \ + typedef void *(*fntype)(void *arg); \ + fntype fn = (fntype)getRealProcAddressOrDie(#name); \ + return fn(arg); \ + } + +#define WRAP_W_WW(name) \ + extern "C" void *name(void *arg1, void *arg2) { \ + typedef void *(*fntype)(void *, void *); \ + fntype fn = (fntype)getRealProcAddressOrDie(#name); \ + return fn(arg1, arg2); \ + } + +#define WRAP_W_WWW(name) \ + extern "C" void *name(void *arg1, void *arg2, void *arg3) { \ + typedef void *(*fntype)(void *, void *, void *); \ + fntype fn = (fntype)getRealProcAddressOrDie(#name); \ + return fn(arg1, arg2, arg3); \ + } + +#define WRAP_W_WWWW(name) \ + extern "C" void *name(void *arg1, void *arg2, void *arg3, void *arg4) { \ + typedef void *(*fntype)(void *, void *, void *, void *); \ + fntype fn = (fntype)getRealProcAddressOrDie(#name); \ + return fn(arg1, arg2, arg3, arg4); \ + } + +#define WRAP_W_WWWWW(name) \ + extern "C" void *name(void *arg1, void *arg2, void *arg3, void *arg4, \ + void *arg5) { \ + typedef void *(*fntype)(void *, void *, void *, void *, void *); \ + fntype fn = (fntype)getRealProcAddressOrDie(#name); \ + return fn(arg1, arg2, arg3, arg4, arg5); \ + } + +#define WRAP_W_WWWWWW(name) \ + extern "C" void *name(void *arg1, void *arg2, void *arg3, void *arg4, \ + void *arg5, void *arg6) { \ + typedef void *(*fntype)(void *, void *, void *, void *, void *, void *); \ + fntype fn = (fntype)getRealProcAddressOrDie(#name); \ + return fn(arg1, arg2, arg3, arg4, arg5, arg6); \ + } // }}} -WRAP_VV(__asan_init_v3) +// ----------------- ASan own interface functions -------------------- +WRAP_V_V(__asan_init_v3) -WRAP_VW(__asan_report_store1) -WRAP_VW(__asan_report_store2) -WRAP_VW(__asan_report_store4) -WRAP_VW(__asan_report_store8) -WRAP_VW(__asan_report_store16) -WRAP_VWW(__asan_report_store_n) +WRAP_V_W(__asan_report_store1) +WRAP_V_W(__asan_report_store2) +WRAP_V_W(__asan_report_store4) +WRAP_V_W(__asan_report_store8) +WRAP_V_W(__asan_report_store16) +WRAP_V_WW(__asan_report_store_n) -WRAP_VW(__asan_report_load1) -WRAP_VW(__asan_report_load2) -WRAP_VW(__asan_report_load4) -WRAP_VW(__asan_report_load8) -WRAP_VW(__asan_report_load16) -WRAP_VWW(__asan_report_load_n) +WRAP_V_W(__asan_report_load1) +WRAP_V_W(__asan_report_load2) +WRAP_V_W(__asan_report_load4) +WRAP_V_W(__asan_report_load8) +WRAP_V_W(__asan_report_load16) +WRAP_V_WW(__asan_report_load_n) -WRAP_VWW(__asan_register_globals) -WRAP_VWW(__asan_unregister_globals) +WRAP_V_WW(__asan_register_globals) +WRAP_V_WW(__asan_unregister_globals) // TODO(timurrrr): Add more interface functions on the as-needed basis. -// TODO(timurrrr): Add malloc & friends (see asan_malloc_win.cc). +// ----------------- Memory allocation functions --------------------- +WRAP_V_W(free) +WRAP_V_WW(_free_dbg) + +WRAP_W_W(malloc) +WRAP_W_WWWW(_malloc_dbg) + +WRAP_W_WW(calloc) +WRAP_W_WWWWW(_calloc_dbg) +WRAP_W_WWW(_calloc_impl) + +WRAP_W_WW(realloc) +WRAP_W_WWW(_realloc_dbg) +WRAP_W_WWW(_recalloc) + +WRAP_W_W(_msize) + +// TODO(timurrrr): Do we need to add _Crt* stuff here? (see asan_malloc_win.cc). #endif // ASAN_DLL_THUNK |