This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[v3] Link libstdc++ with -lpthread on IRIX 6 (PR target/47852)


When PR target/47852 was filed last year, it turned out that this seemed
to be the same problem as PR target/45693 on Tru64 UNIX, i.e. stub
implementations of pthread functions getting in the way, although I
couldn't really figure out how this happens.  Since the problem on IRIX
didn't show up anywhere in the testsuite and seemed to be a weird corner
case, I all but forgot about it.

Recently, though, a couple of 30_threads testcases started to fail:

FAIL: 30_threads/future/cons/move_assign.cc execution test
FAIL: 30_threads/shared_future/cons/assign.cc execution test
FAIL: 30_threads/shared_future/cons/move_assign.cc execution test

like this:

terminate called after throwing an instance of 'std::system_error'
  what():  Function not implemented
Abort

It turns out that __gthread_cond_broadcast in

  void
  condition_variable::notify_all() noexcept
  {
    int __e = __gthread_cond_broadcast(&_M_cond);

    // XXX not in spec
    // EINVAL
    if (__e)
      __throw_system_error(__e);
  }

returns ENOSYS due to a stub for pthread_cond_broadcast in libc.
Linking libstdc++.so with -lpthread fixes those tests.

I've relinked libstdc++.so with -lpthread using the patch below and
rerun the libstdc++-v3 testsuite, where all 3 testcases pass now.

I'll include the patch in the next full mips-sgi-irix6.5 bootstrap this
weekend.  Ok for mainline if that passes?

Thanks.
	Rainer


2011-02-25  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR target/47852
	* configure.host (irix6.5*): Add -lpthread to OPT_LDFLAGS.

# HG changeset patch
# Parent dc4f565925904068ffc3f7444fbc4f73ebfdcd07
Link libstdc++ with -lpthread on IRIX 6 (PR target/47852)

diff -r dc4f56592590 libstdc++-v3/configure.host
--- a/libstdc++-v3/configure.host	Tue Feb 22 15:54:16 2011 +0000
+++ b/libstdc++-v3/configure.host	Fri Feb 25 19:39:22 2011 +0100
@@ -252,6 +252,10 @@
     os_include_dir="os/irix/irix6.5"
     atomicity_dir=os/irix
     atomic_word_dir=os/irix
+    # libstdc++.so relies on emutls on IRIX, which only works with the
+    # real functions implemented in libpthread.so, not with the stubs in
+    # libc, so always pass -lpthread.
+    OPT_LDFLAGS="${OPT_LDFLAGS} -lpthread"
     ;;
   mingw32*)
     os_include_dir="os/mingw32"
-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]