Index: config.w32 =================================================================== --- config.w32 (revision 299394) +++ config.w32 (working copy) @@ -100,6 +100,19 @@ if (PHP_DEBUG == "yes" && PHP_DEBUG_PACK == "yes") { ERROR("Use of both --enable-debug and --enable-debug-pack not allowed."); } + +ARG_ENABLE('pgi', 'Generate PGO instrumented binaries', 'no'); +ARG_WITH('pgo', 'Compile optimized binaries using training data from folder', 'no'); +if (PHP_PGI == "yes" || PHP_PGO != "no") { + PGOMGR = PATH_PROG('pgomgr', WshShell.Environment("Process").Item("PATH")); + if (!PGOMGR) { + ERROR("--enable-pgi and --with-pgo options can only be used if PGO capable compiler is present."); + } + if (PHP_PGI == "yes" && PHP_PGO != "no") { + ERROR("Use of both --enable-pgi and --with-pgo not allowed."); + } +} + ARG_ENABLE('zts', 'Thread safety', 'yes'); // Configures the hard-coded installation dir ARG_ENABLE('prefix', 'where PHP will be installed', ''); @@ -226,6 +239,19 @@ DEFINE("PHPLIB", "php" + PHP_VERSION + ".lib"); } +// CFLAGS, LDFLAGS and BUILD_DIR are defined +// Add compiler and link flags if PGO options are selected +if (PHP_DEBUG != "yes" && PHP_PGI == "yes") { + ADD_FLAG('CFLAGS', "/GL /O2"); + ADD_FLAG('LDFLAGS', "/LTCG:PGINSTRUMENT"); + DEFINE("PGOPGD_DIR", "$(BUILD_DIR)"); +} +else if (PHP_DEBUG != "yes" && PHP_PGO != "no") { + ADD_FLAG('CFLAGS', "/GL /O2"); + ADD_FLAG('LDFLAGS', "/LTCG:PGUPDATE"); + DEFINE("PGOPGD_DIR", ((PHP_PGO.length == 0 || PHP_PGO == "yes") ? "$(BUILD_DIR)" : PHP_PGO)); +} + // Find the php_build dir - it contains headers and libraries // that we need ARG_WITH('php-build', 'Path to where you extracted the development libraries (http://wiki.php.net/internals/windows/libs). Assumes that it is a sibling of this source dir (..\\deps) if not specified', 'no'); Index: confutils.js =================================================================== --- confutils.js (revision 299394) +++ confutils.js (working copy) @@ -395,7 +395,8 @@ 'php-build', 'snapshot-template', 'ereg', 'pcre-regex', 'fastcgi', 'force-cgi-redirect', 'path-info-check', 'zts', 'ipv6', 'memory-limit', - 'zend-multibyte', 'fd-setsize', 'memory-manager', 't1lib' + 'zend-multibyte', 'fd-setsize', 'memory-manager', + 't1lib', 'pgi', 'pgo' ); var force; @@ -1030,6 +1031,10 @@ manifest = "-@$(_VC_MANIFEST_EMBED_EXE)"; } + if(PHP_PGI == "yes" || PHP_PGO != "no") { + ldflags += " /PGD:$(PGOPGD_DIR)\\" + makefiletarget.substring(0, makefiletarget.indexOf(".")) + ".pgd"; + } + if (ld) { MFO.WriteLine("\t" + ld + " /nologo /out:$(BUILD_DIR)\\" + makefiletarget + " " + ldflags + " $(" + SAPI + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LDFLAGS_" + SAPI + ") $(LIBS_" + SAPI + ") $(BUILD_DIR)\\" + resname); } else { @@ -1154,6 +1159,7 @@ var objs = null; var EXT = extname.toUpperCase(); var extname_for_printing; + var ldflags; if (shared == null) { eval("shared = PHP_" + EXT + "_SHARED;"); @@ -1183,7 +1189,6 @@ MFO.WriteLine("# objects for EXT " + extname); MFO.WriteBlankLines(1); - ADD_SOURCES(configure_module_dirname, file_list, extname, obj_dir); MFO.WriteBlankLines(1); @@ -1197,10 +1202,15 @@ var resname = generate_version_info_resource(dllname, extname, configure_module_dirname, false); var ld = "@$(CC)"; + ldflags = ""; + if (PHP_PGI == "yes" || PHP_PGO != "no") { + ldflags = " /PGD:$(PGOPGD_DIR)\\" + dllname.substring(0, dllname.indexOf(".")) + ".pgd"; + } + MFO.WriteLine("$(BUILD_DIR)\\" + libname + ": $(BUILD_DIR)\\" + dllname); MFO.WriteBlankLines(1); MFO.WriteLine("$(BUILD_DIR)\\" + dllname + ": $(DEPS_" + EXT + ") $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(BUILD_DIR)\\" + resname); - MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")"); + MFO.WriteLine("\t" + ld + " $(" + EXT + "_GLOBAL_OBJS) $(BUILD_DIR)\\$(PHPLIB) $(LIBS_" + EXT + ") $(LIBS) $(BUILD_DIR)\\" + resname + " /link /out:$(BUILD_DIR)\\" + dllname + ldflags + " $(DLL_LDFLAGS) $(LDFLAGS) $(LDFLAGS_" + EXT + ")"); MFO.WriteLine("\t-@$(_VC_MANIFEST_EMBED_DLL)"); MFO.WriteBlankLines(1); Index: Makefile =================================================================== --- Makefile (revision 299394) +++ Makefile (working copy) @@ -22,6 +22,7 @@ MC="$(MC)" MT="$(MT)" RE2C="$(RE2C)" +PGOMGR="$(PGOMGR)" PHP_BUILD=$(PHP_BUILD) MCFILE=$(BUILD_DIR)\wsyslog.rc @@ -58,6 +59,12 @@ $(RE2C) $(RE2C_FLAGS) --case-inverted -cbdFt Zend/zend_language_scanner_defs.h -oZend/zend_language_scanner.c Zend/zend_language_scanner.l !endif +!if $(PGOMGR) != "" +PHP5_PGD_OPTION=/PGD:$(PGOPGD_DIR)\php5.pgd +!else +PHP5_PGD_OPTION= +!endif + PHPDLL_RES=$(BUILD_DIR)\$(PHPDLL).res $(MCFILE): win32\build\wsyslog.mc @@ -80,7 +87,7 @@ win32\build\template.rc $(BUILD_DIR)\$(PHPDLL): generated_files $(PHPDEF) $(PHP_GLOBAL_OBJS) $(STATIC_EXT_OBJS) $(PHPDLL_RES) $(MCFILE) - @$(CC) $(PHP_GLOBAL_OBJS) $(STATIC_EXT_OBJS) $(STATIC_EXT_LIBS) $(LIBS) $(PHPDLL_RES) /link /out:$(BUILD_DIR)\$(PHPDLL) $(PHP_LDFLAGS) $(LDFLAGS) $(STATIC_EXT_LDFLAGS) + @$(CC) $(PHP_GLOBAL_OBJS) $(STATIC_EXT_OBJS) $(STATIC_EXT_LIBS) $(LIBS) $(PHPDLL_RES) /link /out:$(BUILD_DIR)\$(PHPDLL) $(PHP5_PGD_OPTION) $(PHP_LDFLAGS) $(LDFLAGS) $(STATIC_EXT_LDFLAGS) -@$(_VC_MANIFEST_EMBED_DLL) $(BUILD_DIR)\$(PHPLIB): $(BUILD_DIR)\$(PHPDLL) @@ -110,8 +117,17 @@ clean-all: @echo Cleaning standard build dirs @for %D in (_x $(BUILD_DIRS_SUB)) do @if exist %D @rd /s /q %D - -@del /f /q $(BUILD_DIR)\*.res $(BUILD_DIR)\*.lib $(BUILD_DIR)\*.ilk $(BUILD_DIR)\*.pdb $(BUILD_DIR)\*.exp $(PHPDEF) $(BUILD_DIR)\*.rc $(BUILD_DIR)\*.dbg $(BUILD_DIR)\*.bin $(BUILD_DIR)\php*.dll $(BUILD_DIR)\php*.exe > NUL + -@del /f /q $(BUILD_DIR)\*.res $(BUILD_DIR)\*.lib $(BUILD_DIR)\*.ilk $(BUILD_DIR)\*.pdb $(BUILD_DIR)\*.exp $(PHPDEF) $(BUILD_DIR)\*.rc $(BUILD_DIR)\*.manifest $(BUILD_DIR)\*.dbg $(BUILD_DIR)\*.bin $(BUILD_DIR)\php*.dll $(BUILD_DIR)\php*.exe > NUL +clean-pgo: clean-all + -rd /s /q $(BUILD_DIR)\php-$(PHP_VERSION_STRING) + -rd /s /q $(BUILD_DIR)\pecl-$(PHP_VERSION_STRING) + -rd /s /q $(BUILD_DIR)\php-test-pack-$(PHP_VERSION_STRING) + -del /f /q $(BUILD_DIR)\php-$(PHP_VERSION_STRING)$(PHP_ZTS_ARCHIVE_POSTFIX)-Win32-$(PHP_COMPILER_SHORT)-$(PHP_ARCHITECTURE).zip + -del /f /q $(BUILD_DIR)\php-debug-pack-$(PHP_VERSION_STRING)$(PHP_ZTS_ARCHIVE_POSTFIX)-Win32-$(PHP_COMPILER_SHORT)-$(PHP_ARCHITECTURE).zip + -del /f /q $(BUILD_DIR)\pecl-$(PHP_VERSION_STRING)$(PHP_ZTS_ARCHIVE_POSTFIX)-Win32-$(PHP_COMPILER_SHORT)-$(PHP_ARCHITECTURE).zip + -del /f /q $(BUILD_DIR)\php-test-pack-$(PHP_VERSION_STRING).zip + test: "$(BUILD_DIR)\php.exe" -d open_basedir= -d output_buffering=0 run-tests.php $(TESTS) -p "$(BUILD_DIR)\php.exe"