diff --git a/build/unix/elfhack/Makefile.in b/build/unix/elfhack/Makefile.in index d759c0c18ff6..e669135a84a4 100644 --- a/build/unix/elfhack/Makefile.in +++ b/build/unix/elfhack/Makefile.in @@ -47,6 +47,7 @@ INTERNAL_TOOLS = 1 HOST_PROGRAM = elfhack NO_DIST_INSTALL = 1 +NO_PROFILE_GUIDED_OPTIMIZE = 1 VPATH += $(topsrcdir)/build diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in index 26ce87eea641..cc04adaceee7 100644 --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in @@ -350,7 +350,10 @@ _MSC_VER = @_MSC_VER@ DLL_PREFIX = @DLL_PREFIX@ LIB_PREFIX = @LIB_PREFIX@ -OBJ_SUFFIX = @OBJ_SUFFIX@ +# We do magic with OBJ_SUFFIX in config.mk, the following ensures we don't +# manually use it before config.mk inclusion +OBJ_SUFFIX = $(error config/config.mk needs to be included before using OBJ_SUFFIX) +_OBJ_SUFFIX = @OBJ_SUFFIX@ LIB_SUFFIX = @LIB_SUFFIX@ DLL_SUFFIX = @DLL_SUFFIX@ BIN_SUFFIX = @BIN_SUFFIX@ diff --git a/config/config.mk b/config/config.mk index 9060e65edaa6..54c03ed8e989 100644 --- a/config/config.mk +++ b/config/config.mk @@ -790,3 +790,21 @@ EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) --uselist -- $(MKSHLIB) ifdef STDCXX_COMPAT CHECK_STDCXX = objdump -p $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' > /dev/null && echo "TEST-UNEXPECTED-FAIL | | We don't want these libstdc++ symbols to be used:" && objdump -T $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' && exit 1 || exit 0 endif + +# autoconf.mk sets OBJ_SUFFIX to an error to avoid use before including +# this file +OBJ_SUFFIX := $(_OBJ_SUFFIX) + +# PGO builds with GCC build objects with instrumentation in a first pass, +# then objects optimized, without instrumentation, in a second pass. If +# we overwrite the ojects from the first pass with those from the second, +# we end up not getting instrumentation data for better optimization on +# incremental builds. As a consequence, we use a different object suffix +# for the first pass. +ifndef NO_PROFILE_GUIDED_OPTIMIZE +ifdef MOZ_PROFILE_GENERATE +ifdef GNU_CC +OBJ_SUFFIX := i_o +endif +endif +endif diff --git a/config/expandlibs_exec.py b/config/expandlibs_exec.py index 20cbac679ef7..fcea5c7d2776 100644 --- a/config/expandlibs_exec.py +++ b/config/expandlibs_exec.py @@ -93,7 +93,7 @@ class ExpandArgsMore(ExpandArgs): subprocess.call(ar_extract + [os.path.abspath(arg)], cwd=tmp) objs = [] for root, dirs, files in os.walk(tmp): - objs += [relativize(os.path.join(root, f)) for f in files if os.path.splitext(f)[1] == conf.OBJ_SUFFIX] + objs += [relativize(os.path.join(root, f)) for f in files if os.path.splitext(f)[1] in [conf.OBJ_SUFFIX, '.i_o']] newlist += objs else: newlist += [arg] diff --git a/config/expandlibs_gen.py b/config/expandlibs_gen.py index beaaf2e74b70..437687b7d266 100644 --- a/config/expandlibs_gen.py +++ b/config/expandlibs_gen.py @@ -46,7 +46,7 @@ from expandlibs import LibDescriptor def generate(args): desc = LibDescriptor() for arg in args: - if os.path.splitext(arg)[1] == conf.OBJ_SUFFIX: + if os.path.splitext(arg)[1] in [conf.OBJ_SUFFIX, '.i_o']: desc['OBJS'].append(os.path.abspath(arg)) elif os.path.splitext(arg)[1] == conf.LIB_SUFFIX and \ (os.path.exists(arg) or os.path.exists(arg + conf.LIBS_DESC_SUFFIX)): diff --git a/config/rules.mk b/config/rules.mk index aecc551d3934..22058e1d2a1a 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -421,7 +421,7 @@ endif ALL_TRASH = \ $(GARBAGE) $(TARGETS) $(OBJS) $(PROGOBJS) LOGS TAGS a.out \ $(filter-out $(ASFILES),$(OBJS:.$(OBJ_SUFFIX)=.s)) $(OBJS:.$(OBJ_SUFFIX)=.ii) \ - $(OBJS:.$(OBJ_SUFFIX)=.i) \ + $(OBJS:.$(OBJ_SUFFIX)=.i) $(OBJS:.$(OBJ_SUFFIX)=.i_o) \ $(HOST_PROGOBJS) $(HOST_OBJS) $(IMPORT_LIBRARY) $(DEF_FILE)\ $(EXE_DEF_FILE) so_locations _gen _stubs $(wildcard *.res) $(wildcard *.RES) \ $(wildcard *.pdb) $(CODFILE) $(MAPFILE) $(IMPORT_LIBRARY) \ @@ -948,6 +948,15 @@ ifdef GNU_CC endif endif endif + +ifneq (,$(MOZ_PROFILE_GENERATE)$(MOZ_PROFILE_USE)) +ifdef GNU_CC +# Force rebuilding libraries and programs in both passes because each +# pass uses different object files. +$(PROGRAM) $(SHARED_LIBRARY) $(LIBRARY): FORCE +endif +endif + endif # NO_PROFILE_GUIDED_OPTIMIZE ############################################## diff --git a/js/src/config/autoconf.mk.in b/js/src/config/autoconf.mk.in index 136f3924d2d1..98e4ee6e7701 100644 --- a/js/src/config/autoconf.mk.in +++ b/js/src/config/autoconf.mk.in @@ -177,7 +177,10 @@ _MSC_VER = @_MSC_VER@ DLL_PREFIX = @DLL_PREFIX@ LIB_PREFIX = @LIB_PREFIX@ -OBJ_SUFFIX = @OBJ_SUFFIX@ +# We do magic with OBJ_SUFFIX in config.mk, the following ensures we don't +# manually use it before config.mk inclusion +OBJ_SUFFIX = $(error config/config.mk needs to be included before using OBJ_SUFFIX) +_OBJ_SUFFIX = @OBJ_SUFFIX@ LIB_SUFFIX = @LIB_SUFFIX@ DLL_SUFFIX = @DLL_SUFFIX@ BIN_SUFFIX = @BIN_SUFFIX@ diff --git a/js/src/config/config.mk b/js/src/config/config.mk index 9060e65edaa6..54c03ed8e989 100644 --- a/js/src/config/config.mk +++ b/js/src/config/config.mk @@ -790,3 +790,21 @@ EXPAND_MKSHLIB = $(EXPAND_LIBS_EXEC) --uselist -- $(MKSHLIB) ifdef STDCXX_COMPAT CHECK_STDCXX = objdump -p $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' > /dev/null && echo "TEST-UNEXPECTED-FAIL | | We don't want these libstdc++ symbols to be used:" && objdump -T $(1) | grep -e 'GLIBCXX_3\.4\.\(9\|[1-9][0-9]\)' && exit 1 || exit 0 endif + +# autoconf.mk sets OBJ_SUFFIX to an error to avoid use before including +# this file +OBJ_SUFFIX := $(_OBJ_SUFFIX) + +# PGO builds with GCC build objects with instrumentation in a first pass, +# then objects optimized, without instrumentation, in a second pass. If +# we overwrite the ojects from the first pass with those from the second, +# we end up not getting instrumentation data for better optimization on +# incremental builds. As a consequence, we use a different object suffix +# for the first pass. +ifndef NO_PROFILE_GUIDED_OPTIMIZE +ifdef MOZ_PROFILE_GENERATE +ifdef GNU_CC +OBJ_SUFFIX := i_o +endif +endif +endif diff --git a/js/src/config/expandlibs_exec.py b/js/src/config/expandlibs_exec.py index 20cbac679ef7..fcea5c7d2776 100644 --- a/js/src/config/expandlibs_exec.py +++ b/js/src/config/expandlibs_exec.py @@ -93,7 +93,7 @@ class ExpandArgsMore(ExpandArgs): subprocess.call(ar_extract + [os.path.abspath(arg)], cwd=tmp) objs = [] for root, dirs, files in os.walk(tmp): - objs += [relativize(os.path.join(root, f)) for f in files if os.path.splitext(f)[1] == conf.OBJ_SUFFIX] + objs += [relativize(os.path.join(root, f)) for f in files if os.path.splitext(f)[1] in [conf.OBJ_SUFFIX, '.i_o']] newlist += objs else: newlist += [arg] diff --git a/js/src/config/expandlibs_gen.py b/js/src/config/expandlibs_gen.py index beaaf2e74b70..437687b7d266 100644 --- a/js/src/config/expandlibs_gen.py +++ b/js/src/config/expandlibs_gen.py @@ -46,7 +46,7 @@ from expandlibs import LibDescriptor def generate(args): desc = LibDescriptor() for arg in args: - if os.path.splitext(arg)[1] == conf.OBJ_SUFFIX: + if os.path.splitext(arg)[1] in [conf.OBJ_SUFFIX, '.i_o']: desc['OBJS'].append(os.path.abspath(arg)) elif os.path.splitext(arg)[1] == conf.LIB_SUFFIX and \ (os.path.exists(arg) or os.path.exists(arg + conf.LIBS_DESC_SUFFIX)): diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index aecc551d3934..22058e1d2a1a 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -421,7 +421,7 @@ endif ALL_TRASH = \ $(GARBAGE) $(TARGETS) $(OBJS) $(PROGOBJS) LOGS TAGS a.out \ $(filter-out $(ASFILES),$(OBJS:.$(OBJ_SUFFIX)=.s)) $(OBJS:.$(OBJ_SUFFIX)=.ii) \ - $(OBJS:.$(OBJ_SUFFIX)=.i) \ + $(OBJS:.$(OBJ_SUFFIX)=.i) $(OBJS:.$(OBJ_SUFFIX)=.i_o) \ $(HOST_PROGOBJS) $(HOST_OBJS) $(IMPORT_LIBRARY) $(DEF_FILE)\ $(EXE_DEF_FILE) so_locations _gen _stubs $(wildcard *.res) $(wildcard *.RES) \ $(wildcard *.pdb) $(CODFILE) $(MAPFILE) $(IMPORT_LIBRARY) \ @@ -948,6 +948,15 @@ ifdef GNU_CC endif endif endif + +ifneq (,$(MOZ_PROFILE_GENERATE)$(MOZ_PROFILE_USE)) +ifdef GNU_CC +# Force rebuilding libraries and programs in both passes because each +# pass uses different object files. +$(PROGRAM) $(SHARED_LIBRARY) $(LIBRARY): FORCE +endif +endif + endif # NO_PROFILE_GUIDED_OPTIMIZE ##############################################