[libc-commits] [libc] [libc] Add baremetal minor archive support. (PR #203015)
Simi Pallipurath via libc-commits
libc-commits at lists.llvm.org
Wed Oct 7 03:33:30 PDT 2026
https://github.com/simpal01 updated https://github.com/llvm/llvm-project/pull/203015
>From 4ed252a2f301a3aeee4bb7de19b965f7c97b3cc2 Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Wed, 10 Jun 2026 13:10:15 +0100
Subject: [PATCH 1/4] [libc] Add baremetal minor archive support.
This adds support for building a minor LLVM
libc archive on baremetal targets, such as libllvmstring.a,
from only the entrypoints under a requested libc subdirectory.
When ENABLE_LLVM_LIBC_MINOR_VARIANT is enabled, the libc
archive build now:
1. Requires a baremetal target.
2. Requires LLVM_LIBC_SUBARCHIVE_NAME to be set.
3. Selects only entrypoints matching that subarchive name, for example libc.src.<name>.*.
4. Builds and installs an archive using the requested name.
5. Avoids installing baremetal startup objects for minor archive builds.
This lets a minor variant provide only one category of
libc routines instead of duplicating a full libc.a.
Assisted-by: codex, reviewed and cross checked, also tested with ATfE,
by me.
---
libc/lib/CMakeLists.txt | 62 +++++++++++++++++++++++----
libc/startup/baremetal/CMakeLists.txt | 10 +++--
2 files changed, 60 insertions(+), 12 deletions(-)
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index 0d8e7424e62478..5998deb4b1079c 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -1,15 +1,40 @@
+set(libc_subarchive_entrypoints "")
+if(ENABLE_LLVM_LIBC_MINOR_VARIANT)
+ if(NOT LIBC_TARGET_OS_IS_BAREMETAL)
+ message(FATAL_ERROR
+ "ENABLE_LLVM_LIBC_MINOR_VARIANT is only supported on baremetal targets.")
+ endif()
+ if(NOT LLVM_LIBC_SUBARCHIVE_NAME)
+ message(FATAL_ERROR
+ "ENABLE_LLVM_LIBC_MINOR_VARIANT requires LLVM_LIBC_SUBARCHIVE_NAME to be set.")
+ endif()
+endif()
+
set(libc_archive_targets "")
set(libc_archive_names "")
set(libc_archive_entrypoint_lists "")
-if(LLVM_LIBC_FULL_BUILD)
- list(APPEND libc_archive_names c m mvec)
- list(APPEND libc_archive_targets libc libm libmvec)
- list(APPEND libc_archive_entrypoint_lists
- TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS TARGET_LIBMVEC_ENTRYPOINTS)
+if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
+ if(LLVM_LIBC_FULL_BUILD)
+ list(APPEND libc_archive_names c m mvec)
+ list(APPEND libc_archive_targets libc libm libmvec)
+ list(APPEND libc_archive_entrypoint_lists
+ TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS TARGET_LIBMVEC_ENTRYPOINTS)
+ else()
+ list(APPEND libc_archive_names llvmlibc)
+ list(APPEND libc_archive_targets libc)
+ list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
+ endif()
else()
- list(APPEND libc_archive_names llvmlibc)
- list(APPEND libc_archive_targets libc)
- list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
+ foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
+ if(entrypoint MATCHES "^libc\\.src\\.${LLVM_LIBC_SUBARCHIVE_NAME}\\.")
+ list(APPEND libc_subarchive_entrypoints ${entrypoint})
+ endif()
+ endforeach()
+ if(NOT libc_subarchive_entrypoints)
+ message(FATAL_ERROR
+ "ENABLE_LLVM_LIBC_MINOR_VARIANT requires matching entrypoints for "
+ "'${LLVM_LIBC_SUBARCHIVE_NAME}'.")
+ endif()
endif()
set(added_archive_targets "")
@@ -56,6 +81,27 @@ foreach(archive IN ZIP_LISTS
endif()
endforeach()
+if(libc_subarchive_entrypoints)
+ add_entrypoint_library(
+ ${LLVM_LIBC_SUBARCHIVE_NAME}
+ DEPENDS
+ ${libc_subarchive_entrypoints}
+ )
+ set_target_properties(
+ ${LLVM_LIBC_SUBARCHIVE_NAME}
+ PROPERTIES
+ PREFIX ""
+ ARCHIVE_OUTPUT_NAME llvm${LLVM_LIBC_SUBARCHIVE_NAME}
+ )
+ if(LLVM_LIBC_FULL_BUILD)
+ target_link_libraries(${LLVM_LIBC_SUBARCHIVE_NAME} PUBLIC libc-headers)
+ if(TARGET libc-startup)
+ add_dependencies(${LLVM_LIBC_SUBARCHIVE_NAME} libc-startup)
+ endif()
+ endif()
+ list(APPEND added_archive_targets ${LLVM_LIBC_SUBARCHIVE_NAME})
+endif()
+
install(
TARGETS ${added_archive_targets}
ARCHIVE DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
diff --git a/libc/startup/baremetal/CMakeLists.txt b/libc/startup/baremetal/CMakeLists.txt
index 2b46b79054426e..b6f9a004ccf748 100644
--- a/libc/startup/baremetal/CMakeLists.txt
+++ b/libc/startup/baremetal/CMakeLists.txt
@@ -69,7 +69,9 @@ add_custom_target(libc-startup)
set(fq_target_name libc.startup.baremetal.${LIBC_TARGET_ARCHITECTURE}.crt1)
add_dependencies(libc-startup ${fq_target_name})
-install(FILES $<TARGET_OBJECTS:${fq_target_name}>
- DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
- RENAME $<TARGET_PROPERTY:${fq_target_name},OUTPUT_NAME>
- COMPONENT libc)
+if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
+ install(FILES $<TARGET_OBJECTS:${fq_target_name}>
+ DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
+ RENAME $<TARGET_PROPERTY:${fq_target_name},OUTPUT_NAME>
+ COMPONENT libc)
+endif()
>From 2b12792f14497e19b0a4d8ec5ba25750453114ae Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Thu, 11 Jun 2026 10:42:34 +0100
Subject: [PATCH 2/4] fixup! [libc] Add baremetal minor archive support.
1. Renamed ENABLE_LLVM_LIBC_MINOR_VARIANT to LLVM_LIBC_ENABLE_MINOR_VARIANT
2. Ordered the if else condition so that positove case comes first.
3. Removed baremetal targets restriction for this functionality.
4. Added LLVM_LIBC_ENABLE_MINOR_VARIANT as an opton in CMake.
---
libc/CMakeLists.txt | 2 ++
libc/lib/CMakeLists.txt | 32 ++++++++++++---------------
libc/startup/baremetal/CMakeLists.txt | 2 +-
3 files changed, 17 insertions(+), 19 deletions(-)
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index f44a84d5ae48a4..d169dc2e032eb9 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -267,6 +267,8 @@ option(LLVM_LIBC_ENABLE_LINTING "Enables linting of libc source files" OFF)
option(LLVM_LIBC_ALL_HEADERS "Outputs all functions in header files, regardless of whether they are enabled on this target" OFF)
option(LLVM_LIBC_ENABLE_EXPERIMENTAL_ENTRYPOINTS
"Enable entrypoints with known-incomplete implementations (off by default)" OFF)
+option(LLVM_LIBC_ENABLE_MINOR_VARIANT
+ "Build LLVM libc minor variant archive" OFF)
option(LIBC_CONFIG_PATH "The path to user provided folder that configures the build for the target system." OFF)
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index 5998deb4b1079c..8e0621a22ec37c 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -1,19 +1,26 @@
set(libc_subarchive_entrypoints "")
-if(ENABLE_LLVM_LIBC_MINOR_VARIANT)
- if(NOT LIBC_TARGET_OS_IS_BAREMETAL)
- message(FATAL_ERROR
- "ENABLE_LLVM_LIBC_MINOR_VARIANT is only supported on baremetal targets.")
- endif()
+if(LLVM_LIBC_ENABLE_MINOR_VARIANT)
if(NOT LLVM_LIBC_SUBARCHIVE_NAME)
message(FATAL_ERROR
- "ENABLE_LLVM_LIBC_MINOR_VARIANT requires LLVM_LIBC_SUBARCHIVE_NAME to be set.")
+ "LLVM_LIBC_ENABLE_MINOR_VARIANT requires LLVM_LIBC_SUBARCHIVE_NAME to be set.")
endif()
endif()
set(libc_archive_targets "")
set(libc_archive_names "")
set(libc_archive_entrypoint_lists "")
-if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
+if(LLVM_LIBC_ENABLE_MINOR_VARIANT)
+ foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
+ if(entrypoint MATCHES "^libc\\.src\\.${LLVM_LIBC_SUBARCHIVE_NAME}\\.")
+ list(APPEND libc_subarchive_entrypoints ${entrypoint})
+ endif()
+ endforeach()
+ if(NOT libc_subarchive_entrypoints)
+ message(FATAL_ERROR
+ "LLVM_LIBC_ENABLE_MINOR_VARIANT requires matching entrypoints for "
+ "'${LLVM_LIBC_SUBARCHIVE_NAME}'.")
+ endif()
+else()
if(LLVM_LIBC_FULL_BUILD)
list(APPEND libc_archive_names c m mvec)
list(APPEND libc_archive_targets libc libm libmvec)
@@ -24,17 +31,6 @@ if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
list(APPEND libc_archive_targets libc)
list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
endif()
-else()
- foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
- if(entrypoint MATCHES "^libc\\.src\\.${LLVM_LIBC_SUBARCHIVE_NAME}\\.")
- list(APPEND libc_subarchive_entrypoints ${entrypoint})
- endif()
- endforeach()
- if(NOT libc_subarchive_entrypoints)
- message(FATAL_ERROR
- "ENABLE_LLVM_LIBC_MINOR_VARIANT requires matching entrypoints for "
- "'${LLVM_LIBC_SUBARCHIVE_NAME}'.")
- endif()
endif()
set(added_archive_targets "")
diff --git a/libc/startup/baremetal/CMakeLists.txt b/libc/startup/baremetal/CMakeLists.txt
index b6f9a004ccf748..d186b65688c809 100644
--- a/libc/startup/baremetal/CMakeLists.txt
+++ b/libc/startup/baremetal/CMakeLists.txt
@@ -69,7 +69,7 @@ add_custom_target(libc-startup)
set(fq_target_name libc.startup.baremetal.${LIBC_TARGET_ARCHITECTURE}.crt1)
add_dependencies(libc-startup ${fq_target_name})
-if(NOT ENABLE_LLVM_LIBC_MINOR_VARIANT)
+if(NOT LLVM_LIBC_ENABLE_MINOR_VARIANT)
install(FILES $<TARGET_OBJECTS:${fq_target_name}>
DESTINATION ${LIBC_INSTALL_LIBRARY_DIR}
RENAME $<TARGET_PROPERTY:${fq_target_name},OUTPUT_NAME>
>From 194547f7c960daed75d1b529111c818fbab46b7e Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Thu, 1 Oct 2026 10:46:11 +0100
Subject: [PATCH 3/4] fixup! [libc] Add baremetal minor archive support.
Also add a CMake cache variable for specifying the
minor archive entrypoints.
Previously, entrypoints were selected by filtering
all enabled entrypoints using the subarchive name.
Accepting an explicit entrypoint list provides
more flexibility and allows the minor archive to
contain only the required routines.
Validate that every requested entrypoint is enabled by
the target's entrypoints.txt configuration.
---
libc/CMakeLists.txt | 4 ++++
libc/lib/CMakeLists.txt | 26 +++++++++++++-------------
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt
index d169dc2e032eb9..400375002abc08 100644
--- a/libc/CMakeLists.txt
+++ b/libc/CMakeLists.txt
@@ -269,6 +269,10 @@ option(LLVM_LIBC_ENABLE_EXPERIMENTAL_ENTRYPOINTS
"Enable entrypoints with known-incomplete implementations (off by default)" OFF)
option(LLVM_LIBC_ENABLE_MINOR_VARIANT
"Build LLVM libc minor variant archive" OFF)
+set(LLVM_LIBC_SUBARCHIVE_NAME "" CACHE STRING
+ "Target and archive name for the LLVM libc minor variant")
+set(LLVM_LIBC_SUBARCHIVE_ENTRYPOINTS "" CACHE STRING
+ "Semicolon-separated entrypoint targets for the LLVM libc minor variant")
option(LIBC_CONFIG_PATH "The path to user provided folder that configures the build for the target system." OFF)
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index 8e0621a22ec37c..61eeecb600bb40 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -2,7 +2,12 @@ set(libc_subarchive_entrypoints "")
if(LLVM_LIBC_ENABLE_MINOR_VARIANT)
if(NOT LLVM_LIBC_SUBARCHIVE_NAME)
message(FATAL_ERROR
- "LLVM_LIBC_ENABLE_MINOR_VARIANT requires LLVM_LIBC_SUBARCHIVE_NAME to be set.")
+ "LLVM_LIBC_ENABLE_MINOR_VARIANT requires LLVM_LIBC_SUBARCHIVE_NAME to be set.")
+ endif()
+ if(NOT LLVM_LIBC_SUBARCHIVE_ENTRYPOINTS)
+ message(FATAL_ERROR
+ "LLVM_LIBC_ENABLE_MINOR_VARIANT requires "
+ "LLVM_LIBC_SUBARCHIVE_ENTRYPOINTS to be set.")
endif()
endif()
@@ -10,18 +15,15 @@ set(libc_archive_targets "")
set(libc_archive_names "")
set(libc_archive_entrypoint_lists "")
if(LLVM_LIBC_ENABLE_MINOR_VARIANT)
- foreach(entrypoint IN LISTS TARGET_LLVMLIBC_ENTRYPOINTS)
- if(entrypoint MATCHES "^libc\\.src\\.${LLVM_LIBC_SUBARCHIVE_NAME}\\.")
- list(APPEND libc_subarchive_entrypoints ${entrypoint})
+ foreach(entrypoint IN LISTS LLVM_LIBC_SUBARCHIVE_ENTRYPOINTS)
+ if(NOT entrypoint IN_LIST TARGET_LLVMLIBC_ENTRYPOINTS)
+ message(FATAL_ERROR
+ "LLVM_LIBC_SUBARCHIVE_ENTRYPOINTS contains '${entrypoint}', which is "
+ "not enabled by the target's entrypoints.txt configuration.")
endif()
+ list(APPEND libc_subarchive_entrypoints "${entrypoint}")
endforeach()
- if(NOT libc_subarchive_entrypoints)
- message(FATAL_ERROR
- "LLVM_LIBC_ENABLE_MINOR_VARIANT requires matching entrypoints for "
- "'${LLVM_LIBC_SUBARCHIVE_NAME}'.")
- endif()
-else()
- if(LLVM_LIBC_FULL_BUILD)
+elseif(LLVM_LIBC_FULL_BUILD)
list(APPEND libc_archive_names c m mvec)
list(APPEND libc_archive_targets libc libm libmvec)
list(APPEND libc_archive_entrypoint_lists
@@ -31,7 +33,6 @@ else()
list(APPEND libc_archive_targets libc)
list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
endif()
-endif()
set(added_archive_targets "")
set(added_bitcode_targets "")
@@ -86,7 +87,6 @@ if(libc_subarchive_entrypoints)
set_target_properties(
${LLVM_LIBC_SUBARCHIVE_NAME}
PROPERTIES
- PREFIX ""
ARCHIVE_OUTPUT_NAME llvm${LLVM_LIBC_SUBARCHIVE_NAME}
)
if(LLVM_LIBC_FULL_BUILD)
>From db231c4143d8ba1151ed611ea8f5683db973b65e Mon Sep 17 00:00:00 2001
From: Simi Pallipurath <simi.pallipurath at arm.com>
Date: Thu, 1 Oct 2026 11:06:23 +0100
Subject: [PATCH 4/4] fixup! fixup! [libc] Add baremetal minor archive support.
Fixing just the indentation.
t
---
libc/lib/CMakeLists.txt | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/libc/lib/CMakeLists.txt b/libc/lib/CMakeLists.txt
index 61eeecb600bb40..b244a8f7667561 100644
--- a/libc/lib/CMakeLists.txt
+++ b/libc/lib/CMakeLists.txt
@@ -24,15 +24,15 @@ if(LLVM_LIBC_ENABLE_MINOR_VARIANT)
list(APPEND libc_subarchive_entrypoints "${entrypoint}")
endforeach()
elseif(LLVM_LIBC_FULL_BUILD)
- list(APPEND libc_archive_names c m mvec)
- list(APPEND libc_archive_targets libc libm libmvec)
- list(APPEND libc_archive_entrypoint_lists
- TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS TARGET_LIBMVEC_ENTRYPOINTS)
- else()
- list(APPEND libc_archive_names llvmlibc)
- list(APPEND libc_archive_targets libc)
- list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
- endif()
+ list(APPEND libc_archive_names c m mvec)
+ list(APPEND libc_archive_targets libc libm libmvec)
+ list(APPEND libc_archive_entrypoint_lists
+ TARGET_LIBC_ENTRYPOINTS TARGET_LIBM_ENTRYPOINTS TARGET_LIBMVEC_ENTRYPOINTS)
+else()
+ list(APPEND libc_archive_names llvmlibc)
+ list(APPEND libc_archive_targets libc)
+ list(APPEND libc_archive_entrypoint_lists TARGET_LLVMLIBC_ENTRYPOINTS)
+endif()
set(added_archive_targets "")
set(added_bitcode_targets "")
More information about the libc-commits
mailing list