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