From 74d2da4ba5eabeb8d101a227a727c38e01bb841d Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 30 May 2019 01:34:41 +0000 Subject: [PATCH] [runtimes] Support ELF dependent libraries feature 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 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@362048 91177308-0d34-0410-b5e6-96231b3b80d8 --- src/algorithm.cpp | 5 +++++ src/chrono.cpp | 4 ++++ src/condition_variable.cpp | 4 ++++ src/debug.cpp | 5 +++++ src/experimental/memory_resource.cpp | 3 +++ src/filesystem/operations.cpp | 4 ++++ src/memory.cpp | 3 +++ src/mutex.cpp | 6 ++++++ src/shared_mutex.cpp | 3 +++ src/thread.cpp | 4 ++++ 10 files changed, 41 insertions(+) diff --git a/src/algorithm.cpp b/src/algorithm.cpp index 28e452f52..5ce2a23b4 100644 --- a/src/algorithm.cpp +++ b/src/algorithm.cpp @@ -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 diff --git a/src/chrono.cpp b/src/chrono.cpp index c1eb67b61..a2f88c94c 100644 --- a/src/chrono.cpp +++ b/src/chrono.cpp @@ -37,6 +37,10 @@ #endif #endif +#if defined(__unix__) && defined(__ELF__) && defined(__clang__) +#pragma comment(lib, "rt") +#endif + _LIBCPP_BEGIN_NAMESPACE_STD namespace chrono diff --git a/src/condition_variable.cpp b/src/condition_variable.cpp index 4022ff2e9..69264c680 100644 --- a/src/condition_variable.cpp +++ b/src/condition_variable.cpp @@ -15,6 +15,10 @@ #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() diff --git a/src/debug.cpp b/src/debug.cpp index 7fdf90c37..950241310 100644 --- a/src/debug.cpp +++ b/src/debug.cpp @@ -13,7 +13,12 @@ #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 diff --git a/src/experimental/memory_resource.cpp b/src/experimental/memory_resource.cpp index 22bc12c10..84c950804 100644 --- a/src/experimental/memory_resource.cpp +++ b/src/experimental/memory_resource.cpp @@ -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 diff --git a/src/filesystem/operations.cpp b/src/filesystem/operations.cpp index 5ba979ca9..319d9f65d 100644 --- a/src/filesystem/operations.cpp +++ b/src/filesystem/operations.cpp @@ -44,6 +44,10 @@ #include // 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" diff --git a/src/memory.cpp b/src/memory.cpp index 8b05c3f16..6df7226b3 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -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" diff --git a/src/mutex.cpp b/src/mutex.cpp index cecb89b33..d100f2df2 100644 --- a/src/mutex.cpp +++ b/src/mutex.cpp @@ -12,6 +12,12 @@ #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 diff --git a/src/shared_mutex.cpp b/src/shared_mutex.cpp index e918e1bdf..3f1aecfdf 100644 --- a/src/shared_mutex.cpp +++ b/src/shared_mutex.cpp @@ -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 diff --git a/src/thread.cpp b/src/thread.cpp index 29b06fdf6..92690f667 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -35,6 +35,10 @@ #include #endif +#if defined(__unix__) && defined(__ELF__) && defined(__clang__) +#pragma comment(lib, "pthread") +#endif + _LIBCPP_BEGIN_NAMESPACE_STD thread::~thread()