[llvm] [flang-rt] Add support for using LLVM in-tree libc/libc++ (PR #131695)

Joseph Huber via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 24 03:34:05 PDT 2025


https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/131695

>From 53ee4d54f9acf24f168e87c7b6eefc70d72da2e3 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Mon, 17 Mar 2025 17:57:03 -0500
Subject: [PATCH] [flang-rt] Add support for using LLVM in-tree libc/libc++

Summary:
This patch adds an interface that uses an in-tree build of LLVM's libc
and libc++.

This is done using the `-DFLANG_RT_LIBC_PROVIDER=llvm` and
`-DFLANG_RT_LIBCXX_PROVIDER=llvm` options. Using `libc` works in terms
of CMake, but the LLVM libc is not yet complete enough to compile all
the files.
---
 flang-rt/CMakeLists.txt                 | 22 +++++++++++
 flang-rt/cmake/modules/AddFlangRT.cmake |  2 +
 flang-rt/cmake/modules/HandleLibs.cmake | 50 +++++++++++++++++++++++++
 3 files changed, 74 insertions(+)
 create mode 100644 flang-rt/cmake/modules/HandleLibs.cmake

diff --git a/flang-rt/CMakeLists.txt b/flang-rt/CMakeLists.txt
index a0b998dc3abd9..a01b826686b3a 100644
--- a/flang-rt/CMakeLists.txt
+++ b/flang-rt/CMakeLists.txt
@@ -139,6 +139,17 @@ cmake_path(NORMAL_PATH FLANG_RT_INSTALL_RESOURCE_LIB_PATH)
 
 option(FLANG_RT_INCLUDE_TESTS "Generate build targets for the flang-rt unit and regression-tests." "${LLVM_INCLUDE_TESTS}")
 
+# Provide an interface to link against the LLVM libc/libc++ projects directly.
+set(FLANG_RT_SUPPORTED_PROVIDERS system llvm)
+set(FLANG_RT_LIBC_PROVIDER "system" CACHE STRING "Specify C library to use. Supported values are ${FLANG_RT_SUPPORTED_PROVIDERS}.")
+if (NOT "${FLANG_RT_LIBC_PROVIDER}" IN_LIST FLANG_RT_SUPPORTED_PROVIDERS)
+  message(FATAL_ERROR "Unsupported library: '${FLANG_RT_RUNTIME_PROVIDER}'. Supported values are ${FLANG_RT_SUPPORTED_PROVIDERS}.")
+endif ()
+
+set(FLANG_RT_LIBCXX_PROVIDER "system" CACHE STRING "Specify C++ library to use. Supported values are ${FLANG_RT_SUPPORTED_PROVIDERS}.")
+if (NOT "${FLANG_RT_LIBCXX_PROVIDER}" IN_LIST FLANG_RT_SUPPORTED_PROVIDERS)
+  message(FATAL_ERROR "Unsupported library: '${FLANG_RT_LIBCXX_PROVIDER}'. Supported values are ${FLANG_RT_SUPPORTED_PROVIDERS}.")
+endif ()
 
 option(FLANG_RT_ENABLE_STATIC "Build Flang-RT as a static library." ON)
 if (WIN32)
@@ -244,6 +255,15 @@ check_cxx_compiler_flag("-UTESTFLAG" FLANG_RT_SUPPORTS_UNDEFINE_FLAG)
 # Check whether -fno-lto is supported.
 check_cxx_compiler_flag(-fno-lto FLANG_RT_HAS_FNO_LTO_FLAG)
 
+# Check whether -nostdlibinc is supported.
+check_cxx_compiler_flag(-nostdlibinc FLANG_RT_HAS_NOSTDLIBINC_FLAG)
+
+# Check whether -nostdlib is supported.
+check_cxx_compiler_flag(-nostdlib FLANG_RT_HAS_NOSTDLIB_FLAG)
+
+# Check whether -stdlib= is supported.
+check_cxx_compiler_flag(-stdlib=platform FLANG_RT_HAS_STDLIB_FLAG)
+
 # Check whether -Wl,--as-needed is supported.
 check_linker_flag(C "LINKER:--as-needed" LINKER_SUPPORTS_AS_NEEDED)
 if (LINKER_SUPPORTS_AS_NEEDED)
@@ -303,6 +323,8 @@ endif ()
 # Build Preparation #
 #####################
 
+include(HandleLibs)
+
 if (FLANG_RT_EXPERIMENTAL_OFFLOAD_SUPPORT AND FLANG_RT_INCLUDE_TESTS)
   # If Fortran runtime is built as CUDA library, the linking
   # of targets that link flang-rt must be done
diff --git a/flang-rt/cmake/modules/AddFlangRT.cmake b/flang-rt/cmake/modules/AddFlangRT.cmake
index 999128fcd55f0..39d0475b15326 100644
--- a/flang-rt/cmake/modules/AddFlangRT.cmake
+++ b/flang-rt/cmake/modules/AddFlangRT.cmake
@@ -139,9 +139,11 @@ function (add_flangrt_library name)
   endif ()
   if (build_static)
     add_library("${name_static}" STATIC ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
+    target_link_libraries("${name_static}" PRIVATE flang-rt-libcxx-headers flang-rt-libc-headers flang-rt-libc-static)
   endif ()
   if (build_shared)
     add_library("${name_shared}" SHARED ${extra_args} ${ARG_ADDITIONAL_HEADERS} ${ARG_UNPARSED_ARGUMENTS})
+    target_link_libraries("${name_static}" PRIVATE flang-rt-libcxx-headers flang-rt-libc-headers flang-rt-libc-shared)
     if (Threads_FOUND) 
       target_link_libraries(${name_shared} PUBLIC Threads::Threads)
     endif ()
diff --git a/flang-rt/cmake/modules/HandleLibs.cmake b/flang-rt/cmake/modules/HandleLibs.cmake
new file mode 100644
index 0000000000000..9987d6f668978
--- /dev/null
+++ b/flang-rt/cmake/modules/HandleLibs.cmake
@@ -0,0 +1,50 @@
+#===-- cmake/modules/HandleLibs.cmake --------------------------------------===#
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+#===------------------------------------------------------------------------===#
+
+# Select the C library to use for building flang-rt.
+if (FLANG_RT_LIBC_PROVIDER STREQUAL "system")
+  add_library(flang-rt-libc-headers INTERFACE)
+  add_library(flang-rt-libc-static INTERFACE)
+  add_library(flang-rt-libc-shared INTERFACE)
+elseif (FLANG_RT_LIBC_PROVIDER STREQUAL "llvm")
+  add_library(flang-rt-libc-headers INTERFACE)
+  target_link_libraries(flang-rt-libc-headers INTERFACE libc-headers)
+  if (FLANG_RT_HAS_NOSTDLIBINC_FLAG)
+    target_compile_options(flang-rt-libc-headers INTERFACE $<$<COMPILE_LANGUAGE:CXX,C>:-nostdlibinc>)
+  endif ()
+
+  add_library(flang-rt-libc-static INTERFACE)
+  if (TARGET libc)
+    target_link_libraries(flang-rt-libc-static INTERFACE libc)
+  endif ()
+  if (TARGET libm)
+    target_link_libraries(flang-rt-libc-static INTERFACE libm)
+  endif ()
+  if (FLANG_RT_HAS_NOSTDLIB_FLAG)
+    target_compile_options(flang-rt-libc-headers INTERFACE $<$<COMPILE_LANGUAGE:CXX,C>:-nostdlib>)
+  endif ()
+
+  # TODO: There's no support for building LLVM libc as a shared library yet.
+  add_library(flang-rt-libc-shared INTERFACE)
+endif ()
+
+# Select the C++ library to use for building flang-rt.
+if (FLANG_RT_LIBCXX_PROVIDER STREQUAL "system")
+  add_library(flang-rt-libcxx-headers INTERFACE)
+elseif (FLANG_RT_LIBCXX_PROVIDER STREQUAL "llvm")
+  add_library(flang-rt-libcxx-headers INTERFACE)
+  target_link_libraries(flang-rt-libcxx-headers INTERFACE cxx-headers)
+
+  if (CXX_SUPPORTS_NOSTDINCXX_FLAG)
+    target_compile_options(flang-rt-libc-headers INTERFACE $<$<COMPILE_LANGUAGE:CXX,C>:-nostdinc++>)
+  endif ()
+
+  if (FLANG_RT_HAS_STDLIB_FLAG)
+    target_compile_options(flang-rt-libc-headers INTERFACE $<$<COMPILE_LANGUAGE:CXX,C>:-stdlib=libc++>)
+  endif ()
+endif ()



More information about the llvm-commits mailing list