[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-11-28 Thread Louis Dionne via cfe-commits

ldionne wrote:

Closing as stale, please reopen if you still want to pursue.

https://github.com/llvm/llvm-project/pull/101688
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-11-28 Thread Louis Dionne via cfe-commits

https://github.com/ldionne closed 
https://github.com/llvm/llvm-project/pull/101688
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-23 Thread Louis Dionne via cfe-commits

ldionne wrote:

Gentle ping

https://github.com/llvm/llvm-project/pull/101688
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-05 Thread Louis Dionne via cfe-commits


@@ -0,0 +1,39 @@
+#===

ldionne wrote:

For now, can't you include `libcxx/cmake/Modules/HandleLibC.cmake` instead?

https://github.com/llvm/llvm-project/pull/101688
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-05 Thread Louis Dionne via cfe-commits

ldionne wrote:

> @ldionne I'm starting to think that we should have a generic module in 
> https://github.com/llvm/llvm-project/tree/main/cmake/Modules that would be 
> controlled by `LLVM_USE_LIBC` and define `libc-headers`, `libc-static` and 
> `libc-shared`. That way we could avoid duplicating this logic in every 
> subproject. What do you think?

I agree, but I might put it in `runtimes/cmake/Modules` where we already have 
some stuff. I also wonder if we want to use  `LLVM_USE_LIBC` or 
`RUNTIMES_USE_LIBC` or something else. Historically, `LLVM_FOO` settings are 
mostly things that we've inherited from `/llvm/CMakeLists.txt` and 
tried to move away from.

https://github.com/llvm/llvm-project/pull/101688
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-02 Thread Petr Hosek via cfe-commits

https://github.com/petrhosek updated 
https://github.com/llvm/llvm-project/pull/101688

>From eb619c826eda5a4b0b27db17b43222748b5f2861 Mon Sep 17 00:00:00 2001
From: Petr Hosek 
Date: Fri, 2 Aug 2024 08:25:53 -0700
Subject: [PATCH 1/2] [libcxxabi][libunwind] Support for using LLVM libc

This is analogous to #99287 and provides an option to build libc++abi
and libunwind against LLVM libc when selected.
---
 libcxxabi/CMakeLists.txt |  8 +
 libcxxabi/cmake/Modules/HandleLibC.cmake | 39 
 libcxxabi/src/CMakeLists.txt | 14 +
 libunwind/CMakeLists.txt |  2 ++
 libunwind/cmake/Modules/HandleLibC.cmake | 39 
 libunwind/src/CMakeLists.txt | 14 +
 6 files changed, 104 insertions(+), 12 deletions(-)
 create mode 100644 libcxxabi/cmake/Modules/HandleLibC.cmake
 create mode 100644 libunwind/cmake/Modules/HandleLibC.cmake

diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt
index 43400c6e8d9af..66cc776edd416 100644
--- a/libcxxabi/CMakeLists.txt
+++ b/libcxxabi/CMakeLists.txt
@@ -168,6 +168,12 @@ message(STATUS "Using libc++abi testing configuration: 
${LIBCXXABI_TEST_CONFIG}"
 set(LIBCXXABI_TEST_PARAMS "" CACHE STRING
 "A list of parameters to run the Lit test suite with.")
 
+set(LIBCXXABI_SUPPORTED_C_LIBRARIES system llvm-libc)
+set(LIBCXXABI_LIBC "system" CACHE STRING "Specify C library to use. Supported 
values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+if (NOT "${LIBCXXABI_LIBC}" IN_LIST LIBCXXABI_SUPPORTED_C_LIBRARIES)
+  message(FATAL_ERROR "Unsupported C library: '${LIBCXXABI_CXX_ABI}'. 
Supported values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+endif()
+
 
#===
 # Configure System
 
#===
@@ -249,6 +255,8 @@ add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}")
 # Configure compiler. Must happen after setting the target flags.
 include(config-ix)
 
+include(HandleLibC) # Setup the C library flags
+
 if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
   list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
   # cmake 3.14 and above remove system include paths that are explicitly
diff --git a/libcxxabi/cmake/Modules/HandleLibC.cmake 
b/libcxxabi/cmake/Modules/HandleLibC.cmake
new file mode 100644
index 0..0dbf5125d0f9e
--- /dev/null
+++ b/libcxxabi/cmake/Modules/HandleLibC.cmake
@@ -0,0 +1,39 @@
+#===
+# Define targets for linking against the selected C library
+#
+# After including this file, the following targets are defined:
+# - libcxxabi-libc-headers: An interface target that allows getting access to 
the
+#headers of the selected C library.
+# - libcxxabi-libc-shared: A target representing the selected shared C library.
+# - libcxxabi-libc-static: A target representing the selected static C library.
+#===
+
+# Link against a system-provided libc
+if (LIBCXXABI_LIBC STREQUAL "system")
+  add_library(libcxxabi-libc-headers INTERFACE)
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  add_library(libcxxabi-libc-shared INTERFACE)
+
+# Link against the in-tree LLVM libc
+elseif (LIBCXXABI_LIBC STREQUAL "llvm-libc")
+  add_library(libcxxabi-libc-headers INTERFACE)
+  target_link_libraries(libcxxabi-libc-headers INTERFACE libc-headers)
+  if(CXX_SUPPORTS_NOSTDLIBINC_FLAG)
+target_compile_options(libcxxabi-libc-headers INTERFACE "-nostdlibinc")
+  endif()
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  if (TARGET libc)
+target_link_libraries(libcxxabi-libc-static INTERFACE libc)
+  endif()
+  if (TARGET libm)
+target_link_libraries(libcxxabi-libc-static INTERFACE libm)
+  endif()
+  if (CXX_SUPPORTS_NOLIBC_FLAG)
+target_link_options(libcxxabi-libc-static INTERFACE "-nolibc")
+  endif()
+
+  # TODO: There's no support for building LLVM libc as a shared library yet.
+  add_library(libcxxabi-libc-shared INTERFACE)
+endif()
diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt
index c1a7bcb14eb19..1d8596d48615d 100644
--- a/libcxxabi/src/CMakeLists.txt
+++ b/libcxxabi/src/CMakeLists.txt
@@ -166,11 +166,12 @@ if (LIBCXXABI_USE_LLVM_UNWINDER)
 target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared)
   endif()
 endif()
-target_link_libraries(cxxabi_shared_objects PRIVATE cxx-headers 
${LIBCXXABI_LIBRARIES})
+target_link_libraries(cxxabi_shared_objects
+  PUBLIC cxxabi-headers
+  PRIVATE cxx-headers libcxxabi-libc-headers ${LIBCXXABI_LIBRARIES})
 if (NOT CXX_SUPPORTS_NOSTDLIBXX_FLAG)
   target_link_libraries(cxxabi_shared_objects PRIVATE 
${LIBCXXABI_BUILTINS_LIBRARY})
 endif()
-target_link_libraries(cxxabi_shared_objects PUBLIC cxxabi-headers)
 set_target_properties(cxxabi_shared_objects
   PROPERTIES
 CXX_EX

[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-02 Thread Petr Hosek via cfe-commits

petrhosek wrote:

@ldionne I'm starting to think that we should have a generic module in 
https://github.com/llvm/llvm-project/tree/main/cmake/Modules that would be 
controlled by `LLVM_USE_LIBC` and define `libc-headers`, `libc-static` and 
`libc-shared`. That way we could avoid duplicating this logic in every 
subproject. What do you think?

https://github.com/llvm/llvm-project/pull/101688
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-02 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-libunwind

Author: Petr Hosek (petrhosek)


Changes

This is analogous to #99287 and provides an option to build libc++abi 
and libunwind against LLVM libc when selected.

---
Full diff: https://github.com/llvm/llvm-project/pull/101688.diff


6 Files Affected:

- (modified) libcxxabi/CMakeLists.txt (+8) 
- (added) libcxxabi/cmake/Modules/HandleLibC.cmake (+39) 
- (modified) libcxxabi/src/CMakeLists.txt (+8-6) 
- (modified) libunwind/CMakeLists.txt (+2) 
- (added) libunwind/cmake/Modules/HandleLibC.cmake (+39) 
- (modified) libunwind/src/CMakeLists.txt (+8-6) 


``diff
diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt
index 43400c6e8d9af..66cc776edd416 100644
--- a/libcxxabi/CMakeLists.txt
+++ b/libcxxabi/CMakeLists.txt
@@ -168,6 +168,12 @@ message(STATUS "Using libc++abi testing configuration: 
${LIBCXXABI_TEST_CONFIG}"
 set(LIBCXXABI_TEST_PARAMS "" CACHE STRING
 "A list of parameters to run the Lit test suite with.")
 
+set(LIBCXXABI_SUPPORTED_C_LIBRARIES system llvm-libc)
+set(LIBCXXABI_LIBC "system" CACHE STRING "Specify C library to use. Supported 
values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+if (NOT "${LIBCXXABI_LIBC}" IN_LIST LIBCXXABI_SUPPORTED_C_LIBRARIES)
+  message(FATAL_ERROR "Unsupported C library: '${LIBCXXABI_CXX_ABI}'. 
Supported values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+endif()
+
 
#===
 # Configure System
 
#===
@@ -249,6 +255,8 @@ add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}")
 # Configure compiler. Must happen after setting the target flags.
 include(config-ix)
 
+include(HandleLibC) # Setup the C library flags
+
 if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
   list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
   # cmake 3.14 and above remove system include paths that are explicitly
diff --git a/libcxxabi/cmake/Modules/HandleLibC.cmake 
b/libcxxabi/cmake/Modules/HandleLibC.cmake
new file mode 100644
index 0..0dbf5125d0f9e
--- /dev/null
+++ b/libcxxabi/cmake/Modules/HandleLibC.cmake
@@ -0,0 +1,39 @@
+#===
+# Define targets for linking against the selected C library
+#
+# After including this file, the following targets are defined:
+# - libcxxabi-libc-headers: An interface target that allows getting access to 
the
+#headers of the selected C library.
+# - libcxxabi-libc-shared: A target representing the selected shared C library.
+# - libcxxabi-libc-static: A target representing the selected static C library.
+#===
+
+# Link against a system-provided libc
+if (LIBCXXABI_LIBC STREQUAL "system")
+  add_library(libcxxabi-libc-headers INTERFACE)
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  add_library(libcxxabi-libc-shared INTERFACE)
+
+# Link against the in-tree LLVM libc
+elseif (LIBCXXABI_LIBC STREQUAL "llvm-libc")
+  add_library(libcxxabi-libc-headers INTERFACE)
+  target_link_libraries(libcxxabi-libc-headers INTERFACE libc-headers)
+  if(CXX_SUPPORTS_NOSTDLIBINC_FLAG)
+target_compile_options(libcxxabi-libc-headers INTERFACE "-nostdlibinc")
+  endif()
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  if (TARGET libc)
+target_link_libraries(libcxxabi-libc-static INTERFACE libc)
+  endif()
+  if (TARGET libm)
+target_link_libraries(libcxxabi-libc-static INTERFACE libm)
+  endif()
+  if (CXX_SUPPORTS_NOLIBC_FLAG)
+target_link_options(libcxxabi-libc-static INTERFACE "-nolibc")
+  endif()
+
+  # TODO: There's no support for building LLVM libc as a shared library yet.
+  add_library(libcxxabi-libc-shared INTERFACE)
+endif()
diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt
index c1a7bcb14eb19..1d8596d48615d 100644
--- a/libcxxabi/src/CMakeLists.txt
+++ b/libcxxabi/src/CMakeLists.txt
@@ -166,11 +166,12 @@ if (LIBCXXABI_USE_LLVM_UNWINDER)
 target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared)
   endif()
 endif()
-target_link_libraries(cxxabi_shared_objects PRIVATE cxx-headers 
${LIBCXXABI_LIBRARIES})
+target_link_libraries(cxxabi_shared_objects
+  PUBLIC cxxabi-headers
+  PRIVATE cxx-headers libcxxabi-libc-headers ${LIBCXXABI_LIBRARIES})
 if (NOT CXX_SUPPORTS_NOSTDLIBXX_FLAG)
   target_link_libraries(cxxabi_shared_objects PRIVATE 
${LIBCXXABI_BUILTINS_LIBRARY})
 endif()
-target_link_libraries(cxxabi_shared_objects PUBLIC cxxabi-headers)
 set_target_properties(cxxabi_shared_objects
   PROPERTIES
 CXX_EXTENSIONS OFF
@@ -205,7 +206,7 @@ if (LIBCXXABI_ENABLE_SHARED)
   endif ()
 
   target_link_libraries(cxxabi_shared
-PUBLIC cxxabi_shared_objects
+PUBLIC cxxabi_shared_objects libcxxabi-libc-shared
 PRIVATE ${LIBCXXABI_LIBRARIES})
 
   list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared")
@@ -253,8 +254,9 @@ if 

[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-02 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-libcxxabi

Author: Petr Hosek (petrhosek)


Changes

This is analogous to #99287 and provides an option to build libc++abi 
and libunwind against LLVM libc when selected.

---
Full diff: https://github.com/llvm/llvm-project/pull/101688.diff


6 Files Affected:

- (modified) libcxxabi/CMakeLists.txt (+8) 
- (added) libcxxabi/cmake/Modules/HandleLibC.cmake (+39) 
- (modified) libcxxabi/src/CMakeLists.txt (+8-6) 
- (modified) libunwind/CMakeLists.txt (+2) 
- (added) libunwind/cmake/Modules/HandleLibC.cmake (+39) 
- (modified) libunwind/src/CMakeLists.txt (+8-6) 


``diff
diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt
index 43400c6e8d9af..66cc776edd416 100644
--- a/libcxxabi/CMakeLists.txt
+++ b/libcxxabi/CMakeLists.txt
@@ -168,6 +168,12 @@ message(STATUS "Using libc++abi testing configuration: 
${LIBCXXABI_TEST_CONFIG}"
 set(LIBCXXABI_TEST_PARAMS "" CACHE STRING
 "A list of parameters to run the Lit test suite with.")
 
+set(LIBCXXABI_SUPPORTED_C_LIBRARIES system llvm-libc)
+set(LIBCXXABI_LIBC "system" CACHE STRING "Specify C library to use. Supported 
values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+if (NOT "${LIBCXXABI_LIBC}" IN_LIST LIBCXXABI_SUPPORTED_C_LIBRARIES)
+  message(FATAL_ERROR "Unsupported C library: '${LIBCXXABI_CXX_ABI}'. 
Supported values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+endif()
+
 
#===
 # Configure System
 
#===
@@ -249,6 +255,8 @@ add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}")
 # Configure compiler. Must happen after setting the target flags.
 include(config-ix)
 
+include(HandleLibC) # Setup the C library flags
+
 if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
   list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
   # cmake 3.14 and above remove system include paths that are explicitly
diff --git a/libcxxabi/cmake/Modules/HandleLibC.cmake 
b/libcxxabi/cmake/Modules/HandleLibC.cmake
new file mode 100644
index 0..0dbf5125d0f9e
--- /dev/null
+++ b/libcxxabi/cmake/Modules/HandleLibC.cmake
@@ -0,0 +1,39 @@
+#===
+# Define targets for linking against the selected C library
+#
+# After including this file, the following targets are defined:
+# - libcxxabi-libc-headers: An interface target that allows getting access to 
the
+#headers of the selected C library.
+# - libcxxabi-libc-shared: A target representing the selected shared C library.
+# - libcxxabi-libc-static: A target representing the selected static C library.
+#===
+
+# Link against a system-provided libc
+if (LIBCXXABI_LIBC STREQUAL "system")
+  add_library(libcxxabi-libc-headers INTERFACE)
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  add_library(libcxxabi-libc-shared INTERFACE)
+
+# Link against the in-tree LLVM libc
+elseif (LIBCXXABI_LIBC STREQUAL "llvm-libc")
+  add_library(libcxxabi-libc-headers INTERFACE)
+  target_link_libraries(libcxxabi-libc-headers INTERFACE libc-headers)
+  if(CXX_SUPPORTS_NOSTDLIBINC_FLAG)
+target_compile_options(libcxxabi-libc-headers INTERFACE "-nostdlibinc")
+  endif()
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  if (TARGET libc)
+target_link_libraries(libcxxabi-libc-static INTERFACE libc)
+  endif()
+  if (TARGET libm)
+target_link_libraries(libcxxabi-libc-static INTERFACE libm)
+  endif()
+  if (CXX_SUPPORTS_NOLIBC_FLAG)
+target_link_options(libcxxabi-libc-static INTERFACE "-nolibc")
+  endif()
+
+  # TODO: There's no support for building LLVM libc as a shared library yet.
+  add_library(libcxxabi-libc-shared INTERFACE)
+endif()
diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt
index c1a7bcb14eb19..1d8596d48615d 100644
--- a/libcxxabi/src/CMakeLists.txt
+++ b/libcxxabi/src/CMakeLists.txt
@@ -166,11 +166,12 @@ if (LIBCXXABI_USE_LLVM_UNWINDER)
 target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared)
   endif()
 endif()
-target_link_libraries(cxxabi_shared_objects PRIVATE cxx-headers 
${LIBCXXABI_LIBRARIES})
+target_link_libraries(cxxabi_shared_objects
+  PUBLIC cxxabi-headers
+  PRIVATE cxx-headers libcxxabi-libc-headers ${LIBCXXABI_LIBRARIES})
 if (NOT CXX_SUPPORTS_NOSTDLIBXX_FLAG)
   target_link_libraries(cxxabi_shared_objects PRIVATE 
${LIBCXXABI_BUILTINS_LIBRARY})
 endif()
-target_link_libraries(cxxabi_shared_objects PUBLIC cxxabi-headers)
 set_target_properties(cxxabi_shared_objects
   PROPERTIES
 CXX_EXTENSIONS OFF
@@ -205,7 +206,7 @@ if (LIBCXXABI_ENABLE_SHARED)
   endif ()
 
   target_link_libraries(cxxabi_shared
-PUBLIC cxxabi_shared_objects
+PUBLIC cxxabi_shared_objects libcxxabi-libc-shared
 PRIVATE ${LIBCXXABI_LIBRARIES})
 
   list(APPEND LIBCXXABI_BUILD_TARGETS "cxxabi_shared")
@@ -253,8 +254,9 @@ if 

[libcxxabi] [libunwind] [libcxxabi][libunwind] Support for using LLVM libc (PR #101688)

2024-08-02 Thread Petr Hosek via cfe-commits

https://github.com/petrhosek created 
https://github.com/llvm/llvm-project/pull/101688

This is analogous to #99287 and provides an option to build libc++abi and 
libunwind against LLVM libc when selected.

>From eb619c826eda5a4b0b27db17b43222748b5f2861 Mon Sep 17 00:00:00 2001
From: Petr Hosek 
Date: Fri, 2 Aug 2024 08:25:53 -0700
Subject: [PATCH] [libcxxabi][libunwind] Support for using LLVM libc

This is analogous to #99287 and provides an option to build libc++abi
and libunwind against LLVM libc when selected.
---
 libcxxabi/CMakeLists.txt |  8 +
 libcxxabi/cmake/Modules/HandleLibC.cmake | 39 
 libcxxabi/src/CMakeLists.txt | 14 +
 libunwind/CMakeLists.txt |  2 ++
 libunwind/cmake/Modules/HandleLibC.cmake | 39 
 libunwind/src/CMakeLists.txt | 14 +
 6 files changed, 104 insertions(+), 12 deletions(-)
 create mode 100644 libcxxabi/cmake/Modules/HandleLibC.cmake
 create mode 100644 libunwind/cmake/Modules/HandleLibC.cmake

diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt
index 43400c6e8d9af..66cc776edd416 100644
--- a/libcxxabi/CMakeLists.txt
+++ b/libcxxabi/CMakeLists.txt
@@ -168,6 +168,12 @@ message(STATUS "Using libc++abi testing configuration: 
${LIBCXXABI_TEST_CONFIG}"
 set(LIBCXXABI_TEST_PARAMS "" CACHE STRING
 "A list of parameters to run the Lit test suite with.")
 
+set(LIBCXXABI_SUPPORTED_C_LIBRARIES system llvm-libc)
+set(LIBCXXABI_LIBC "system" CACHE STRING "Specify C library to use. Supported 
values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+if (NOT "${LIBCXXABI_LIBC}" IN_LIST LIBCXXABI_SUPPORTED_C_LIBRARIES)
+  message(FATAL_ERROR "Unsupported C library: '${LIBCXXABI_CXX_ABI}'. 
Supported values are ${LIBCXXABI_SUPPORTED_C_LIBRARIES}.")
+endif()
+
 
#===
 # Configure System
 
#===
@@ -249,6 +255,8 @@ add_library_flags("${LIBCXXABI_ADDITIONAL_LIBRARIES}")
 # Configure compiler. Must happen after setting the target flags.
 include(config-ix)
 
+include(HandleLibC) # Setup the C library flags
+
 if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
   list(APPEND LIBCXXABI_COMPILE_FLAGS -nostdinc++)
   # cmake 3.14 and above remove system include paths that are explicitly
diff --git a/libcxxabi/cmake/Modules/HandleLibC.cmake 
b/libcxxabi/cmake/Modules/HandleLibC.cmake
new file mode 100644
index 0..0dbf5125d0f9e
--- /dev/null
+++ b/libcxxabi/cmake/Modules/HandleLibC.cmake
@@ -0,0 +1,39 @@
+#===
+# Define targets for linking against the selected C library
+#
+# After including this file, the following targets are defined:
+# - libcxxabi-libc-headers: An interface target that allows getting access to 
the
+#headers of the selected C library.
+# - libcxxabi-libc-shared: A target representing the selected shared C library.
+# - libcxxabi-libc-static: A target representing the selected static C library.
+#===
+
+# Link against a system-provided libc
+if (LIBCXXABI_LIBC STREQUAL "system")
+  add_library(libcxxabi-libc-headers INTERFACE)
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  add_library(libcxxabi-libc-shared INTERFACE)
+
+# Link against the in-tree LLVM libc
+elseif (LIBCXXABI_LIBC STREQUAL "llvm-libc")
+  add_library(libcxxabi-libc-headers INTERFACE)
+  target_link_libraries(libcxxabi-libc-headers INTERFACE libc-headers)
+  if(CXX_SUPPORTS_NOSTDLIBINC_FLAG)
+target_compile_options(libcxxabi-libc-headers INTERFACE "-nostdlibinc")
+  endif()
+
+  add_library(libcxxabi-libc-static INTERFACE)
+  if (TARGET libc)
+target_link_libraries(libcxxabi-libc-static INTERFACE libc)
+  endif()
+  if (TARGET libm)
+target_link_libraries(libcxxabi-libc-static INTERFACE libm)
+  endif()
+  if (CXX_SUPPORTS_NOLIBC_FLAG)
+target_link_options(libcxxabi-libc-static INTERFACE "-nolibc")
+  endif()
+
+  # TODO: There's no support for building LLVM libc as a shared library yet.
+  add_library(libcxxabi-libc-shared INTERFACE)
+endif()
diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt
index c1a7bcb14eb19..1d8596d48615d 100644
--- a/libcxxabi/src/CMakeLists.txt
+++ b/libcxxabi/src/CMakeLists.txt
@@ -166,11 +166,12 @@ if (LIBCXXABI_USE_LLVM_UNWINDER)
 target_link_libraries(cxxabi_shared_objects PUBLIC unwind_shared)
   endif()
 endif()
-target_link_libraries(cxxabi_shared_objects PRIVATE cxx-headers 
${LIBCXXABI_LIBRARIES})
+target_link_libraries(cxxabi_shared_objects
+  PUBLIC cxxabi-headers
+  PRIVATE cxx-headers libcxxabi-libc-headers ${LIBCXXABI_LIBRARIES})
 if (NOT CXX_SUPPORTS_NOSTDLIBXX_FLAG)
   target_link_libraries(cxxabi_shared_objects PRIVATE 
${LIBCXXABI_BUILTINS_LIBRARY})
 endif()
-target_link_libraries(