From cc8ec23ad56ce75b803a2d9faeca4bca748c348c Mon Sep 17 00:00:00 2001 From: Chunyang Dai Date: Thu, 22 Oct 2015 00:24:12 +0800 Subject: [PATCH] build,src: add Intel Vtune profiling support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This feature supports the Intel Vtune profiling support for JITted JavaScript on IA32 / X64 / X32 platform. The advantage of this profiling is that the user / developer of NodeJS application can get the detailed profiling information for every line of the JavaScript source code. This information will be very useful for the owner to optimize their applications. This feature is a compile-time option. For windows platform, the user needs to pass the following parameter to vcbuild.bat: "enable-vtune" For other OS, the user needs to pass the following parameter to ./configure command: "--enable-vtune-profiling" Ref: https://github.com/nodejs/node/pull/3785 PR-URL: https://github.com/nodejs/node/pull/5527 Reviewed-By: James M Snell Reviewed-By: Ben Noordhuis Reviewed-By: Johan Bergström --- configure | 17 +++++++++++++++++ node.gyp | 8 ++++++++ src/node.cc | 7 +++++++ vcbuild.bat | 7 +++++-- 4 files changed, 37 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 054ebb41cbd8e4..1bb0da21ce67fc 100755 --- a/configure +++ b/configure @@ -92,6 +92,14 @@ parser.add_option("--partly-static", help="Generate an executable with libgcc and libstdc++ libraries. This " "will not work on OSX when using the default compilation environment") +parser.add_option("--enable-vtune-profiling", + action="store_true", + dest="enable_vtune_profiling", + help="Enable profiling support for Intel Vtune profiler to profile" + "JavaScript code executed in nodejs. This feature is only available " + "for ia32, x32 or x64 platform.") + + parser.add_option("--link-module", action="append", dest="linked_module", @@ -686,6 +694,15 @@ def configure_node(o): o['variables']['node_core_target_name'] = 'node_base' o['variables']['node_target_type'] = 'static_library' + if target_arch in ('x86', 'x64', 'ia32', 'x32'): + o['variables']['node_enable_v8_vtunejit'] = b(options.enable_vtune_profiling) + elif options.enable_vtune_profiling: + raise Exception( + 'vtune profiler for JavaScript is only supported on x86, x32 or x64 ' + 'platform.') + else: + o['variables']['node_enable_v8_vtunejit'] = 'false' + if flavor in ('solaris', 'mac', 'linux', 'freebsd'): use_dtrace = not options.without_dtrace # Don't enable by default on linux and freebsd diff --git a/node.gyp b/node.gyp index d549e18c050cef..240922d619337f 100644 --- a/node.gyp +++ b/node.gyp @@ -12,6 +12,7 @@ 'node_use_openssl%': 'true', 'node_shared_openssl%': 'false', 'node_v8_options%': '', + 'node_enable_v8_vtunejit%': 'false', 'node_target_type%': 'executable', 'node_core_target_name%': 'node', 'library_files': [ @@ -235,6 +236,13 @@ 'defines': [ 'NODE_HAVE_SMALL_ICU=1' ], }]], }], + [ 'node_enable_v8_vtunejit=="true" and (target_arch=="x64" or \ + target_arch=="ia32" or target_arch=="x32")', { + 'defines': [ 'NODE_ENABLE_VTUNE_PROFILING' ], + 'dependencies': [ + 'deps/v8/src/third_party/vtune/v8vtune.gyp:v8_vtune' + ], + }], [ 'node_use_openssl=="true"', { 'defines': [ 'HAVE_OPENSSL=1' ], 'sources': [ diff --git a/src/node.cc b/src/node.cc index 85383fa166661c..8264bfe8bba8a3 100644 --- a/src/node.cc +++ b/src/node.cc @@ -44,6 +44,10 @@ #include "v8-profiler.h" #include "zlib.h" +#ifdef NODE_ENABLE_VTUNE_PROFILING +#include "../deps/v8/src/third_party/vtune/v8-vtune.h" +#endif + #include #include // PATH_MAX #include @@ -4070,6 +4074,9 @@ static void StartNodeInstance(void* arg) { Isolate::CreateParams params; ArrayBufferAllocator* array_buffer_allocator = new ArrayBufferAllocator(); params.array_buffer_allocator = array_buffer_allocator; +#ifdef NODE_ENABLE_VTUNE_PROFILING + params.code_event_handler = vTune::GetVtuneCodeEventHandler(); +#endif Isolate* isolate = Isolate::New(params); if (track_heap_objects) { isolate->GetHeapProfiler()->StartTrackingHeapObjects(true); diff --git a/vcbuild.bat b/vcbuild.bat index 852ee85268e2ec..14c65fdcdb3bf5 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -36,6 +36,7 @@ set release_urls_arg= set build_release= set configure_flags= set build_addons= +set enable_vtune_profiling= :next-arg if "%1"=="" goto args-done @@ -73,6 +74,7 @@ if /i "%1"=="full-icu" set i18n_arg=%1&goto arg-ok if /i "%1"=="intl-none" set i18n_arg=%1&goto arg-ok if /i "%1"=="download-all" set download_arg="--download=all"&goto arg-ok if /i "%1"=="ignore-flaky" set test_args=%test_args% --flaky-tests=dontcare&goto arg-ok +if /i "%1"=="enable-vtune" set enable_vtune_profiling="--enable-vtune-profiling"&goto arg-ok echo Warning: ignoring invalid command line option `%1`. @@ -179,7 +181,7 @@ if defined noprojgen goto msbuild @rem Generate the VS project. echo configure %configure_flags% --dest-cpu=%target_arch% --tag=%TAG% -python configure %configure_flags% --dest-cpu=%target_arch% --tag=%TAG% +python configure %configure_flags% %enable_vtune_profiling% --dest-cpu=%target_arch% --tag=%TAG% if errorlevel 1 goto create-msvs-files-failed if not exist node.sln goto create-msvs-files-failed echo Project files generated. @@ -294,7 +296,7 @@ goto exit :help -echo vcbuild.bat [debug/release] [msi] [test-all/test-uv/test-internet/test-pummel/test-simple/test-message] [clean] [noprojgen] [small-icu/full-icu/intl-none] [nobuild] [nosign] [x86/x64] [vc2013/vc2015] [download-all] +echo vcbuild.bat [debug/release] [msi] [test-all/test-uv/test-internet/test-pummel/test-simple/test-message] [clean] [noprojgen] [small-icu/full-icu/intl-none] [nobuild] [nosign] [x86/x64] [vc2013/vc2015] [download-all] [enable-vtune] echo Examples: echo vcbuild.bat : builds release build @@ -302,6 +304,7 @@ echo vcbuild.bat debug : builds debug build echo vcbuild.bat release msi : builds release build and MSI installer package echo vcbuild.bat test : builds debug build and runs tests echo vcbuild.bat build-release : builds the release distribution as used by nodejs.org +echo vcbuild.bat enable-vtune : builds nodejs with Intel Vtune profiling support to profile JavaScript goto exit :exit