llvm-project/llvm/cmake/modules
Rainer Orth 15c66b1011 [cmake] Don't build with -O3 -fPIC on Solaris/sparcv9
Tests on Solaris/sparcv9 currently show about 250 failures when building
with gcc, most of them like the following:

  FAIL: LLVM-Unit :: Support/./SupportTests/TaskQueueTest.UnOrderedFutures (4269 of 67884)
  ******************** TEST 'LLVM-Unit :: Support/./SupportTests/TaskQueueTest.UnOrderedFutures' FAILED ********************
  Note: Google Test filter = TaskQueueTest.UnOrderedFutures
  [==========] Running 1 test from 1 test case.
  [----------] Global test environment set-up.
  [----------] 1 test from TaskQueueTest
  [ RUN      ] TaskQueueTest.UnOrderedFutures
  0  SupportTests        0x0000000100753b20 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 32
  1  SupportTests        0x0000000100752974 llvm::sys::RunSignalHandlers() + 68
  2  SupportTests        0x0000000100752b18 SignalHandler(int) + 372
  3  libc.so.1           0xffffffff7eedc800 __sighndlr + 12
  4  libc.so.1           0xffffffff7eecf23c call_user_handler + 852
  5  libc.so.1           0xffffffff7eecf594 sigacthandler + 84
  6  SupportTests        0x00000001006f8cb8 std:🧵:_State_impl<std:🧵:_Invoker<std::tuple<llvm::ThreadPool::ThreadPool(llvm::ThreadPoolStrategy)::'lambda'()> > >::_M_run() + 512
  7  libstdc++.so.6.0.28 0xfffffffc628117cc execute_native_thread_routine + 16
  8  libc.so.1           0xffffffff7eedc6a0 _lwp_start + 0

Since it's effectively impossible to debug such a `SEGV` in a `Release`
build, I tried a `Debug` build instead, only to find that the failures had
gone away.

Further investigation revealed that most of the issue centers around
`llvm/lib/Support/ThreadPool.cpp`.  That file is built with `-O3 -fPIC` in
a `Release` build.  The failure vanishes if

- compiling without `-fPIC`
- compiling with `-O -fPIC`
- linking with GNU `ld` instead of Solaris `ld`

It has meanwhile been determined that `gcc` doesn't correctly heed some TLS
code sequences.  To make things worse, Solaris `ld` doesn't properly
validate its assumptions against the input, generating wrong code.

`gld` like `gcc` is more liberal here and correctly deals with the code it
gets fed from `gcc`.

There's PR target/96607: GCC feeds SPARC/Solaris linker with unrecognized
TLS sequences <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96607> now.

An attempt to build with `-DLLVM_ENABLE_PIC=Off` initially failed since
neither `libRemarks.so` (D85626 <https://reviews.llvm.org/D85626>) nor
`LLVMPolly.so` (D85627 <https://reviews.llvm.org/D85627>) heed that option.
Even with that fixed, a few codegen failures remain.

Next I tried to build just `ThreadPool.cpp` with `-O -fPIC`.  While that
fixed the vast majority of the failures, 16 `LLVM :: CodeGen/X86` failures
remained.

Given that that solution was both incomplete and fragile, I went for
building the whole tree with `-O -fPIC` for `Release` and `RelWithDebInfo`
builds.

As detailed in Bug 47304, 2-stage builds also show large numbers of
failures when building with `-O3` or `-O2`, which are likewise worked
around by building with `-O` until they are sufficiently analyzed and
fixed.

This way, all failures relative to a `Debug` build go away.

Tested on `sparcv9-sun-solaris2.11`.

Differential Revision: https://reviews.llvm.org/D85630
2020-08-28 11:40:34 +02:00
..
AddLLVM.cmake [cmake] Make gtest include directories a part of the library interface 2020-08-27 15:35:57 +02:00
AddLLVMDefinitions.cmake
AddOCaml.cmake [llvm] [ocaml] Support linking against dylib 2019-10-11 14:32:43 +00:00
AddSphinxTarget.cmake [llvm] [docs] Do not require recommonmark for manpage build 2020-07-07 20:59:02 +02:00
CMakeLists.txt Fix missing build dependencies on omp_gen 2020-07-02 07:55:20 -06:00
CheckAtomic.cmake [CMake][NFC] Clean up CheckAtomic.cmake 2020-04-18 12:53:22 +01:00
CheckCompilerVersion.cmake MSVC Buggy version detection: turn pre-processor error into CMake configuration time check 2020-01-31 00:11:55 +00:00
CheckLinkerFlag.cmake
ChooseMSVCCRT.cmake
CrossCompile.cmake [CMake] Fix cross-compiling with LLVM as CMake subproject 2020-04-30 16:54:20 +02:00
DetermineGCCCompatible.cmake
FindGRPC.cmake [clangd] Fix Windows build when remote index is enabled. 2020-08-17 16:55:01 +03:00
FindLibpfm.cmake [llvm-exegesis] Check perf_branch_entry for field cycles 2020-07-27 11:31:13 -04:00
FindOCaml.cmake
FindSphinx.cmake
FindZ3.cmake [NFC] Fix Z3 version detection regexp 2020-04-09 13:06:22 +02:00
GenerateVersionFromVCS.cmake
GetHostTriple.cmake [SystemZ/ZOS] Additions to the build system. 2020-08-26 06:53:44 -04:00
HandleLLVMOptions.cmake [cmake] Don't build with -O3 -fPIC on Solaris/sparcv9 2020-08-28 11:40:34 +02:00
HandleLLVMStdlib.cmake Add support in CMake to statically link the C++ standard library. 2019-08-14 19:55:59 +00:00
LLVM-Config.cmake Remove AllTargetsAsmPrinters 2020-01-17 19:04:06 -05:00
LLVMConfig.cmake.in [CMake] Simplify CMake handling for zlib 2020-08-11 20:22:11 -07:00
LLVMConfigVersion.cmake.in
LLVMDistributionSupport.cmake build: extract LLVM distribution target handling 2019-06-14 18:28:57 +00:00
LLVMExternalProjectUtils.cmake [runtimes] Use llvm-libtool-darwin for runtimes build 2020-08-24 13:48:30 -07:00
LLVMInstallSymlink.cmake [cmake] install_symlink should obey DESTDIR unconditionally 2019-08-15 15:36:13 +00:00
LLVMProcessSources.cmake [clangd] Fix remote index build without shared libs mode 2020-04-28 19:16:37 +02:00
TableGen.cmake [CMake] -gen-dag-isel: add -omit-comments if neither Debug nor RelWithDebInfo 2020-05-15 14:03:05 -07:00
TensorFlowCompile.cmake [llvm] Release-mode ML InlineAdvisor 2020-06-24 08:18:42 -07:00
UseLibtool.cmake
VersionFromVCS.cmake Make ninja smart console builds more pretty 2020-06-22 06:35:13 -04:00