From 7c452845b8d44287f5db96a7f19e7d395e1899ab Mon Sep 17 00:00:00 2001 From: Bartosz Sosnowski Date: Wed, 6 Jun 2018 18:22:50 +0200 Subject: [PATCH] build, win: make LTCG optional MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disables Link Time Code Generation by default. Adds ‘ltcg’ vcbuild option to enable it. LTCG will be used by default by release and CI builds. PR-URL: https://github.com/nodejs/node/pull/21186 Reviewed-By: Anna Henningsen Reviewed-By: Ben Noordhuis Reviewed-By: Refael Ackermann Reviewed-By: James M Snell Reviewed-By: Joyee Cheung --- common.gypi | 48 ++++++++++++++++++++++++++++++++---------------- configure | 9 +++++++++ vcbuild.bat | 8 ++++++-- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/common.gypi b/common.gypi index 77ce92f2fec8bb..d25a434b03d433 100644 --- a/common.gypi +++ b/common.gypi @@ -16,6 +16,7 @@ 'node_use_v8_platform%': 'true', 'node_use_bundled_v8%': 'true', 'node_module_version%': '', + 'node_with_ltcg%': '', 'node_tag%': '', 'uv_library%': 'static_library', @@ -192,6 +193,35 @@ 'RuntimeLibrary': 0 # MultiThreaded (/MT) } } + }], + ['node_with_ltcg=="true"', { + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'true' # /GL, whole program optimization, needed for LTCG + }, + 'VCLibrarianTool': { + 'AdditionalOptions': [ + '/LTCG:INCREMENTAL', # link time code generation + ] + }, + 'VCLinkerTool': { + 'OptimizeReferences': 2, # /OPT:REF + 'EnableCOMDATFolding': 2, # /OPT:ICF + 'LinkIncremental': 1, # disable incremental linking + 'AdditionalOptions': [ + '/LTCG:INCREMENTAL', # incremental link-time code generation + ] + } + } + }, { + 'msvs_settings': { + 'VCCLCompilerTool': { + 'WholeProgramOptimization': 'false' + }, + 'VCLinkerTool': { + 'LinkIncremental': 2 # enable incremental linking + } + } }] ], 'msvs_settings': { @@ -199,7 +229,6 @@ 'Optimization': 3, # /Ox, full optimization 'FavorSizeOrSpeed': 1, # /Ot, favor speed over size 'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible - 'WholeProgramOptimization': 'true', # /GL, whole program optimization, needed for LTCG 'OmitFramePointers': 'true', 'EnableFunctionLevelLinking': 'true', 'EnableIntrinsicFunctions': 'true', @@ -207,21 +236,8 @@ 'AdditionalOptions': [ '/MP', # compile across multiple CPUs ], - }, - 'VCLibrarianTool': { - 'AdditionalOptions': [ - '/LTCG', # link time code generation - ], - }, - 'VCLinkerTool': { - 'OptimizeReferences': 2, # /OPT:REF - 'EnableCOMDATFolding': 2, # /OPT:ICF - 'LinkIncremental': 1, # disable incremental linking - 'AdditionalOptions': [ - '/LTCG:INCREMENTAL', # incremental link-time code generation - ], - }, - }, + } + } } }, # Forcibly disable -Werror. We support a wide range of compilers, it's diff --git a/configure b/configure index f72e9123b90b0f..1b3ff0162fc4c4 100755 --- a/configure +++ b/configure @@ -425,6 +425,11 @@ intl_optgroup.add_option('--with-icu-source', dest='with_icu_source', help='Intl mode: optional local path to icu/ dir, or path/URL of icu source archive.') +parser.add_option('--with-ltcg', + action='store_true', + dest='with_ltcg', + help='Use Link Time Code Generation. This feature is only available on Windows.') + intl_optgroup.add_option('--download', action='store', dest='download_list', @@ -953,6 +958,10 @@ def configure_node(o): else: o['variables']['node_use_perfctr'] = 'false' + o['variables']['node_with_ltcg'] = b(options.with_ltcg) + if flavor != 'win' and options.with_ltcg: + raise Exception('Link Time Code Generation is only supported on Windows.') + if options.tag: o['variables']['node_tag'] = '-' + options.tag else: diff --git a/vcbuild.bat b/vcbuild.bat index af5c1a28e5f75e..368112edf9a02c 100644 --- a/vcbuild.bat +++ b/vcbuild.bat @@ -15,6 +15,7 @@ cd %~dp0 set config=Release set target=Build set target_arch=x64 +set ltcg= set target_env= set noprojgen= set projgen= @@ -61,7 +62,7 @@ set doc= :next-arg if "%1"=="" goto args-done if /i "%1"=="debug" set config=Debug&goto arg-ok -if /i "%1"=="release" set config=Release&goto arg-ok +if /i "%1"=="release" set config=Release&set ltcg=1&goto arg-ok if /i "%1"=="clean" set target=Clean&goto arg-ok if /i "%1"=="ia32" set target_arch=x86&goto arg-ok if /i "%1"=="x86" set target_arch=x86&goto arg-ok @@ -75,6 +76,7 @@ if /i "%1"=="sign" set sign=1&goto arg-ok if /i "%1"=="nosnapshot" set nosnapshot=1&goto arg-ok if /i "%1"=="noetw" set noetw=1&goto arg-ok if /i "%1"=="noperfctr" set noperfctr=1&goto arg-ok +if /i "%1"=="ltcg" set ltcg=1&goto arg-ok if /i "%1"=="licensertf" set licensertf=1&goto arg-ok if /i "%1"=="test" set test_args=%test_args% -J %common_test_suites%&set lint_cpp=1&set lint_js=1&set lint_md=1&goto arg-ok if /i "%1"=="test-ci" set test_args=%test_args% %test_ci_args% -p tap --logfile test.tap %common_test_suites%&set cctest_args=%cctest_args% --gtest_output=tap:cctest.tap&goto arg-ok @@ -150,6 +152,7 @@ if defined build_release ( set download_arg="--download=all" set i18n_arg=small-icu set projgen=1 + set ltcg=1 ) :: assign path to node_exe @@ -162,6 +165,7 @@ if "%config%"=="Debug" set configure_flags=%configure_flags% --debug if defined nosnapshot set configure_flags=%configure_flags% --without-snapshot if defined noetw set configure_flags=%configure_flags% --without-etw& set noetw_msi_arg=/p:NoETW=1 if defined noperfctr set configure_flags=%configure_flags% --without-perfctr& set noperfctr_msi_arg=/p:NoPerfCtr=1 +if defined ltcg set configure_flags=%configure_flags% --with-ltcg if defined release_urlbase set configure_flags=%configure_flags% --release-urlbase=%release_urlbase% if defined download_arg set configure_flags=%configure_flags% %download_arg% if defined enable_vtune_arg set configure_flags=%configure_flags% --enable-vtune-profiling @@ -656,7 +660,7 @@ del .used_configure_flags goto exit :help -echo vcbuild.bat [debug/release] [msi] [doc] [test/test-ci/test-all/test-addons/test-addons-napi/test-internet/test-pummel/test-simple/test-message/test-gc/test-tick-processor/test-known-issues/test-node-inspect/test-check-deopts/test-npm/test-async-hooks/test-v8/test-v8-intl/test-v8-benchmarks/test-v8-all] [ignore-flaky] [static/dll] [noprojgen] [projgen] [small-icu/full-icu/without-intl] [nobuild] [nosnapshot] [noetw] [noperfctr] [licensetf] [sign] [ia32/x86/x64] [vs2017] [download-all] [enable-vtune] [lint/lint-ci/lint-js/lint-js-ci/lint-md] [lint-md-build] [package] [build-release] [upload] [no-NODE-OPTIONS] [link-module path-to-module] [debug-http2] [debug-nghttp2] [clean] [no-cctest] [openssl-no-asm] +echo vcbuild.bat [debug/release] [msi] [doc] [test/test-ci/test-all/test-addons/test-addons-napi/test-internet/test-pummel/test-simple/test-message/test-gc/test-tick-processor/test-known-issues/test-node-inspect/test-check-deopts/test-npm/test-async-hooks/test-v8/test-v8-intl/test-v8-benchmarks/test-v8-all] [ignore-flaky] [static/dll] [noprojgen] [projgen] [small-icu/full-icu/without-intl] [nobuild] [nosnapshot] [noetw] [noperfctr] [ltcg] [licensetf] [sign] [ia32/x86/x64] [vs2017] [download-all] [enable-vtune] [lint/lint-ci/lint-js/lint-js-ci/lint-md] [lint-md-build] [package] [build-release] [upload] [no-NODE-OPTIONS] [link-module path-to-module] [debug-http2] [debug-nghttp2] [clean] [no-cctest] [openssl-no-asm] echo Examples: echo vcbuild.bat : builds release build echo vcbuild.bat debug : builds debug build