[libcxx-commits] [libcxx] [libc++] Remap headers in the debug info when building the library (PR #143004)

Louis Dionne via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jun 5 09:24:00 PDT 2025


https://github.com/ldionne created https://github.com/llvm/llvm-project/pull/143004

The libc++ build includes a step where headers are generated. This is required in order to preprocess some files such as the assertion handler and the __config_site header. As a result, the library is built against headers located inside the build directory, and the path to those headers is what's included in the debug information of the library.

However, these headers in the build directory are usually not persistent, which means that the debug information might end up referring to headers that don't exist anymore. To solve this problem, this patch uses the -fdebug-prefix-map flag supported by Clang and GCC to remap the generated headers to the original headers in the source directory. This provides the illusion that the library was truly built against the in-source version of the headers.

>From 379583c559668e659ca16ca40b08dd591caeb32d Mon Sep 17 00:00:00 2001
From: Louis Dionne <ldionne.2 at gmail.com>
Date: Thu, 5 Jun 2025 12:18:26 -0400
Subject: [PATCH] [libc++] Remap headers in the debug info when building the
 library

The libc++ build includes a step where headers are generated. This is
required in order to preprocess some files such as the assertion handler
and the __config_site header. As a result, the library is built against
headers located inside the build directory, and the path to those headers
is what's included in the debug information of the library.

However, these headers in the build directory are usually not persistent,
which means that the debug information might end up referring to headers
that don't exist anymore. To solve this problem, this patch uses the
-fdebug-prefix-map flag supported by Clang and GCC to remap the generated
headers to the original headers in the source directory. This provides
the illusion that the library was truly built against the in-source
version of the headers.
---
 libcxx/include/CMakeLists.txt | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/libcxx/include/CMakeLists.txt b/libcxx/include/CMakeLists.txt
index 43cefd5600646..52611e43968bc 100644
--- a/libcxx/include/CMakeLists.txt
+++ b/libcxx/include/CMakeLists.txt
@@ -1706,6 +1706,11 @@ add_dependencies(cxx-headers generate-cxx-headers)
 target_include_directories(cxx-headers INTERFACE ${LIBCXX_GENERATED_INCLUDE_TARGET_DIR}
                                                  ${LIBCXX_GENERATED_INCLUDE_DIR})
 
+# Make sure to map the generated include directory back to libc++'s actual source directory when generating
+# debug information. Otherwise, the debug information will refer to generated headers which are created during
+# the build and generally not persistent.
+target_add_compile_flags_if_supported(cxx-headers INTERFACE "-fdebug-prefix-map=${LIBCXX_GENERATED_INCLUDE_DIR}=${LIBCXX_SOURCE_DIR}/include")
+
 if (LIBCXX_INSTALL_HEADERS)
   foreach(file ${files})
     get_filename_component(dir ${file} DIRECTORY)



More information about the libcxx-commits mailing list