Add --disable-tls to GCC?

Marcus Calhoun-Lopez mcalhoun at macports.org
Wed Aug 2 16:24:10 UTC 2017


The file ${prefix}/include/gcc6/c++/${build_arch}-apple-darwin${os.major}/bits/c++config.h
has different values for _GLIBCXX_HAVE_TLS on different platforms.
For ${os.major}  <  15, _GLIBCXX_HAVE_TLS is defined as 1.
For ${os.major} >= 15, _GLIBCXX_HAVE_TLS is undefined.
I am not sure why the availability of thread-local storage changed,
but for consistency, should --disable-tls be added to the GCC
configure script (see https://gcc.gnu.org/install/configure.html)?

The reason I bring this up is that the following code works macOS
Sierra and OS X El Capitan:
------------------------------------------------------------------------------------------------------------------------------
    clang++-mp-4.0 -std=c++11 -stdlib=macports-libstdc++ future.cxx
------------------------------------------------------------------------------------------------------------------------------
   #include <iostream>
   #include <future>

  int main()
  {
      std::future<int> f1 = std::async([](){ return 42; });
      f1.wait();
      std::cout << "Magic number is: " << f1.get() << std::endl;
  }
------------------------------------------------------------------------------------------------------------------------------

It does *not* work for OS versions prior to El Capitan with the error:
------------------------------------------------------------------------------------------------------------------------------
Undefined symbols for architecture x86_64:
  "std::__once_call", referenced from:
      void std::call_once<void
(std::__future_base::_State_baseV2::*)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*,
bool*>(std::once_flag&, void
(std::__future_base::_State_baseV2::*&&)(std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*, bool*),
std::__future_base::_State_baseV2*&&,
std::function<std::unique_ptr<std::__future_base::_Result_base,
std::__future_base::_Result_base::_Deleter> ()>*&&, bool*&&) in
future-b039c9.o
------------------------------------------------------------------------------------------------------------------------------
  clang++-mp-4.0 -std=c++11 -stdlib=macports-libstdc++ -femulated-tls future.cxx
------------------------------------------------------------------------------------------------------------------------------
compiles fine but experiences a segmentation fault at runtime.

When I build GCC with --disable-tls, everything works on all platforms.

I realize that -stdlib=macports-libstdc++ is a highly unsupported
configuration, but --disable-tls would not seem to affect newer OSs.

Does anyone have any insight into this?
Does anyone have any objections to adding --disable-tls?

Thanks,
Marcus


More information about the macports-dev mailing list