Build failure with clang on older CPU :Illegal instruction
Luboš Luňák
l.lunak at collabora.com
Mon Nov 11 08:46:37 UTC 2019
On Monday 11 of November 2019, Luke Benes wrote:
> Noel,
>
> After
> https://cgit.freedesktop.org/libreoffice/core/commit/?id=09f77e8ed51fc64fcc
>c6a14e87eed48b2f15a28d loplugin:unusedmethods
The guilty commit is actually
https://cgit.freedesktop.org/libreoffice/core/commit/?id=f43f9b99603736a4d54f550052509eb5f4d04b45 .
The INTRINSICS_CXXFLAGS variable is misdesigned or misused. What happens is
that a source file gets unconditionally compiled with whatever configure
finds to be the most advanced instruction set, and then the code from the
compiled source gets executed unconditionally, without a runtime check. A
runtime check is necessary, as flags like -mavx2 allow the compiler to use
newer instructions even for source code that doesn't explicitly use them.
Looking at tools/qa/cppunit/test_cpuid.cxx, it seems that it doesn't need any
special CXXFLAGS, as it doesn't use them. And if it does need them, then
those parts need to be split to one source file per instruction set, each
compiled with its matching CXXFLAGS, and then another source file (compiled
normally) needs to call them only after doing a runtime check. See the
description of -mavx2 etc. in 'man gcc' and see 'git grep SSE2 sc/' for an
example.
> Clang 7 on KDE Neon x86-64, and clang 10-git on openSUSE Tumbleweed i686 is
> failing with
>
> [CUT] tools_test
> Illegal instruction (core dumped)
[...]
> Thread 1 (Thread 0x7f90ea199740 (LWP 8225)):
> #0 0x00007f90e824f538 in CppUnit::TestSuiteFactory<(anonymous
> namespace)::CpuInstructionSetSupport>::makeTest() () at
> /core/workdir/LinkTarget/CppunitTest/libtest_tools_test.so #1
> 0x00007f90e9d66f3b in
> CppUnit::TestFactoryRegistry::addTestToSuite(CppUnit::TestSuite*) () at
> /core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.14.so.
>0 #2 0x00007f90e9d66e67 in CppUnit::TestFactoryRegistry::makeTest() () at
> /core/workdir/UnpackedTarball/cppunit/src/cppunit/.libs/libcppunit-1.14.so.
>0 #3 0x00000000004042a9 in (anonymous
> namespace)::ProtectedFixtureFunctor::run() const () #4 0x00000000004035be
> in main ()
>
>
> Error: a unit test failed, please do one of:
>
> make CppunitTest_tools_test CPPUNITTRACE="gdb --args"
> ...
> $ cat /proc/cpuinfo
> model name : Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz
>
> Newer CPU's like my Broadwell Core i3 Processors have no issue with the
> same distros.
--
Luboš Luňák
l.lunak at collabora.com
More information about the LibreOffice
mailing list