Index: base/debug/profiler.cc |
diff --git a/base/debug/profiler.cc b/base/debug/profiler.cc |
index ed553cdf2939ea68d6ccb7dac4e84aacec7955e2..61148e5c5548d74298338c7421a68d75ebdba1c4 100644 |
--- a/base/debug/profiler.cc |
+++ b/base/debug/profiler.cc |
@@ -10,12 +10,8 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
-#if defined(OS_WIN) |
-#include "base/win/pe_image.h" |
-#endif // defined(OS_WIN) |
- |
// TODO(peria): Enable profiling on Windows. |
-#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) && !defined(OS_WIN) |
+#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) |
#include "third_party/tcmalloc/chromium/src/gperftools/profiler.h" |
#endif |
@@ -23,7 +19,7 @@ namespace base { |
namespace debug { |
// TODO(peria): Enable profiling on Windows. |
-#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) && !defined(OS_WIN) |
+#if defined(ENABLE_PROFILING) && !defined(NO_TCMALLOC) |
static int profile_count = 0; |
@@ -74,8 +70,6 @@ void RestartProfilingAfterFork() { |
#endif |
-#if !defined(OS_WIN) |
- |
bool IsBinaryInstrumented() { |
return false; |
} |
@@ -96,124 +90,6 @@ MoveDynamicSymbol GetProfilerMoveDynamicSymbolFunc() { |
return NULL; |
} |
-#else // defined(OS_WIN) |
- |
-// http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx |
-extern "C" IMAGE_DOS_HEADER __ImageBase; |
- |
-bool IsBinaryInstrumented() { |
- enum InstrumentationCheckState { |
- UNINITIALIZED, |
- INSTRUMENTED_IMAGE, |
- NON_INSTRUMENTED_IMAGE, |
- }; |
- |
- static InstrumentationCheckState state = UNINITIALIZED; |
- |
- if (state == UNINITIALIZED) { |
- HMODULE this_module = reinterpret_cast<HMODULE>(&__ImageBase); |
- base::win::PEImage image(this_module); |
- |
- // Check to be sure our image is structured as we'd expect. |
- DCHECK(image.VerifyMagic()); |
- |
- // Syzygy-instrumented binaries contain a PE image section named ".thunks", |
- // and all Syzygy-modified binaries contain the ".syzygy" image section. |
- // This is a very fast check, as it only looks at the image header. |
- if ((image.GetImageSectionHeaderByName(".thunks") != NULL) && |
- (image.GetImageSectionHeaderByName(".syzygy") != NULL)) { |
- state = INSTRUMENTED_IMAGE; |
- } else { |
- state = NON_INSTRUMENTED_IMAGE; |
- } |
- } |
- DCHECK(state != UNINITIALIZED); |
- |
- return state == INSTRUMENTED_IMAGE; |
-} |
- |
-namespace { |
- |
-struct FunctionSearchContext { |
- const char* name; |
- FARPROC function; |
-}; |
- |
-// Callback function to PEImage::EnumImportChunks. |
-bool FindResolutionFunctionInImports( |
- const base::win::PEImage &image, const char* module_name, |
- PIMAGE_THUNK_DATA unused_name_table, PIMAGE_THUNK_DATA import_address_table, |
- PVOID cookie) { |
- FunctionSearchContext* context = |
- reinterpret_cast<FunctionSearchContext*>(cookie); |
- |
- DCHECK_NE(static_cast<FunctionSearchContext*>(NULL), context); |
- DCHECK_EQ(static_cast<FARPROC>(NULL), context->function); |
- |
- // Our import address table contains pointers to the functions we import |
- // at this point. Let's retrieve the first such function and use it to |
- // find the module this import was resolved to by the loader. |
- const wchar_t* function_in_module = |
- reinterpret_cast<const wchar_t*>(import_address_table->u1.Function); |
- |
- // Retrieve the module by a function in the module. |
- const DWORD kFlags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | |
- GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; |
- HMODULE module = NULL; |
- if (!::GetModuleHandleEx(kFlags, function_in_module, &module)) { |
- // This can happen if someone IAT patches us to a thunk. |
- return true; |
- } |
- |
- // See whether this module exports the function we're looking for. |
- FARPROC exported_func = ::GetProcAddress(module, context->name); |
- if (exported_func != NULL) { |
- // We found it, return the function and terminate the enumeration. |
- context->function = exported_func; |
- return false; |
- } |
- |
- // Keep going. |
- return true; |
-} |
- |
-template <typename FunctionType> |
-FunctionType FindFunctionInImports(const char* function_name) { |
- if (!IsBinaryInstrumented()) |
- return NULL; |
- |
- HMODULE this_module = reinterpret_cast<HMODULE>(&__ImageBase); |
- base::win::PEImage image(this_module); |
- |
- FunctionSearchContext ctx = { function_name, NULL }; |
- image.EnumImportChunks(FindResolutionFunctionInImports, &ctx); |
- |
- return reinterpret_cast<FunctionType>(ctx.function); |
-} |
- |
-} // namespace |
- |
-ReturnAddressLocationResolver GetProfilerReturnAddrResolutionFunc() { |
- return FindFunctionInImports<ReturnAddressLocationResolver>( |
- "ResolveReturnAddressLocation"); |
-} |
- |
-DynamicFunctionEntryHook GetProfilerDynamicFunctionEntryHookFunc() { |
- return FindFunctionInImports<DynamicFunctionEntryHook>( |
- "OnDynamicFunctionEntry"); |
-} |
- |
-AddDynamicSymbol GetProfilerAddDynamicSymbolFunc() { |
- return FindFunctionInImports<AddDynamicSymbol>( |
- "AddDynamicSymbol"); |
-} |
- |
-MoveDynamicSymbol GetProfilerMoveDynamicSymbolFunc() { |
- return FindFunctionInImports<MoveDynamicSymbol>( |
- "MoveDynamicSymbol"); |
-} |
- |
-#endif // defined(OS_WIN) |
} // namespace debug |
} // namespace base |