pcxFirefox 50.1.0 is Released

Follow official edition changes
Download pcxFirefox

Build changes:
Update SDK to 14393

Feature changes:
ProcessPriority Feature can work on plugin-container

Fixed issues additionally:
1) Avoid crashes caused by Baidu IME ( may cause Baidu IME not work )
2) Bug 1309707 – Distrust new certs chaining up to current WoSign/StartCom roots
3) Bug 1279699 – Crash in OOM | large | mozalloc_abort | mozalloc_handle_oom | moz_xmalloc | std::_Allocate | std::basic_stringbuf::overflow
4) Bug 1143644 – Allow IDEOGRAPHIC SPACE in UnEscapeURIForUI
5) Bug 1279354 – Null deref crash in nsProgressFrame::ReflowBarFrame

-fp:fast study continued

MSVC x64 toolchain’s -fp:fast, which can cause LTCG:pgi build running behavior more different with normal, is more sensitive than x86. So, we should test the x64 build as a prototype. (No PGO build and LTCG:pgi build should all pass the UNIT tests?)
According to https://pcxfirefox.wordpress.com/2016/10/16/a-questionable-but-faster-msvc-compiler-switch, we can use some pragma code section to avoid -fp:fast bugs, but this is very difficult checking in Mozilla Unified build. So, we should use FILES_PER_UNIFIED_FILE = 1 and change UNIFIED_SOURCES to SOURCES in order to find the code section.

There will be no 50.0 released

Because there will certainly be a 50.0.1.

In this period, I change my build machine to i7 6700/1060/SSD, so I must modify my all auto build scripts and update scripts. Maybe I update 50.0 edition, but this is only for testing whether my scripts are OK. I won’t guarantee the edition is stable.

A questionable but faster MSVC compiler switch


The related article :
1) https://blogs.msdn.microsoft.com/vcblog/2015/10/19/do-you-prefer-fast-or-precise/
2) https://blogs.msdn.microsoft.com/vcblog/2016/05/04/new-code-optimizer/

MSVC2012+ will generate more faster code using -fp:fast, especially on some intrinsic functions and Auto-Vectorization (/arch:SSE2, /arch:AVX?), but maybe this will produce wrong results because of reducing the accuracy.
So if we want to use the compiler switch, you should add some code to avoid the precision decrease.

#ifdef _MSC_VER
#pragma float_control(precise, on, push)

// Your higher precision code

#ifdef _MSC_VER
#pragma float_control(pop)

The code section will overwrite /fp:fast to /fp:precise, and very useful to apply for Mozilla code, because Mozilla use unified build to make the projects, it’s more trouble to change it in one source file.

Take Mozilla code for example, we can use -fp:fast on GFX code, and take the patch below.

diff --git a/gfx/2d/BasePoint4D.h b/gfx/2d/BasePoint4D.h
--- a/gfx/2d/BasePoint4D.h
+++ b/gfx/2d/BasePoint4D.h
@@ -6,16 +6,20 @@

#include "mozilla/Assertions.h"

namespace mozilla {
namespace gfx {

+#ifdef _MSC_VER
+#pragma float_control(precise, on, push)
* Do not use this class directly. Subclass it, pass that subclass as the
* Sub parameter, and only use that subclass. This allows methods to safely
* cast 'this' to 'Sub*'.
struct BasePoint4D {
union {
@@ -120,12 +124,16 @@ struct BasePoint4D {

void Normalize() {
*this /= Length();

bool HasPositiveWCoord() { return w; }

+#ifdef _MSC_VER
+#pragma float_control(pop)
} // namespace gfx
} // namespace mozilla


And in the same time, we also can use the code section below to overwrite /fp:precise to /fp:fast

#ifdef _MSC_VER
#pragma float_control(precise, off, push)

// Your lower precision code

#ifdef _MSC_VER
#pragma float_control(pop)