Jonathan Wakely <jwakely....@gmail.com> writes:

> This alters the configure script to enable C++11 thread library
> features based on targets that are known to support the features,
> rather than based on link tests which are disabled by default.  With
> Glibc 2.17 this enables a nanosecond resolution std::system_clock in
> the default configuration, yay!
>
> I've tested this on two versions of Fedora and Debian, but would be
> grateful for test results on Solaris, Cygwin and BSD targets, and for
> cross-compilers to any of those targets.

Apart from the abi_check failure already reported, I get the following
testsuite regressions on Solaris 10/x86:

FAIL: 30_threads/async/54297.cc (test for excess errors)
WARNING: 30_threads/async/54297.cc compilation failed to produce executable
FAIL: 30_threads/condition_variable_any/53830.cc (test for excess errors)
WARNING: 30_threads/condition_variable_any/53830.cc compilation failed to produ
e executable
FAIL: 30_threads/this_thread/3.cc (test for excess errors)
WARNING: 30_threads/this_thread/3.cc compilation failed to produce executable
FAIL: 30_threads/this_thread/4.cc (test for excess errors)
WARNING: 30_threads/this_thread/4.cc compilation failed to produce executable
FAIL: 30_threads/thread/native_handle/cancel.cc (test for excess errors)
WARNING: 30_threads/thread/native_handle/cancel.cc compilation failed to produc
e executable

All of them have the same root cause:

Excess errors:
Undefined                       first referenced
 symbol                             in file
nanosleep                           /var/tmp//ccQhmiwd.o  (symbol belongs to 
implicit dependency /lib/librt.so.1)
ld: fatal: symbol referencing errors. No output written to ./54297.exe
collect2: error: ld returned 1 exit status

It seems that now every single C++ program needs to be linked with -lrt,
not only libstdc++.so.  This will also happen on Solaris 9 (bootstrap
still running), while on Solaris 11 nanosleep and the others were
integrated into libc.so.1.

Speaking of Solaris 9, there's another caveat: unlike Solaris 10 and up,
CLOCK_MONOTONIC isn't defined, while the equivalent non-standard
CLOCK_HIGHRES is.  Instead of handling this in
libstdc++-v3/src/c++11/chrono.cc directly, I've chosen the following
route which allows libstdc++ to build on Solaris 9:

2013-05-22  Rainer Orth  <r...@cebitec.uni-bielefeld.de>

        * config/os/solaris/solaris2.9/os_defines.h [!CLOCK_MONOTONIC]
        (CLOCK_MONOTONIC): Define.

# HG changeset patch
# Parent 079c0691568d1b9ef88a62ebf89ea19d3a8272ab
Use CLOCK_HIGHRES on Solaris 9

	libstdc++-v3:
	* config/os/solaris/solaris2.9/os_defines.h [!CLOCK_MONOTONIC]
	(CLOCK_MONOTONIC): Define.

diff --git a/libstdc++-v3/config/os/solaris/solaris2.9/os_defines.h b/libstdc++-v3/config/os/solaris/solaris2.9/os_defines.h
--- a/libstdc++-v3/config/os/solaris/solaris2.9/os_defines.h
+++ b/libstdc++-v3/config/os/solaris/solaris2.9/os_defines.h
@@ -35,5 +35,10 @@
 #define __CORRECT_ISO_CPP_WCHAR_H_PROTO
 #endif
 
+/* Solaris 9 uses the non-standard CLOCK_HIGHRES instead.  */
+#ifndef CLOCK_MONOTONIC
+#define CLOCK_MONOTONIC CLOCK_HIGHRES
 #endif
 
+#endif
+
 
        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to