From 45083c49346259d44b607b5a0162d495df8d39ab Mon Sep 17 00:00:00 2001 From: David Major Date: Wed, 1 Aug 2018 17:59:23 -0400 Subject: [PATCH] Bug 1341525: Enable PGO in 64-bit clang-cl builds. r=froydnj --- Makefile.in | 4 ++++ build/moz.configure/toolchain.configure | 25 +++++++++++++++++++++++-- build/mozconfig.clang-cl | 7 ++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/Makefile.in b/Makefile.in index 21d5ad3e97215..ad3e84cd8e282 100644 --- a/Makefile.in +++ b/Makefile.in @@ -314,6 +314,10 @@ endif else ifdef CLANG_CL maybe_clobber_profiledbuild: clean +# 32-bit PGO is currently blocked by bug 1479800 +ifeq ($(CPU_ARCH),x86_64) + $(LLVM_PROFDATA) merge -o $(DEPTH)/merged.profdata $(DEPTH)/*.profraw +endif else maybe_clobber_profiledbuild: $(RM) $(DIST)/bin/*.pgc diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure index 272547fe535f8..5d74de7d20bdf 100755 --- a/build/moz.configure/toolchain.configure +++ b/build/moz.configure/toolchain.configure @@ -1240,10 +1240,14 @@ set_config('WRAP_SYSTEM_INCLUDES', wrap_system_includes) set_config('VISIBILITY_FLAGS', visibility_flags) -@depends(c_compiler) +@depends(c_compiler, check_build_environment, target) @imports('multiprocessing') @imports(_from='__builtin__', _import='min') -def pgo_flags(compiler): +def pgo_flags(compiler, build_env, target): + topobjdir = build_env.topobjdir + if topobjdir.endswith('/js/src'): + topobjdir = topobjdir[:-7] + if compiler.type in ('gcc', 'clang'): return namespace( gen_cflags=['-fprofile-generate'], @@ -1253,6 +1257,18 @@ def pgo_flags(compiler): use_ldflags=['-fprofile-use'], ) + if compiler.type == 'clang-cl': + profdata = os.path.join(topobjdir, 'merged.profdata') + # 32-bit PGO is currently blocked by bug 1479800 + if target.cpu == 'x86_64': + return namespace( + gen_cflags=['-fprofile-instr-generate'], + gen_ldflags=['clang_rt.profile-x86_64.lib'], + use_cflags=['-fprofile-instr-use=%s' % profdata, + '-Wno-error=profile-instr-unprofiled'], + use_ldflags=[], + ) + if compiler.type == 'msvc': num_cores = min(8, multiprocessing.cpu_count()) cgthreads = '-CGTHREADS:%s' % num_cores @@ -1282,6 +1298,11 @@ set_config('PROFILE_GEN_LDFLAGS', pgo_flags.gen_ldflags) set_config('PROFILE_USE_CFLAGS', pgo_flags.use_cflags) set_config('PROFILE_USE_LDFLAGS', pgo_flags.use_ldflags) +llvm_profdata = check_prog('LLVM_PROFDATA', ['llvm-profdata'], + allow_missing=True) + +add_old_configure_assignment('LLVM_PROFDATA', llvm_profdata) + @depends(c_compiler) def preprocess_option(compiler): diff --git a/build/mozconfig.clang-cl b/build/mozconfig.clang-cl index 3ab9401d2f930..4591b407ed1b3 100644 --- a/build/mozconfig.clang-cl +++ b/build/mozconfig.clang-cl @@ -1,8 +1,13 @@ if test -d "$topsrcdir/clang/bin"; then CLANG_DIR=`cd "$topsrcdir/clang/bin" ; pwd` export PATH="${CLANG_DIR}:${PATH}" - mk_export_correct_style PATH + + if $(cd $topsrcdir/clang/lib/clang/* && test -d lib/windows); then + CLANG_LIB_DIR="$(cd $topsrcdir/clang/lib/clang/* && cd lib/windows && pwd)" + export LIB=$LIB:$CLANG_LIB_DIR + mk_export_correct_style LIB + fi fi export CC=clang-cl