[Interest] building Qt 4.8.7 with gcc 5 and link-time optimisation on Linux

Thiago Macieira thiago.macieira at intel.com
Thu Jul 23 20:05:26 CEST 2015

On Thursday 23 July 2015 11:01:58 René J.V. Bertin wrote:
> Thiago Macieira wrote:
> > That's qhash.cpp (the only place where we use _mm_crc32_xxx()).
> > 
> > This sounds like qhash.cpp was compiled with -march=native but *linked*
> > without. Can you confirm that you see the compiler options passed on the
> > linker command-line (-O2 -march=native, etc.)?
> Well, even if you were right, something else appears to be going on.
> Wouldn't it be simply the same issue that makes it impossible to build
> QtScript and QtWebkit with LTO, the use of inline assembly? 

No, because that's a different solution. There's no inline assembly in 
qhash.cpp, only a call to the _mm_crc32_xxx intrinsics. And even if there were 
assembly, it would differ in nature to what ctiVMTrampoline does.

> That's very likely what the _mm_ intrinsics macros contain. 

a) they're not macros, they're functions
b) they're intrinsics, not assembly.

extern __inline unsigned int __attribute__((__gnu_inline__, __always_inline__, 
_mm_crc32_u32 (unsigned int __C, unsigned int __V)
  return __builtin_ia32_crc32si (__C, __V);

The function __builtin_ia32_crc32si is not defined anywhere. The compiler 
interprets it and replaces it with the proper assembly.

> OTOH, if you use them for
> SSE <4 too that cannot be the whole explanation.

The use is runtime-checked:

   if (hasFastCrc32())
        return crc32(p, size_t(len), h);

Note that runtime detection is only supported with MSVC, ICC and GCC 4.9. 
Older versions of GCC or other compilers will make a decision at compile time: 
always use CRC32 or never use CRC32.

I have a patch to enable the runtime detection for Clang 3.7, but I haven't 
done enough testing yet.

> /usr/bin/clang++ -c -O3 -march=native -g -ffunction-sections
> :-fPIC -isysroot
> :/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Devel
> :oper/SDKs/MacOSX10.10.sdk -std=c++11 -stdlib=libc++
> :-mmacosx-version-min=10.7 -fno-exceptions -Wall -W -DQT_NO_MTDEV

This is Clang, so the decision is compile-time. That -march=native tells Clang 
to enable it if your computer supports it. Assuming you have a non-ancient 
Mac, it should get enabled.

> :/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolc
> :hain/usr/bin/ar cq libQt5Bootstrap.a .obj/qstring_mac.o

Creation of a static library. That means the binary linking against this 
library needs to get the -march=native option from above.

> :/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolc
> :hain/usr/bin/clang++ -L/opt/local/lib -Wl,-headerpad_max_install_names -O3
> :-march=native -g
> :-Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOS
> :X.platform/Developer/SDKs/MacOSX10.9.sdk -stdlib=libc++
> :-mmacosx-version-min=10.7 -D_REENTRANT -I/opt/local/include/glib-2.0
> :-I/opt/local/lib/glib-2.0/include -I/opt/local/include -isysroot
> :/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Devel
> :oper/SDKs/MacOSX10.9.sdk -std=c++11 -fvisibility=hidden
> :-fvisibility-inlines-hidden -flto -single_module -dynamiclib -fPIC
> :-compatibility_version	5.4 -current_version	5.4.2
> :-install_name	/opt/local/libexec/qt5/Library/Frameworks/QtCore.framework/V
> :ersions/5/QtCore -o QtCore .obj/qlocale_mac.o .obj/qtimezoneprivate_mac.o

This is the linking of QtCore, not of moc or rcc. But either way, note how -
march=native is present here.

So this is a compiler bug.

Sorry, please try GCC.

Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

More information about the Interest mailing list