asan_win_dll_thunk.cc revision 68cd60c77470fd6e0f86bad1e4c68796d516cc06
168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//===-- asan_dll_thunk.cc -------------------------------------------------===//
268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//
368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//                     The LLVM Compiler Infrastructure
468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//
568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// This file is distributed under the University of Illinois Open Source
668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// License. See LICENSE.TXT for details.
768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//
868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//===----------------------------------------------------------------------===//
968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//
1068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// This file is a part of AddressSanitizer, an address sanity checker.
1168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//
1268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// This file defines a family of thunks that should be statically linked into
1368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// the DLLs that have ASan instrumentation in order to delegate the calls to the
1468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// shared runtime that lives in the main binary.
1568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// See https://code.google.com/p/address-sanitizer/issues/detail?id=209 for the
1668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// details.
1768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov//===----------------------------------------------------------------------===//
1868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
1968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// Only compile this code when buidling asan_dll_thunk.lib
2068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// Using #ifdef rather than relying on Makefiles etc.
2168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// simplifies the build procedure.
2268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov#ifdef ASAN_DLL_THUNK
2368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov#include <windows.h>
2468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
2568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// ------------------------- Helper macros ------------------ {{{1
2668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
2768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanovstatic FARPROC getRealProcAddressOrDie(const char *name) {
2868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  FARPROC ret = GetProcAddress(GetModuleHandle(NULL), name);
2968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  if (!ret)
3068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    abort();
3168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  return ret;
3268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov}
3368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
3468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov#define WRAP_VV(name)                                                          \
3568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  extern "C" void name() {                                                     \
3668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    typedef void (*fntype)();                                                  \
3768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \
3868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    fn();                                                                      \
3968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  }
4068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
4168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov#define WRAP_VW(name)                                                          \
4268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  extern "C" void name(void *arg) {                                            \
4368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    typedef void (*fntype)(void *arg);                                         \
4468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \
4568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    fn(arg);                                                                   \
4668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  }
4768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
4868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov#define WRAP_VWW(name)                                                         \
4968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  extern "C" void name(void *arg1, void *arg2) {                               \
5068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    typedef void (*fntype)(void *, void *);                                    \
5168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \
5268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov    fn(arg1, arg2);                                                            \
5368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov  }
5468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// }}}
5568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
5668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VV(__asan_init_v3)
5768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
5868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_store1)
5968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_store2)
6068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_store4)
6168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_store8)
6268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_store16)
6368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VWW(__asan_report_store_n)
6468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
6568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_load1)
6668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_load2)
6768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_load4)
6868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_load8)
6968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VW(__asan_report_load16)
7068cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VWW(__asan_report_load_n)
7168cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
7268cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VWW(__asan_register_globals)
7368cd60c77470fd6e0f86bad1e4c68796d516cc06Timur IskhodzhanovWRAP_VWW(__asan_unregister_globals)
7468cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
7568cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// TODO(timurrrr): Add more interface functions on the as-needed basis.
7668cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
7768cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov// TODO(timurrrr): Add malloc & friends (see asan_malloc_win.cc).
7868cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov
7968cd60c77470fd6e0f86bad1e4c68796d516cc06Timur Iskhodzhanov#endif // ASAN_DLL_THUNK
80