Make support for thread-unsafe C functions optional.
One of the aspects of CloudABI is that it aims to help you write code that is thread-safe out of the box. This is very important if you want to write libraries that are easy to reuse. For CloudABI we decided to not provide the thread-unsafe functions. So far this is working out pretty well, as thread-unsafety issues are detected really early on. The following patch adds a knob to libc++, _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS, that can be set to disable thread-unsafe functions that can easily be avoided in practice. The following functions are not thread-safe: - <clocale>: locale handles should be preferred over setlocale(). - <cstdlib>: mbrlen(), mbrtowc() and wcrtomb() should be preferred over their non-restartable counterparts. - <ctime>: asctime(), ctime(), gmtime() and localtime() are not thread-safe. The first two are also deprecated by POSIX. Differential Revision: http://reviews.llvm.org/D8703 Reviewed by: marshall git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@240527 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -372,6 +372,8 @@ class Configuration(object):
|
||||
elif not enable_monotonic_clock:
|
||||
self.lit_config.fatal('enable_monotonic_clock cannot be false when'
|
||||
' enable_threads is true.')
|
||||
self.configure_compile_flags_no_thread_unsafe_c_functions()
|
||||
|
||||
# Use verbose output for better errors
|
||||
self.cxx.flags += ['-v']
|
||||
sysroot = self.get_lit_conf('sysroot')
|
||||
@@ -431,6 +433,15 @@ class Configuration(object):
|
||||
self.cxx.compile_flags += ['-D_LIBCPP_HAS_NO_THREADS']
|
||||
self.config.available_features.add('libcpp-has-no-threads')
|
||||
|
||||
def configure_compile_flags_no_thread_unsafe_c_functions(self):
|
||||
enable_thread_unsafe_c_functions = self.get_lit_bool(
|
||||
'enable_thread_unsafe_c_functions', True)
|
||||
if not enable_thread_unsafe_c_functions:
|
||||
self.cxx.compile_flags += [
|
||||
'-D_LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS']
|
||||
self.config.available_features.add(
|
||||
'libcpp-has-no-thread-unsafe-c-functions')
|
||||
|
||||
def configure_compile_flags_no_monotonic_clock(self):
|
||||
self.cxx.compile_flags += ['-D_LIBCPP_HAS_NO_MONOTONIC_CLOCK']
|
||||
self.config.available_features.add('libcpp-has-no-monotonic-clock')
|
||||
@@ -522,7 +533,7 @@ class Configuration(object):
|
||||
else:
|
||||
self.cxx.link_flags += ['-lgcc_s']
|
||||
elif target_platform.startswith('freebsd'):
|
||||
self.cxx.link_flags += ['-lc', '-lm', '-lpthread', '-lgcc_s']
|
||||
self.cxx.link_flags += ['-lc', '-lm', '-lpthread', '-lgcc_s', '-lcxxrt']
|
||||
else:
|
||||
self.lit_config.fatal("unrecognized system: %r" % target_platform)
|
||||
|
||||
|
Reference in New Issue
Block a user