[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
diff --git a/src/algorithm.cpp b/src/algorithm.cpp
index 28e452f..5ce2a23 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 c1eb67b..a2f88c9 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 4022ff2..69264c6 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 7fdf90c..9502413 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 22bc12c..84c9508 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 5ba979c..319d9f6 100644
--- a/src/filesystem/operations.cpp
+++ b/src/filesystem/operations.cpp
@@ -44,6 +44,10 @@
 #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"
diff --git a/src/memory.cpp b/src/memory.cpp
index 8b05c3f..6df7226 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 cecb89b..d100f2d 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 e918e1b..3f1aecf 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 29b06fd..92690f6 100644
--- a/src/thread.cpp
+++ b/src/thread.cpp
@@ -35,6 +35,10 @@
 #include <windows.h>
 #endif
 
+#if defined(__unix__) &&  defined(__ELF__) && defined(__clang__)
+#pragma comment(lib, "pthread")
+#endif
+
 _LIBCPP_BEGIN_NAMESPACE_STD
 
 thread::~thread()