Index: third_party/tcmalloc/chromium/src/windows/patch_functions.cc |
=================================================================== |
--- third_party/tcmalloc/chromium/src/windows/patch_functions.cc (revision 88335) |
+++ third_party/tcmalloc/chromium/src/windows/patch_functions.cc (working copy) |
@@ -122,6 +122,11 @@ |
extern "C" PERFTOOLS_DLL_DECL void _tcmalloc(); |
void _tcmalloc() { } |
+// This is the version needed for windows x64, which has a different |
+// decoration scheme which doesn't auto-add a leading underscore. |
+extern "C" PERFTOOLS_DLL_DECL void __tcmalloc(); |
+void __tcmalloc() { } |
+ |
namespace { // most everything here is in an unnamed namespace |
typedef void (*GenericFnPtr)(); |
@@ -175,7 +180,7 @@ |
kNew, kNewArray, kDelete, kDeleteArray, |
kNewNothrow, kNewArrayNothrow, kDeleteNothrow, kDeleteArrayNothrow, |
// These are windows-only functions from malloc.h |
- k_Msize, k_Expand, k_Aligned_malloc, k_Aligned_free, |
+ k_Msize, k_Expand, |
kNumFunctions |
}; |
@@ -274,12 +279,12 @@ |
const std::nothrow_t&) __THROW; |
static size_t Perftools__msize(void *ptr) __THROW; |
static void* Perftools__expand(void *ptr, size_t size) __THROW; |
- static void* Perftools__aligned_malloc(size_t size, size_t alignment) __THROW; |
- static void Perftools__aligned_free(void *ptr) __THROW; |
// malloc.h also defines these functions: |
+ // _aligned_malloc, _aligned_free, |
// _recalloc, _aligned_offset_malloc, _aligned_realloc, _aligned_recalloc |
// _aligned_offset_realloc, _aligned_offset_recalloc, _malloca, _freea |
// But they seem pretty obscure, and I'm fine not overriding them for now. |
+ // It may be they all call into malloc/free anyway. |
}; |
// This is a subset of MODDULEENTRY32, that we need for patching. |
@@ -300,10 +305,19 @@ |
ModuleEntryCopy(const MODULEINFO& mi) { |
this->modBaseAddr = mi.lpBaseOfDll; |
this->modBaseSize = mi.SizeOfImage; |
- for (int i = 0; i < sizeof(rgProcAddresses)/sizeof(*rgProcAddresses); i++) |
- rgProcAddresses[i] = (GenericFnPtr)::GetProcAddress( |
+ LPVOID modEndAddr = (char*)mi.lpBaseOfDll + mi.SizeOfImage; |
+ for (int i = 0; i < sizeof(rgProcAddresses)/sizeof(*rgProcAddresses); i++) { |
+ FARPROC target = ::GetProcAddress( |
reinterpret_cast<const HMODULE>(mi.lpBaseOfDll), |
LibcInfo::function_name(i)); |
+ // Sometimes a DLL forwards a function to a function in another |
+ // DLL. We don't want to patch those forwarded functions -- |
+ // they'll get patched when the other DLL is processed. |
+ if (target >= modBaseAddr && target < modEndAddr) |
+ rgProcAddresses[i] = (GenericFnPtr)target; |
+ else |
+ rgProcAddresses[i] = (GenericFnPtr)NULL; |
+ } |
} |
}; |
@@ -390,7 +404,7 @@ |
NULL, // kMangledNewArrayNothrow, |
NULL, // kMangledDeleteNothrow, |
NULL, // kMangledDeleteArrayNothrow, |
- "_msize", "_expand", "_aligned_malloc", "_aligned_free", |
+ "_msize", "_expand", |
}; |
// For mingw, I can't patch the new/delete here, because the |
@@ -421,14 +435,6 @@ |
#endif |
(GenericFnPtr)&::_msize, |
(GenericFnPtr)&::_expand, |
-#ifdef PERFTOOLS_NO_ALIGNED_MALLOC // for older versions of mingw |
- // _aligned_malloc isn't always available in mingw, so don't try to patch. |
- (GenericFnPtr)NULL, |
- (GenericFnPtr)NULL, |
-#else |
- (GenericFnPtr)&::_aligned_malloc, |
- (GenericFnPtr)&::_aligned_free, |
-#endif |
}; |
template<int T> GenericFnPtr LibcInfoWithPatchFunctions<T>::origstub_fn_[] = { |
@@ -451,8 +457,6 @@ |
(GenericFnPtr)&Perftools_deletearray_nothrow, |
(GenericFnPtr)&Perftools__msize, |
(GenericFnPtr)&Perftools__expand, |
- (GenericFnPtr)&Perftools__aligned_malloc, |
- (GenericFnPtr)&Perftools__aligned_free, |
}; |
/*static*/ WindowsInfo::FunctionInfo WindowsInfo::function_info_[] = { |
@@ -908,21 +912,6 @@ |
return NULL; |
} |
-template<int T> |
-void* LibcInfoWithPatchFunctions<T>::Perftools__aligned_malloc(size_t size, |
- size_t alignment) |
- __THROW { |
- void* result = do_memalign_or_cpp_memalign(alignment, size); |
- MallocHook::InvokeNewHook(result, size); |
- return result; |
-} |
- |
-template<int T> |
-void LibcInfoWithPatchFunctions<T>::Perftools__aligned_free(void *ptr) __THROW { |
- MallocHook::InvokeDeleteHook(ptr); |
- do_free_with_callback(ptr, (void (*)(void*))origstub_fn_[k_Aligned_free]); |
-} |
- |
LPVOID WINAPI WindowsInfo::Perftools_HeapAlloc(HANDLE hHeap, DWORD dwFlags, |
DWORD_PTR dwBytes) { |
LPVOID result = ((LPVOID (WINAPI *)(HANDLE, DWORD, DWORD_PTR)) |