Menu

MozillaBuiltICC

Anonymous

If you get some ideas from my project, please quote with pcxfirefox, and this is my greatest reward. Many thanks.


This wiki page tells you some steps and tips to build Mozilla Product using Intel C/C++ Compiler.


  • Step 0 Prepare Build Environment
  • Step 1 Patch start-msvc .bat
  • Step 2 Prepare .mozconfig
  • Step 3 Modify Mozilla Makefile
  • Step 4 Build
  • Step 5 Make installer
  • Optimization Method
  • Supplement & Postscript

Step 0 Prepare Build Environment

The compiler and SDKs which I use are below.

Mozilla-build
官方链接

Visual C/C++ Compiler
Microsoft Visual Studio 2010 SP1

Windows SDK
Microsoft Windows SDK for Windows 7 and .NET Framework 4

DirectX SDK
Microsoft DirectX SDK (June 2010)

Intel C/C++ Compiler
12 update 10/13 beta update1


Step 1 Patch start-msvc.bat

The patch is similar to it below.

--- start-msvc10.bat    Wed Jan  4 01:31:23 2012
+++ start-msvc10.bat    Wed Jan  4 01:32:29 2012
@@ -83,6 +83,17 @@
     )
 )

+call "D:\Program Files (x86)\Intel\Composer XE 2013\bin\ipsxe-comp-vars.bat" ia32 vs2010
+set CC=icl
+set CXX=icl
+set CC_VERSION=13.0.0.041
+set CXX_VERSION=13.0.0.041
+set LD=xilink
+set AR=xilib -NOLOGO -OUT:"$@"
+
 cd "%USERPROFILE%"

 "%MOZILLABUILD%\msys\bin\bash" --login -i

Of cource, you can create new file called start-icc.bat analogously.

X64 build bat is similar.

Step 2 Prepare .mozconfig

Put .mozconfig on the source code tree's Top-level directory.

. $topsrcdir/browser/config/mozconfig

ac_add_options --enable-application=browser
mk_add_options MOZ_MAKE_FLAGS=-j1

mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/../obju-icc

# for 64-bit build
#ac_add_options --target=x86_64-pc-mingw32
#ac_add_options --host=x86_64-pc-mingw32

export MOZ_OPTIMIZE_LDFLAGS="-opt:ref,icf -LARGEADDRESSAWARE"
mk_add_options MOZ_OPTIMIZE_LDFLAGS="-opt:ref,icf -LARGEADDRESSAWARE"
# for 64-bit build
#export MOZ_OPTIMIZE_LDFLAGS="-MACHINE:X64 -OPT:REF,ICF"
#mk_add_options MOZ_OPTIMIZE_LDFLAGS="-MACHINE:X64 -OPT:REF,ICF"

ac_add_options --disable-auto-deps
ac_add_options --disable-tests
ac_add_options --disable-ipdl-tests
ac_add_options --enable-installer
#ac_add_options --with-branding=browser/branding/aurora
ac_add_options --enable-official-branding

ac_add_options --enable-extensions=default
ac_add_options --enable-strip
ac_add_options --enable-install-strip

# for Athlon 64/Pentium 4/
# for X86
ac_add_options --enable-optimize="-O2 -fp:precise -arch:SSE2"
# for X64
#ac_add_options --enable-optimize="-O2 -fp:precise -arch:SSE2"

# diasble updater
ac_add_options --disable-updater
ac_add_options --disable-update-channel
ac_add_options --disable-update-packaging

# diasble crashreporter
ac_add_options --disable-crashreporter

# Enable jemalloc
ac_add_options --enable-jemalloc

# enable shared js
ac_add_options --enable-shared-js

# for debug
ac_add_options --enable-debugger-info-modules=yes
ac_add_options --enable-debugger-info-modules
ac_add_options --enable-debug-symbols

ac_add_options --disable-activex
ac_add_options --disable-activex-scripting
ac_add_options --enable-crypto
ac_add_options --enable-image-decoders=icon,png,gif,jpeg,bmp

#ac_add_options --enable-chrome-format=jar
ac_add_options --disable-mochitest
ac_add_options --disable-mochitests
ac_add_options --disable-accessibility
ac_add_options --disable-parental-controls
ac_add_options --disable-windows-mobile-components
ac_add_options --disable-maintenance-service

# windows version
ac_add_options --with-windows-version=601

# crt dir
WIN32_REDIST_DIR=$VCINSTALLDIR/redist/x86/Microsoft.VC100.CRT
# for X64
#WIN32_REDIST_DIR=$VCINSTALLDIR/redist/x64/Microsoft.VC100.CRT

Step 3 Modify Mozilla Makefile

1) ICC elementary build patch

diff -ruNa mozilla-beta-vc/config/autoconf.mk.in mozilla-beta/config/autoconf.mk.in
--- mozilla-beta-vc/config/autoconf.mk.in   Thu May 24 02:56:34 2012
+++ mozilla-beta/config/autoconf.mk.in  Mon May 28 14:54:51 2012
@@ -351,8 +351,8 @@
 MOZ_EGL_XRENDER_COMPOSITE  = @MOZ_EGL_XRENDER_COMPOSITE@

 WIN_TOP_SRC    = @WIN_TOP_SRC@
-AR     = @AR@
-AR_FLAGS   = @AR_FLAGS@
+AR     = xilib
+AR_FLAGS   = -NOLOGO -OUT:"$@"
 AR_EXTRACT = @AR_EXTRACT@
 AR_LIST        = @AR_LIST@
 AR_DELETE  = @AR_DELETE@
@@ -412,8 +412,8 @@
 HOST_LDFLAGS   = @HOST_LDFLAGS@
 HOST_OPTIMIZE_FLAGS = @HOST_OPTIMIZE_FLAGS@
 HOST_NSPR_MDCPUCFG = @HOST_NSPR_MDCPUCFG@
-HOST_AR        = @HOST_AR@
-HOST_AR_FLAGS  = @HOST_AR_FLAGS@
+HOST_AR        = xilib
+HOST_AR_FLAGS  = -NOLOGO -OUT:"$@"
 HOST_LD        = @HOST_LD@
 HOST_RANLIB    = @HOST_RANLIB@
 HOST_BIN_SUFFIX    = @HOST_BIN_SUFFIX@
diff -ruNa mozilla-beta-vc/configure mozilla-beta/configure
--- mozilla-beta-vc/configure   Thu May 24 02:57:50 2012
+++ mozilla-beta/configure  Thu May 31 02:47:58 2012
@@ -34,6 +34,10 @@
   msyshost=1
 fi

+export CC=icl
+export CXX=icl
+export AR='xilib -NOLOGO -OUT:"$@"'
+export LD=xilink

 # Read the user's .mozconfig script.  We can't do this in
 # configure.in: autoconf puts the argument parsing code above anything
@@ -3628,8 +3632,8 @@
 #define _CRT_NONSTDC_NO_WARNINGS 1
 EOF

-        elif test "$_CC_MAJOR_VERSION" = "17"; then
-            _CC_SUITE=11
+        elif test "$_CC_MAJOR_VERSION" = "13"; then
+            _CC_SUITE=10
             cat >> confdefs.h <<\EOF
 #define _CRT_SECURE_NO_WARNINGS 1
 EOF
@@ -7455,7 +7459,7 @@
     fi
     HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11 -D_CRT_SECURE_NO_WARNINGS"
     HOST_NSPR_MDCPUCFG='\"md/_winnt.cfg\"'
-    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
+    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
     HOST_BIN_SUFFIX=.exe
     case "$host" in
     *mingw*)
diff -ruNa mozilla-beta-vc/js/src/config/autoconf.mk.in mozilla-beta/js/src/config/autoconf.mk.in
--- mozilla-beta-vc/js/src/config/autoconf.mk.in    Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/config/autoconf.mk.in   Mon May 28 15:04:19 2012
@@ -157,8 +157,8 @@
 PROFILE_USE_LDFLAGS = @PROFILE_USE_LDFLAGS@

 WIN_TOP_SRC    = @WIN_TOP_SRC@
-AR     = @AR@
-AR_FLAGS   = @AR_FLAGS@
+AR     = xilib
+AR_FLAGS   = -NOLOGO -OUT:"$@"
 AR_EXTRACT = @AR_EXTRACT@
 AR_LIST        = @AR_LIST@
 AR_DELETE  = @AR_DELETE@
@@ -211,8 +211,8 @@
 HOST_LDFLAGS   = @HOST_LDFLAGS@
 HOST_OPTIMIZE_FLAGS = @HOST_OPTIMIZE_FLAGS@
 HOST_NSPR_MDCPUCFG = @HOST_NSPR_MDCPUCFG@
-HOST_AR        = @HOST_AR@
-HOST_AR_FLAGS  = @HOST_AR_FLAGS@
+HOST_AR        = xilib
+HOST_AR_FLAGS  = -NOLOGO -OUT:"$@"
 HOST_LD        = @HOST_LD@
 HOST_RANLIB    = @HOST_RANLIB@
 HOST_BIN_SUFFIX    = @HOST_BIN_SUFFIX@
diff -ruNa mozilla-beta-vc/js/src/configure mozilla-beta/js/src/configure
--- mozilla-beta-vc/js/src/configure    Thu May 24 02:57:50 2012
+++ mozilla-beta/js/src/configure   Thu May 31 02:48:17 2012
@@ -34,6 +34,11 @@
   msyshost=1
 fi

+export CC=icl
+export CXX=icl
+export AR='xilib -NOLOGO -OUT:"$@"'
+export LD=xilink
+
 # Guess values for system-dependent variables and create Makefiles.
 # Generated automatically using autoconf version 2.13 
 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
@@ -3317,8 +3322,8 @@
 #define _CRT_NONSTDC_NO_WARNINGS 1
 EOF

-        elif test "$_CC_MAJOR_VERSION" = "17"; then
-            _CC_SUITE=11
+        elif test "$_CC_MAJOR_VERSION" = "13"; then
+            _CC_SUITE=10
             cat >> confdefs.h <<\EOF
 #define _CRT_SECURE_NO_WARNINGS 1
 EOF
@@ -6692,7 +6697,7 @@
     fi
     HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11 -D_CRT_SECURE_NO_WARNINGS"
     HOST_NSPR_MDCPUCFG='\"md/_winnt.cfg\"'
-    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
+    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
     HOST_BIN_SUFFIX=.exe
     case "$host" in
     *mingw*)
diff -ruNa mozilla-beta-vc/js/src/ctypes/libffi/Makefile.in mozilla-beta/js/src/ctypes/libffi/Makefile.in
--- mozilla-beta-vc/js/src/ctypes/libffi/Makefile.in    Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/ctypes/libffi/Makefile.in   Mon May 28 15:06:32 2012
@@ -66,7 +66,7 @@
 # MSVC, it can link against the debug CRT.
 @FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG
 # Build opt.
-@FFI_DEBUG_FALSE@am__append_28 = -O2
+@FFI_DEBUG_FALSE@am__append_28 = -O3
 subdir = .
 DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
    $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \
diff -ruNa mozilla-beta-vc/js/src/ctypes/libffi/aclocal.m4 mozilla-beta/js/src/ctypes/libffi/aclocal.m4
--- mozilla-beta-vc/js/src/ctypes/libffi/aclocal.m4 Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/ctypes/libffi/aclocal.m4    Mon May 28 16:50:43 2012
@@ -4707,7 +4707,7 @@
       # The linker will automatically build a .lib file if we build a DLL.
       _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
       # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(old_archive_cmds, $1)='xilib -OUT:$oldlib$oldobjs$old_deplibs'
       _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       ;;
diff -ruNa mozilla-beta-vc/js/src/ctypes/libffi/configure mozilla-beta/js/src/ctypes/libffi/configure
--- mozilla-beta-vc/js/src/ctypes/libffi/configure  Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/ctypes/libffi/configure Mon May 28 16:50:10 2012
@@ -17,6 +17,12 @@
 ## -------------------- ##

 # Be more Bourne compatible
+
+export CC=icl
+export CXX=icl
+export AR='xilib -NOLOGO -OUT:"$@"'
+export LD=xilink
+
 DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
@@ -8908,7 +8914,7 @@
       # The linker will automatically build a .lib file if we build a DLL.
       old_archive_from_new_cmds='true'
       # FIXME: Should let the user specify the lib program.
-      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      old_archive_cmds='xilib -OUT:$oldlib$oldobjs$old_deplibs'
       fix_srcfile_path=''
       enable_shared_with_static_runtimes=yes
       ;;
diff -ruNa mozilla-beta-vc/js/src/ctypes/libffi/m4/libtool.m4 mozilla-beta/js/src/ctypes/libffi/m4/libtool.m4
--- mozilla-beta-vc/js/src/ctypes/libffi/m4/libtool.m4  Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/ctypes/libffi/m4/libtool.m4 Mon May 28 16:50:28 2012
@@ -4692,7 +4692,7 @@
       # The linker will automatically build a .lib file if we build a DLL.
       _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
       # FIXME: Should let the user specify the lib program.
-      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+      _LT_TAGVAR(old_archive_cmds, $1)='xilib -OUT:$oldlib$oldobjs$old_deplibs'
       _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       ;;
diff -ruNa mozilla-beta-vc/js/src/ctypes/libffi/msvcc.sh mozilla-beta/js/src/ctypes/libffi/msvcc.sh
--- mozilla-beta-vc/js/src/ctypes/libffi/msvcc.sh   Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/ctypes/libffi/msvcc.sh  Mon May 28 15:07:43 2012
@@ -44,7 +44,7 @@

 args="-nologo -W3"
 md=-MD
-cl="cl"
+cl="icl"
 ml="ml"
 safeseh="-safeseh"
 output=
@@ -62,7 +62,7 @@
       shift 1
     ;;
     -m64)
-      cl="cl"   # "$MSVC/x86_amd64/cl"
+      cl="icl"   # "$MSVC/x86_amd64/cl"
       ml="ml64" # "$MSVC/x86_amd64/ml64"
       safeseh=
       shift 1
diff -ruNa mozilla-beta-vc/nsprpub/config/autoconf.mk.in mozilla-beta/nsprpub/config/autoconf.mk.in
--- mozilla-beta-vc/nsprpub/config/autoconf.mk.in   Thu May 24 02:57:04 2012
+++ mozilla-beta/nsprpub/config/autoconf.mk.in  Mon May 28 16:34:49 2012
@@ -56,14 +56,14 @@

 AS     = @AS@
 ASFLAGS        = @ASFLAGS@
-CC     = @CC@
-CCC        = @CXX@
+CC     = icl
+CCC        = icl
 NS_USE_GCC = @GNU_CC@
 GCC_USE_GNU_LD = @GCC_USE_GNU_LD@
 MSC_VER        = @MSC_VER@
-AR     = @AR@
+AR     = xilib -NOLOGO -OUT:"$@"
 AR_FLAGS   = @AR_FLAGS@
-LD     = @LD@
+LD     = xilink
 RANLIB     = @RANLIB@
 PERL       = @PERL@
 RC     = @RC@
diff -ruNa mozilla-beta-vc/nsprpub/configure mozilla-beta/nsprpub/configure
--- mozilla-beta-vc/nsprpub/configure   Thu May 24 02:57:04 2012
+++ mozilla-beta/nsprpub/configure  Mon May 28 15:11:16 2012
@@ -7,6 +7,11 @@
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.

+export CC=icl
+export CXX=icl
+export AR='xilib -NOLOGO -OUT:"$@"'
+export LD=xilink
+
 # Defaults:
 ac_help=
 ac_default_prefix=/usr/local
diff -ruNa mozilla-beta-vc/nsprpub/pr/src/misc/Makefile.in mozilla-beta/nsprpub/pr/src/misc/Makefile.in
--- mozilla-beta-vc/nsprpub/pr/src/misc/Makefile.in Thu May 24 02:57:04 2012
+++ mozilla-beta/nsprpub/pr/src/misc/Makefile.in    Mon May 28 15:12:06 2012
@@ -109,4 +109,5 @@

 export:: $(TARGETS)

-
+CFLAGS   += -fp:precise -Qfast_transcendentals
+CXXFLAGS += -fp:precise -Qfast_transcendentals
+
+$(OBJDIR)/prdtoa.$(OBJ_SUFFIX): prdtoa.c
+   @$(MAKE_OBJDIR)
+   $(CC) -Fo$@ -c $(CFLAGS:MD=MT) $(call pr_abspath,$<)
diff -ruNa mozilla-beta-vc/security/coreconf/WIN32.mk mozilla-beta/security/coreconf/WIN32.mk
--- mozilla-beta-vc/security/coreconf/WIN32.mk  Thu May 24 02:57:04 2012
+++ mozilla-beta/security/coreconf/WIN32.mk Mon May 28 16:36:21 2012
@@ -40,7 +40,7 @@
 # and Windows 95
 #

-DEFAULT_COMPILER = cl
+DEFAULT_COMPILER = icl

 ifdef NS_USE_GCC
    CC           = gcc
@@ -53,10 +53,10 @@
    RC           = windres.exe -O coff --use-temp-file
    LINK_DLL      = $(CC) $(OS_DLLFLAGS) $(DLLFLAGS)
 else
-   CC           = cl
-   CCC          = cl
-   LINK         = link
-   AR           = lib
+   CC           = icl
+   CCC          = icl
+   LINK         = xilink
+   AR           = xilib
    AR          += -NOLOGO -OUT:"$@"
    RANLIB       = echo
    BSDECHO      = echo
@@ -157,9 +157,9 @@
     ifdef BUILD_OPT
    OS_CFLAGS  += -MD
    ifeq (11,$(ALLOW_OPT_CODE_SIZE)$(OPT_CODE_SIZE))
-       OPTIMIZER += -O1
+       OPTIMIZER += -O2
    else
-       OPTIMIZER += -O2
+       OPTIMIZER += -O2
    endif
    DEFINES    += -UDEBUG -U_DEBUG -DNDEBUG
    DLLFLAGS   += -OUT:"$@"
diff -ruNa mozilla-beta-vc/security/nss/lib/freebl/Makefile mozilla-beta/security/nss/lib/freebl/Makefile
--- mozilla-beta-vc/security/nss/lib/freebl/Makefile    Thu May 24 02:57:04 2012
+++ mozilla-beta/security/nss/lib/freebl/Makefile   Mon May 28 15:17:12 2012
@@ -167,13 +167,13 @@
     DEFINES += -DMP_ASSEMBLY_MULTIPLY -DMP_ASSEMBLY_SQUARE 
     DEFINES += -DMP_ASSEMBLY_DIV_2DX1D -DMP_USE_UINT_DIGIT -DMP_NO_MP_WORD
     ifdef BUILD_OPT
-   OPTIMIZER += -Ox  # maximum optimization for freebl
+   OPTIMIZER += -O2  # maximum optimization for freebl
     endif
 endif
 else
     # -DMP_NO_MP_WORD
     ifdef BUILD_OPT
-   OPTIMIZER += -Ox  # maximum optimization for freebl
+   OPTIMIZER += -O2  # maximum optimization for freebl
     endif
     ASFILES  = arcfour-amd64-masm.asm mpi_amd64_masm.asm mp_comba_amd64_masm.asm
     DEFINES += -DNSS_BEVAND_ARCFOUR -DMPI_AMD64 -DMP_ASSEMBLY_MULTIPLY
diff -ruNa mozilla-beta-vc/xpcom/reflect/xptcall/src/md/win32/Makefile.in mozilla-beta/xpcom/reflect/xptcall/src/md/win32/Makefile.in
--- mozilla-beta-vc/xpcom/reflect/xptcall/src/md/win32/Makefile.in  Thu May 24 02:57:12 2012
+++ mozilla-beta/xpcom/reflect/xptcall/src/md/win32/Makefile.in Mon May 28 15:20:12 2012
@@ -56,7 +56,7 @@

 ifndef GNU_CXX
 # FIXME: bug 413019
-OS_COMPILE_CXXFLAGS += -GL-
+OS_COMPILE_CXXFLAGS += 
 CPPSRCS         := xptcinvoke.cpp xptcstubs.cpp
 else  #!GNU_CXX
 CPPSRCS         := xptcinvoke_x86_gnu.cpp xptcstubs.cpp

2) fp:fast bug workaround patch

Intel Compiler uses -fp:fast by default, if you don't use -fp:precise, then must use the similar patches below:

diff -ruNa mozilla-beta-vc/content/Makefile.in mozilla-beta/content/Makefile.in
--- mozilla-beta-vc/content/Makefile.in Thu May 24 02:56:34 2012
+++ mozilla-beta/content/Makefile.in    Mon May 28 15:00:25 2012
@@ -67,3 +67,6 @@
 endif # WINNT

 include $(topsrcdir)/config/rules.mk
+
+CFLAGS   += -fp:precise
+CXXFLAGS += -fp:precise
diff -ruNa mozilla-beta-vc/ipc/app/Makefile.in mozilla-beta/ipc/app/Makefile.in
--- mozilla-beta-vc/ipc/app/Makefile.in Thu May 24 02:56:46 2012
+++ mozilla-beta/ipc/app/Makefile.in    Mon May 28 15:02:26 2012
@@ -130,3 +130,6 @@
    $(NSINSTALL) $(PROGRAM) $(DIST)/bin/$(PROGRAM).app/Contents/MacOS
    rm -f $(DIST)/bin/$(PROGRAM)
 endif
+
+CFLAGS   += -fp:precise
+CXXFLAGS += -fp:precise
diff -ruNa mozilla-beta-vc/js/src/Makefile.in mozilla-beta/js/src/Makefile.in
--- mozilla-beta-vc/js/src/Makefile.in  Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/Makefile.in Mon May 28 15:03:00 2012
@@ -919,3 +919,5 @@
 # END kludges for the Nitro assembler
 ###############################################

+CFLAGS   += -fp:precise
+CXXFLAGS += -fp:precise
diff -ruNa mozilla-beta-vc/memory/jemalloc/Makefile.in mozilla-beta/memory/jemalloc/Makefile.in
--- mozilla-beta-vc/memory/jemalloc/Makefile.in Thu May 24 02:56:58 2012
+++ mozilla-beta/memory/jemalloc/Makefile.in    Mon May 28 15:27:45 2012
@@ -67,3 +67,6 @@
 endif

 include $(topsrcdir)/config/rules.mk
+
+CFLAGS   += -fp:precise
+CXXFLAGS += -fp:precise
diff -ruNa mozilla-beta-vc/nsprpub/pr/src/misc/Makefile.in mozilla-beta/nsprpub/pr/src/misc/Makefile.in
--- mozilla-beta-vc/nsprpub/pr/src/misc/Makefile.in Thu May 24 02:57:04 2012
+++ mozilla-beta/nsprpub/pr/src/misc/Makefile.in    Mon May 28 15:12:06 2012
@@ -109,4 +109,5 @@

 export:: $(TARGETS)

-
+CFLAGS   += -fp:precise
+CXXFLAGS += -fp:precise
diff -ruNa mozilla-beta-vc/security/nss/lib/sqlite/Makefile mozilla-beta/security/nss/lib/sqlite/Makefile
--- mozilla-beta-vc/security/nss/lib/sqlite/Makefile    Thu May 24 02:57:06 2012
+++ mozilla-beta/security/nss/lib/sqlite/Makefile   Mon May 28 15:19:05 2012
@@ -78,3 +78,5 @@

 export:: private_export

+CFLAGS   += -fp:precise
+CXXFLAGS += -fp:precise

3) Some crash bug workaround

If you use ICC 13 beta update1, then apply the similar patches below:

Solve ICC IPO bug.

diff -ruNa mozilla-beta-vc/js/src/Makefile.in mozilla-beta/js/src/Makefile.in
--- mozilla-beta-vc/js/src/Makefile.in  Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/Makefile.in Mon May 28 15:03:00 2012
@@ -919,3 +919,5 @@
 # END kludges for the Nitro assembler
 ###############################################

+
+MethodJIT.$(OBJ_SUFFIX): MethodJIT.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS) -Qipo- $(_VPATH_SRCS)

Solve WebGL modules crash, overide some source code building using VC, because icc is normal only using -Od here.

diff -ruNa mozilla-beta-vc/gfx/angle/Makefile.in mozilla-beta/gfx/angle/Makefile.in
--- mozilla-beta-vc/gfx/angle/Makefile.in Thu May 24 02:56:42 2012
+++ mozilla-beta/gfx/angle/Makefile.in    Thu May 31 02:50:58 2012
@@ -153,3 +153,13 @@
 # upstream at some point.
 CXXFLAGS := $(filter-out -pedantic,$(CXXFLAGS))
 CFLAGS := $(filter-out -pedantic,$(CFLAGS))
+
+intermOut.$(OBJ_SUFFIX): intermOut.cpp $(GLOBAL_DEPS)
+ $(REPORT_BUILD)
+ @$(MAKE_DEPS_AUTO_CXX)
+ $(ELOG) $(CCC:icl=cl) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O3=O2) $(COMPILE_CXXFLAGS:arch:SSE3=arch:SSE2) $(_VPATH_SRCS)
+
+Initialize.$(OBJ_SUFFIX): Initialize.cpp $(GLOBAL_DEPS)
+ $(REPORT_BUILD)
+ @$(MAKE_DEPS_AUTO_CXX)
+ $(ELOG) $(CCC:icl=cl) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O3=O2) $(COMPILE_CXXFLAGS:arch:SSE3=arch:SSE2) $(_VPATH_SRCS)
diff -ruNa mozilla-beta-vc/gfx/angle/src/libEGL/Makefile.in mozilla-beta/gfx/angle/src/libEGL/Makefile.in
--- mozilla-beta-vc/gfx/angle/src/libEGL/Makefile.in  Thu May 24 02:56:44 2012
+++ mozilla-beta/gfx/angle/src/libEGL/Makefile.in Thu May 31 02:51:23 2012
@@ -161,3 +161,13 @@
         /delayload:dwmapi.dll

 EXTRA_DSO_LDOPTS += $(MOZALLOC_LIB)
+
+intermOut.$(OBJ_SUFFIX): intermOut.cpp $(GLOBAL_DEPS)
+ $(REPORT_BUILD)
+ @$(MAKE_DEPS_AUTO_CXX)
+ $(ELOG) $(CCC:icl=cl) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O3=O2) $(COMPILE_CXXFLAGS:arch:SSE3=arch:SSE2) $(_VPATH_SRCS)
+
+Initialize.$(OBJ_SUFFIX): Initialize.cpp $(GLOBAL_DEPS)
+ $(REPORT_BUILD)
+ @$(MAKE_DEPS_AUTO_CXX)
+ $(ELOG) $(CCC:icl=cl) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O3=O2) $(COMPILE_CXXFLAGS:arch:SSE3=arch:SSE2) $(_VPATH_SRCS)
diff -ruNa mozilla-beta-vc/gfx/angle/src/libGLESv2/Makefile.in mozilla-beta/gfx/angle/src/libGLESv2/Makefile.in
--- mozilla-beta-vc/gfx/angle/src/libGLESv2/Makefile.in   Thu May 24 02:56:44 2012
+++ mozilla-beta/gfx/angle/src/libGLESv2/Makefile.in  Thu May 31 02:51:55 2012
@@ -170,3 +170,13 @@
         "$(MOZ_DIRECTX_SDK_PATH)/lib/$(MOZ_DIRECTX_SDK_CPU_SUFFIX)/D3DCompiler.lib"

 EXTRA_DSO_LDOPTS += $(MOZALLOC_LIB)
+
+intermOut.$(OBJ_SUFFIX): intermOut.cpp $(GLOBAL_DEPS)
+ $(REPORT_BUILD)
+ @$(MAKE_DEPS_AUTO_CXX)
+ $(ELOG) $(CCC:icl=cl) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O3=O2) $(COMPILE_CXXFLAGS:arch:SSE3=arch:SSE2) $(_VPATH_SRCS)
+
+Initialize.$(OBJ_SUFFIX): Initialize.cpp $(GLOBAL_DEPS)
+ $(REPORT_BUILD)
+ @$(MAKE_DEPS_AUTO_CXX)
+ $(ELOG) $(CCC:icl=cl) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O3=O2) $(COMPILE_CXXFLAGS:arch:SSE3=arch:SSE2) $(_VPATH_SRCS)

If you use ICC 12 update 10, then muse use the similar patch (13 has fixed it) :

diff -ruNa mozilla-release/netwerk/base/src/Makefile.in mozilla-new/netwerk/base/src/Makefile.in
--- mozilla-release/netwerk/base/src/Makefile.in    Tue Mar 13 09:37:10 2012
+++ mozilla-new/netwerk/base/src/Makefile.in    Tue Mar 27 13:15:52 2012
@@ -150,3 +150,8 @@
 ifdef MOZ_ENABLE_LIBCONIC
    OS_INCLUDES += $(GLIB_CFLAGS) $(LIBCONIC_CFLAGS)
 endif
+
+nsURLHelper.$(OBJ_SUFFIX): nsURLHelper.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:O2=O1) $(COMPILE_CXXFLAGS:O3=O1) -O1 $(_VPATH_SRCS)

4) GUI bug

There are two forms of the bug:

  • Click Option - Click OK - Close Firefox - Open Firefox - Empty GUI framework
  • startupCache issue - Empty GUI framework. see the link

nsBinaryStream.cpp will cause wrong code when using -Qax switch

diff -ruNa mozilla-beta-vc/xpcom/io/Makefile.in mozilla-beta/xpcom/io/Makefile.in
--- mozilla-beta-vc/xpcom/io/Makefile.in    Thu May 24 02:57:10 2012
+++ mozilla-beta/xpcom/io/Makefile.in   Fri Jun  1 01:05:42 2012
@@ -205,3 +205,7 @@
 CXXFLAGS        += $(MOZ_PLATFORM_MAEMO_CFLAGS) $(MOZ_QT_CFLAGS)
 endif

+nsBinaryStream.$(OBJ_SUFFIX): nsBinaryStream.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:QaxSSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,CORE-AVX2,CORE-AVX-I=) $(_VPATH_SRCS)

5) Improve compatibility (Optional)

Mozilla use -MD to build code by default, which will link the dynamic Intel LibMath, which can reduce some memory, this may cause some extensions not to work.

So if you wan to static link Intel LibMath, you can use the similar patch:

diff -ruNa mozilla-beta-vc/js/src/Makefile.in mozilla-beta/js/src/Makefile.in
--- mozilla-beta-vc/js/src/Makefile.in  Thu May 24 02:56:46 2012
+++ mozilla-beta/js/src/Makefile.in Mon May 28 15:03:00 2012
@@ -919,3 +919,5 @@
 # END kludges for the Nitro assembler
 ###############################################

+
+jsdtoa.$(OBJ_SUFFIX): jsdtoa.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS:MD=MT) $(_VPATH_SRCS)
diff -ruNa mozilla-beta-vc/nsprpub/config/autoconf.mk.in mozilla-beta/nsprpub/config/autoconf.mk.in
--- mozilla-beta-vc/nsprpub/config/autoconf.mk.in   Thu May 24 02:57:04 2012
+++ mozilla-beta/nsprpub/config/autoconf.mk.in  Mon May 28 16:34:49 2012
@@ -81,7 +81,7 @@
 OS_LIBS         = @OS_LIBS@
 OS_LDFLAGS = @LDFLAGS@
 OS_DLLFLAGS    = @OS_DLLFLAGS@
-DLLFLAGS   = @DLLFLAGS@
+DLLFLAGS   = @DLLFLAGS@ -opt:ref,icf -LARGEADDRESSAWARE -NODEFAULTLIB:svml_dispmd -NODEFAULTLIB:libcmt -NODEFAULTLIB:libmmd svml_dispmt.lib libmmt.lib
 EXEFLAGS  = @EXEFLAGS@
 OPTIMIZER  = @OPTIMIZER@
diff -ruNa mozilla-beta-vc/nsprpub/pr/src/misc/Makefile.in mozilla-beta/nsprpub/pr/src/misc/Makefile.in
--- mozilla-beta-vc/nsprpub/pr/src/misc/Makefile.in Thu May 24 02:57:04 2012
+++ mozilla-beta/nsprpub/pr/src/misc/Makefile.in    Mon May 28 15:12:06 2012
@@ -109,4 +109,5 @@

 export:: $(TARGETS)

+
+$(OBJDIR)/prdtoa.$(OBJ_SUFFIX): prdtoa.c
+   @$(MAKE_OBJDIR)
+   $(CC) -Fo$@ -c $(CFLAGS:MD=MT) $(call pr_abspath,$<)
diff -ruNa mozilla-beta-vc/security/coreconf/WIN32.mk mozilla-beta/security/coreconf/WIN32.mk
--- mozilla-beta-vc/security/coreconf/WIN32.mk  Thu May 24 02:57:04 2012
+++ mozilla-beta/security/coreconf/WIN32.mk Mon May 28 16:36:21 2012
@@ -388,3 +388,4 @@
 # 4553: '==' : operator has no effect; did you intend '='?
 # 4551: function call missing argument list

+LDFLAGS    += -opt:ref,icf -LARGEADDRESSAWARE -NODEFAULTLIB:svml_dispmd -NODEFAULTLIB:libmmd -NODEFAULTLIB:libcmt svml_dispmt.lib libmmt.lib

At the same time, modify .mozconfig related sections

export MOZ_OPTIMIZE_LDFLAGS="-opt:ref,icf -LARGEADDRESSAWARE -NODEFAULTLIB:svml_dispmd -NODEFAULTLIB:libmmd -NODEFAULTLIB:libcmt svml_dispmt.lib libmmt.lib"
mk_add_options MOZ_OPTIMIZE_LDFLAGS="-opt:ref,icf -LARGEADDRESSAWARE -NODEFAULTLIB:svml_dispmd -NODEFAULTLIB:libmmd -NODEFAULTLIB:libcmt svml_dispmt.lib libmmt.lib"

Step 4 Build

Assume you put the source code to e:\mozilla\mozilla-release .

Open mozilla msys bash

cd /e/mozilla/mozilla-release
make -f client.mk build

Step 5 Make installer

cd /e/mozilla/obju-icc
make installer

Then the installer will be in e:/mozilla/obju-vc/dist/install/sea .


Optimization Method

The methods involved below can be used at the same time.

1 Build BetterPGO

1) PGO bug workaround

Intel Compiler has some PGO bugs, may cause some crashes or abnormal phenomena, you can refer to the patches below:

diff -ruNa mozilla-release/js/src/Makefile.in mozilla-new/js/src/Makefile.in
--- mozilla-release/js/src/Makefile.in  Tue Mar 13 09:36:54 2012
+++ mozilla-new/js/src/Makefile.in  Tue Mar 27 13:19:43 2012
@@ -951,6 +951,24 @@
    $(CXX) -o TestMain$(HOST_BIN_SUFFIX) $(TESTMAIN_OBJS)
 endif

+
+jsinterp.$(OBJ_SUFFIX): jsinterp.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS) -Qprof-gen- -Qprof-use- $(_VPATH_SRCS)
+
+BytecodeEmitter.$(OBJ_SUFFIX): BytecodeEmitter.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS) -Qprof-gen- -Qprof-use- $(_VPATH_SRCS)
+
 #
 # END kludges for the Nitro assembler
 ###############################################
diff -ruNa mozilla-release/xpcom/reflect/xptcall/src/md/win32/Makefile.in mozilla-new/xpcom/reflect/xptcall/src/md/win32/Makefile.in
--- mozilla-release/xpcom/reflect/xptcall/src/md/win32/Makefile.in  Tue Mar 13 09:36:54 2012
+++ mozilla-new/xpcom/reflect/xptcall/src/md/win32/Makefile.in  Tue Mar 27 13:19:43 2012
@@ -951,6 +951,24 @@
DEFINES     += -DEXPORT_XPTC_API -D_IMPL_NS_COM

LOCAL_INCLUDES  += -I$(srcdir)/../..

+
+xptcstubs.$(OBJ_SUFFIX): xptcstubs.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS) -Qprof-gen- -Qprof-use- $(_VPATH_SRCS)

+xptcstubs_x86_64.$(OBJ_SUFFIX): xptcstubs_x86_64.cpp $(GLOBAL_DEPS)
+   $(REPORT_BUILD)
+   @$(MAKE_DEPS_AUTO_CXX)
+   $(ELOG) $(CCC) $(OUTOPTION)$@ -c $(COMPILE_CXXFLAGS) -Qprof-gen- -Qprof-use- $(_VPATH_SRCS)
+
 #
 # END kludges for the Nitro assembler
 ###############################################

2) Build pgo-gen

Modify .mozconfig section

ac_add_options --enable-optimize="-O2 -fp:precise -Qprof-gen -Qprof-dire:/mozilla/iccpgo"

make -f client.mk build

3) Generate PGO information

You can enter into <obj>/dist/bin, run firefox.exe and some PGO tests, close it.

4) Build pgo-use

Modify .mozconfig related section

ac_add_options --enable-optimize="-O2 -fp:precise -Qprof-use -Qprof-dire:/mozilla/iccpgo"

make -f client.mk build

2 Some Intel C/C++ Compiler options

-fp:precise

Improve the float caculation precision, if you don't want to use the patches above when using -fp:fast, you can use the switch.

-arch:SSE2 or -arch:SSE3

In general, all new cpu support SSE2, most support SSE3 ( especially Intel CPU).

-Qipo

Great switch, but make build process time very very long, and build process will need very much more memory. You can use -Qipo128 or -Qipo256 to improve the memory issue when linking.

-QaxSSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,CORE-AVX2,CORE-AVX-I

Invalid for AMD CPU, but may improve some performance on Intel CPU.

Note

If you use -Qax and -arch at a time, make sure put -arch after -Qax.

-O3

If you feel -O3 not safe, you can use -O2 -Qftz .

Some other switches


Supplement & Postscript

2012.6.5 security module can't be built using -O3 and -Qipo, which all cause crash.


Related

Wiki: Guide
Wiki: GuideExplained

Discussion

  • Anonymous

    Anonymous - 2012-08-14

    Originally posted by: ilikethi...@gmail.com

    Good job!

     

    Last edit: Anonymous 2015-03-12
  • Anonymous

    Anonymous - 2012-09-15

    Originally posted by: xunxun1...@gmail.com

    Mail from Alex on 20120910

    Hi xunxun, Here are some more bugs I have found while compiling with ICC that you can add to your wiki:

    CheckedInt?.h bug – fixed, will most likely be introduced into a much later version of FF (Intel has also been made aware of it and they said they’ve submitted it to their developers).

    Compiling with jemalloc results in crashing WebGL module, to which your patch has to be used. Using standard malloc does not cause this.

    In Firefox 15.0 & 15.0.1 the GUI bug has returned but in a different form but can be solved by your previous patch.

    Using the fix for the GUI bug results in not being able to use pymake to compile.

    -Alex/Waterfox

     

    Last edit: Anonymous 2015-04-28

Log in to post a comment.