bug 419348 - build config fixes for profile-guided optimization on mac. fixes for PGO on universal builds, configure arg to disable PGO in spite of profiled build. r=bsmedberg
--- a/Makefile.in
+++ b/Makefile.in
@@ -213,14 +213,19 @@ ifneq (,$(wildcard $(DIST)/bin/applicati
BUILDID = $(shell $(PYTHON) $(srcdir)/config/printconfigsetting.py $(DIST)/bin/application.ini App BuildID)
else
BUILDID = $(shell $(PYTHON) $(srcdir)/config/printconfigsetting.py $(DIST)/bin/platform.ini Build BuildID)
endif
#XXX: this is a hack, since we don't want to clobber for MSVC
# PGO support, but we can't do this test in client.mk
ifneq ($(OS_ARCH)_$(GNU_CC), WINNT_)
+# No point in clobbering if PGO has been explicitly disabled.
+ifndef NO_PROFILE_GUIDED_OPTIMIZE
maybe_clobber_profiledbuild: clobber_all
else
maybe_clobber_profiledbuild:
endif
+else
+maybe_clobber_profiledbuild:
+endif
.PHONY: maybe_clobber_profiledbuild
--- a/client.mk
+++ b/client.mk
@@ -926,16 +926,40 @@ real_l10n-checkout:
if test "$$conflicts" ; then \
echo "$(MAKE): *** Conflicts during checkout." ;\
echo "$$conflicts" ;\
echo "$(MAKE): Refer to $(CVSCO_LOGFILE_L10N) for full log." ;\
false; \
else true; \
fi
+####################################
+# Profile-Guided Optimization
+# To use this, you should set the following variables in your mozconfig
+# mk_add_options PROFILE_GEN_SCRIPT=/path/to/profile-script
+#
+# The profile script should exercise the functionality to be included
+# in the profile feedback.
+#
+# This is up here, outside of the MOZ_CURRENT_PROJECT logic so that this
+# is usable in multi-pass builds, where you might not have a runnable
+# application until all the build passes and postflight scripts have run.
+ifdef MOZ_OBJDIR
+ PGO_OBJDIR = $(MOZ_OBJDIR)
+else
+ PGO_OBJDIR := $(TOPSRCDIR)
+endif
+
+profiledbuild::
+ $(MAKE) -f $(TOPSRCDIR)/client.mk build MOZ_PROFILE_GENERATE=1
+ OBJDIR=${PGO_OBJDIR} $(PROFILE_GEN_SCRIPT)
+ $(MAKE) -f $(TOPSRCDIR)/client.mk maybe_clobber_profiledbuild
+ $(MAKE) -f $(TOPSRCDIR)/client.mk build MOZ_PROFILE_USE=1
+
+
#####################################################
# First Checkout
ifdef _IS_FIRST_CHECKOUT
# First time, do build target in a new process to pick up new files.
build::
$(MAKE) -f $(TOPSRCDIR)/client.mk build
else
@@ -953,17 +977,17 @@ MOZ_BUILD_DATE = $(shell $(PYTHON) $(TOP
export MOZ_BUILD_DATE
endif
endif
endif
#####################################################
# Preflight, before building any project
-build profiledbuild alldep preflight_all::
+build alldep preflight_all::
ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_PREFLIGHT_ALL),,1))
# Don't run preflight_all for individual projects in multi-project builds
# (when MOZ_CURRENT_PROJECT is set.)
ifndef MOZ_BUILD_PROJECTS
# Building a single project, OBJDIR is usable.
set -e; \
for mkfile in $(MOZ_PREFLIGHT_ALL); do \
$(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight_all TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
@@ -977,17 +1001,17 @@ else
done
endif
endif
# If we're building multiple projects, but haven't specified which project,
# loop through them.
ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_BUILD_PROJECTS),,1))
-configure depend build profiledbuild install export libs clean realclean distclean alldep preflight postflight::
+configure depend build install export libs clean realclean distclean alldep preflight postflight maybe_clobber_profiledbuild::
set -e; \
for app in $(MOZ_BUILD_PROJECTS); do \
$(MAKE) -f $(TOPSRCDIR)/client.mk $@ MOZ_CURRENT_PROJECT=$$app; \
done
else
# MOZ_CURRENT_PROJECT: either doing a single-project build, or building an
@@ -1067,68 +1091,54 @@ endif
# Depend
depend:: $(OBJDIR)/Makefile $(OBJDIR)/config.status
$(MOZ_MAKE) export && $(MOZ_MAKE) depend
####################################
# Preflight
-build profiledbuild alldep preflight::
+build alldep preflight::
ifdef MOZ_PREFLIGHT
set -e; \
for mkfile in $(MOZ_PREFLIGHT); do \
$(MAKE) -f $(TOPSRCDIR)/$$mkfile preflight TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
done
endif
####################################
# Build it
build:: $(OBJDIR)/Makefile $(OBJDIR)/config.status
$(MOZ_MAKE)
####################################
-# Profile-feedback build (gcc only)
-# To use this, you should set the following variables in your mozconfig
-# mk_add_options PROFILE_GEN_SCRIPT=/path/to/profile-script
-#
-# The profile script should exercise the functionality to be included
-# in the profile feedback.
-
-profiledbuild:: $(OBJDIR)/Makefile $(OBJDIR)/config.status
- $(MOZ_MAKE) MOZ_PROFILE_GENERATE=1
- OBJDIR=${OBJDIR} $(PROFILE_GEN_SCRIPT)
- $(MOZ_MAKE) maybe_clobber_profiledbuild
- $(MOZ_MAKE) MOZ_PROFILE_USE=1
-
-####################################
# Other targets
# Pass these target onto the real build system
-install export libs clean realclean distclean alldep:: $(OBJDIR)/Makefile $(OBJDIR)/config.status
+install export libs clean realclean distclean alldep maybe_clobber_profiledbuild:: $(OBJDIR)/Makefile $(OBJDIR)/config.status
$(MOZ_MAKE) $@
####################################
# Postflight
-build profiledbuild alldep postflight::
+build alldep postflight::
ifdef MOZ_POSTFLIGHT
set -e; \
for mkfile in $(MOZ_POSTFLIGHT); do \
$(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
done
endif
endif # MOZ_CURRENT_PROJECT
####################################
# Postflight, after building all projects
-build profiledbuild alldep postflight_all::
+build alldep postflight_all::
ifeq (,$(MOZ_CURRENT_PROJECT)$(if $(MOZ_POSTFLIGHT_ALL),,1))
# Don't run postflight_all for individual projects in multi-project builds
# (when MOZ_CURRENT_PROJECT is set.)
ifndef MOZ_BUILD_PROJECTS
# Building a single project, OBJDIR is usable.
set -e; \
for mkfile in $(MOZ_POSTFLIGHT_ALL); do \
$(MAKE) -f $(TOPSRCDIR)/$$mkfile postflight_all TOPSRCDIR=$(TOPSRCDIR) OBJDIR=$(OBJDIR) MOZ_OBJDIR=$(MOZ_OBJDIR); \
@@ -1156,9 +1166,9 @@ cleansrcdir:
fi;
# (! IS_FIRST_CHECKOUT)
endif
echo-variable-%:
@echo $($*)
-.PHONY: checkout real_checkout depend build profiledbuild export libs alldep install clean realclean distclean cleansrcdir pull_all build_all clobber clobber_all pull_and_build_all everything configure preflight_all preflight postflight postflight_all
+.PHONY: checkout real_checkout depend build profiledbuild maybe_clobber_profiledbuild export libs alldep install clean realclean distclean cleansrcdir pull_all build_all clobber clobber_all pull_and_build_all everything configure preflight_all preflight postflight postflight_all
--- a/config/autoconf.mk.in
+++ b/config/autoconf.mk.in
@@ -278,16 +278,17 @@ ACDEFINES = @MOZ_DEFINES@
WARNINGS_AS_ERRORS = @WARNINGS_AS_ERRORS@
MOZ_OPTIMIZE = @MOZ_OPTIMIZE@
MOZ_OPTIMIZE_FLAGS = @MOZ_OPTIMIZE_FLAGS@
MOZ_OPTIMIZE_LDFLAGS = @MOZ_OPTIMIZE_LDFLAGS@
MOZ_RTTI_FLAGS_ON = @_MOZ_RTTI_FLAGS_ON@
+MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE = @MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE@
PROFILE_GEN_CFLAGS = @PROFILE_GEN_CFLAGS@
PROFILE_GEN_LDFLAGS = @PROFILE_GEN_LDFLAGS@
PROFILE_USE_CFLAGS = @PROFILE_USE_CFLAGS@
PROFILE_USE_LDFLAGS = @PROFILE_USE_LDFLAGS@
XCFLAGS = @XCFLAGS@
XLDFLAGS = @XLDFLAGS@
XLIBS = @XLIBS@
--- a/config/config.mk
+++ b/config/config.mk
@@ -346,16 +346,21 @@ ifndef _ENABLE_PIC
DSO_CFLAGS=
ifeq ($(OS_ARCH)_$(HAVE_GCC3_ABI),Darwin_1)
DSO_PIC_CFLAGS=-mdynamic-no-pic
else
DSO_PIC_CFLAGS=
endif
endif
+# This comes from configure
+ifdef MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE
+NO_PROFILE_GUIDED_OPTIMIZE = 1
+endif
+
# Enable profile-based feedback
ifndef NO_PROFILE_GUIDED_OPTIMIZE
ifdef MOZ_PROFILE_GENERATE
# No sense in profiling tools
ifndef INTERNAL_TOOLS
OS_CFLAGS += $(PROFILE_GEN_CFLAGS)
OS_CXXFLAGS += $(PROFILE_GEN_CFLAGS)
OS_LDFLAGS += $(PROFILE_GEN_LDFLAGS)
--- a/configure.in
+++ b/configure.in
@@ -6545,16 +6545,25 @@ fi
dnl ========================================================
dnl Profile guided optimization
dnl ========================================================
dnl Test for profiling options
dnl Under gcc 3.3, use -fprofile-arcs/-fbranch-probabilities
dnl Under gcc 3.4+, use -fprofile-generate/-fprofile-use
+dnl Provide a switch to disable PGO even when called via profiledbuild.
+MOZ_ARG_DISABLE_BOOL(profile-guided-optimization,
+[ --disable-profile-guided-optimization
+ Don't build with PGO even if called via make profiledbuild],
+MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE=1,
+MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE=)
+
+AC_SUBST(MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE)
+
_SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fprofile-generate"
AC_MSG_CHECKING([whether C compiler supports -fprofile-generate])
AC_TRY_COMPILE([], [return 0;],
[ PROFILE_GEN_CFLAGS="-fprofile-generate"
result="yes" ], result="no")
AC_MSG_RESULT([$result])