[runtimes] Support ELF dependent libraries feature
authorPetr Hosek <phosek@chromium.org>
Thu, 30 May 2019 01:34:41 +0000 (01:34 +0000)
committerPetr Hosek <phosek@chromium.org>
Thu, 30 May 2019 01:34:41 +0000 (01:34 +0000)
As of r360984, LLD supports dependent libraries feature for ELF.
libunwind, libc++abi and libc++ have library dependencies: libdl librt
and libpthread, which means that when libunwind and libc++ are being
statically linked (using -static-libstdc++ flag), user has to manually
specify -ldl -lpthread which is onerous.

This change includes the lib pragma to specify the library dependencies
directly in the source that uses those libraries. This doesn't make any
difference when using linkers that don't support dependent libraries.
However, when using LLD that has dependent libraries feature, users no
longer have to manually specifying library dependencies when using
static linking, linker will pick the library automatically.

Differential Revision: https://reviews.llvm.org/D62090

llvm-svn: 362048

15 files changed:
libcxx/src/algorithm.cpp
libcxx/src/chrono.cpp
libcxx/src/condition_variable.cpp
libcxx/src/debug.cpp
libcxx/src/experimental/memory_resource.cpp
libcxx/src/filesystem/operations.cpp
libcxx/src/memory.cpp
libcxx/src/mutex.cpp
libcxx/src/shared_mutex.cpp
libcxx/src/thread.cpp
libcxxabi/src/cxa_guard_impl.h
libcxxabi/src/cxa_thread_atexit.cpp
libcxxabi/src/fallback_malloc.cpp
libunwind/src/AddressSpace.hpp
libunwind/src/RWMutex.hpp

index 28e452f..5ce2a23 100644 (file)
@@ -8,7 +8,12 @@
 
 #include "algorithm"
 #include "random"
+#ifndef _LIBCPP_HAS_NO_THREADS
 #include "mutex"
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+#endif
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
index c1eb67b..a2f88c9 100644 (file)
 #endif
 #endif
 
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "rt")
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 namespace chrono
index 4022ff2..69264c6 100644 (file)
 #include "system_error"
 #include "__undef_macros"
 
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 condition_variable::~condition_variable()
index 7fdf90c..9502413 100644 (file)
 #include "string"
 #include "cstdio"
 #include "__hash_table"
+#ifndef _LIBCPP_HAS_NO_THREADS
 #include "mutex"
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+#endif
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
index 22bc12c..84c9508 100644 (file)
@@ -12,6 +12,9 @@
 #include "atomic"
 #elif !defined(_LIBCPP_HAS_NO_THREADS)
 #include "mutex"
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
 #endif
 
 _LIBCPP_BEGIN_NAMESPACE_LFTS_PMR
index 5ba979c..319d9f6 100644 (file)
 #include <sys/time.h> // for gettimeofday and timeval
 #endif                // !defined(CLOCK_REALTIME)
 
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "rt")
+#endif
+
 #if defined(_LIBCPP_COMPILER_GCC)
 #if _GNUC_VER < 500
 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
index 8b05c3f..6df7226 100644 (file)
@@ -10,6 +10,9 @@
 #ifndef _LIBCPP_HAS_NO_THREADS
 #include "mutex"
 #include "thread"
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
 #endif
 #include "include/atomic_support.h"
 
index cecb89b..d100f2d 100644 (file)
 #include "include/atomic_support.h"
 #include "__undef_macros"
 
+#ifndef _LIBCPP_HAS_NO_THREADS
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 #ifndef _LIBCPP_HAS_NO_THREADS
 
index e918e1b..3f1aecf 100644 (file)
@@ -10,6 +10,9 @@
 #ifndef _LIBCPP_HAS_NO_THREADS
 
 #include "shared_mutex"
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
index 29b06fd..92690f6 100644 (file)
 #include <windows.h>
 #endif
 
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 thread::~thread()
index 412099e..bd6b15f 100644 (file)
 
 #include <stdlib.h>
 #include <__threading_support>
+#ifndef _LIBCXXABI_HAS_NO_THREADS
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+#endif
 
 // To make testing possible, this header is included from both cxa_guard.cpp
 // and a number of tests.
index da1df86..38787f1 100644 (file)
@@ -9,6 +9,12 @@
 #include "abort_message.h"
 #include "cxxabi.h"
 #include <__threading_support>
+#ifndef _LIBCXXABI_HAS_NO_THREADS
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+#endif
+
 #include <cstdlib>
 
 namespace __cxxabiv1 {
index 8ec1eee..bae0fa4 100644 (file)
 #include "fallback_malloc.h"
 
 #include <__threading_support>
+#ifndef _LIBCXXABI_HAS_NO_THREADS
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+#endif
 
 #include <cstdlib> // for malloc, calloc, free
 #include <cstring> // for memset
index fb370ad..6643953 100644 (file)
@@ -27,6 +27,9 @@
 
 #if _LIBUNWIND_USE_DLADDR
 #include <dlfcn.h>
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "dl")
+#endif
 #endif
 
 #ifdef __APPLE__
index 7a08bb2..4f234a7 100644 (file)
@@ -17,6 +17,9 @@
 #include <windows.h>
 #elif !defined(_LIBUNWIND_HAS_NO_THREADS)
 #include <pthread.h>
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
 #endif
 
 namespace libunwind {