summaryrefslogtreecommitdiff
path: root/lib/asan/asan_dll_thunk.cc
diff options
context:
space:
mode:
authorTimur Iskhodzhanov <timurrrr@google.com>2013-08-13 15:29:42 +0000
committerTimur Iskhodzhanov <timurrrr@google.com>2013-08-13 15:29:42 +0000
commit43e62df906327f6ffa492edb933af1195143d149 (patch)
treef16a7f62b8cb72ca7db9b4fd1cae4ef3b8898350 /lib/asan/asan_dll_thunk.cc
parent68cd60c77470fd6e0f86bad1e4c68796d516cc06 (diff)
downloadcompiler-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.cc112
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