[libclc] [libclc] Add LIBCLC_GENERATE_BITCODE option to skip bitcode/SPIR-V generation (PR #214150)
Wenju He via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 5 01:08:19 PDT 2026
https://github.com/wenju-he created https://github.com/llvm/llvm-project/pull/214150
This option allows to only build the static archive library if a target doesn't use bitcode files. This saves build time and unneeded archifacts.
>From b46cf45f364281cf0f884aeb4ebd0b4c07aebedc Mon Sep 17 00:00:00 2001
From: Wenju He <wenju.he at intel.com>
Date: Wed, 5 Aug 2026 09:57:45 +0200
Subject: [PATCH] [libclc] Add LIBCLC_GENERATE_BITCODE option to skip
bitcode/SPIR-V generation
This option allows to only build the static archive library if a target
doesn't use bitcode files. This saves build time and unneeded archifacts.
Co-authored-by: Claude Sonnet 5 <noreply at anthropic.com>
---
libclc/CMakeLists.txt | 18 ++--
libclc/cmake/modules/AddLibclc.cmake | 130 ++++++++++++++-------------
2 files changed, 79 insertions(+), 69 deletions(-)
diff --git a/libclc/CMakeLists.txt b/libclc/CMakeLists.txt
index 5829bd9b39eac..452b8430c5309 100644
--- a/libclc/CMakeLists.txt
+++ b/libclc/CMakeLists.txt
@@ -25,6 +25,8 @@ include( GNUInstallDirs )
set( LIBCLC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
+option(LIBCLC_GENERATE_BITCODE "Build and generate bitcode file" ON)
+
option(
LIBCLC_USE_SPIRV_BACKEND "Build SPIR-V targets with the SPIR-V backend." OFF
)
@@ -95,7 +97,7 @@ else()
)
endif()
-if( NOT LIBCLC_USE_SPIRV_BACKEND )
+if( LIBCLC_GENERATE_BITCODE AND NOT LIBCLC_USE_SPIRV_BACKEND )
# llvm-spirv is an optional dependency, used to build spirv-* targets when
# the SPIR-V backend hasn't been requested. It may be provided in-tree or
# externally.
@@ -118,17 +120,19 @@ elseif(LIBCLC_TARGET_ARCH IN_LIST LIBCLC_ARCHS_SPIRV)
set(LIBCLC_ARCH_DIR spirv)
endif()
-if(LIBCLC_TARGET_ARCH IN_LIST LIBCLC_ARCHS_SPIRV)
+if(LIBCLC_GENERATE_BITCODE AND LIBCLC_TARGET_ARCH IN_LIST LIBCLC_ARCHS_SPIRV)
if(NOT LIBCLC_TARGET_OS STREQUAL vulkan AND NOT LIBCLC_USE_SPIRV_BACKEND AND NOT llvm-spirv_exe)
message(FATAL_ERROR "SPIR-V backend or llvm-spirv is required for libclc ${LIBCLC_TARGET}")
endif()
endif()
-foreach( tool IN ITEMS opt llvm-link )
- if( NOT EXISTS "${${tool}_exe}" AND "${${tool}_target}" STREQUAL "" )
- message( FATAL_ERROR "libclc toolchain incomplete - missing tool ${tool}!" )
- endif()
-endforeach()
+if(LIBCLC_GENERATE_BITCODE)
+ foreach( tool IN ITEMS opt llvm-link )
+ if( NOT EXISTS "${${tool}_exe}" AND "${${tool}_target}" STREQUAL "" )
+ message( FATAL_ERROR "libclc toolchain incomplete - missing tool ${tool}!" )
+ endif()
+ endforeach()
+endif()
# Determine the clang target triple.
set(clang_triple ${LIBCLC_TARGET})
diff --git a/libclc/cmake/modules/AddLibclc.cmake b/libclc/cmake/modules/AddLibclc.cmake
index d84101f71d2f9..606bc8a3aae03 100644
--- a/libclc/cmake/modules/AddLibclc.cmake
+++ b/libclc/cmake/modules/AddLibclc.cmake
@@ -125,77 +125,83 @@ function(libclc_add_library target_name)
FOLDER "libclc/Device IR/Library"
)
- # Link the object files, using a temporary library for internalization.
- set(linked_bc ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.linked.bc)
- set(link_cmd ${llvm-link_exe})
- set(link_deps ${llvm-link_target})
-
- add_library(${target_name}-src STATIC)
- target_link_libraries(${target_name}-src PRIVATE ${ARG_SOURCE_TARGET})
- set_target_properties(${target_name}-src PROPERTIES
- FOLDER "libclc/Device IR/Library"
- )
- list(APPEND link_cmd $<TARGET_FILE:${target_name}-src>)
- list(APPEND link_deps ${target_name}-src)
-
- if(ARG_INTERNALIZE_LIBRARIES)
- list(APPEND link_cmd --internalize --only-needed)
- foreach(lib ${ARG_INTERNALIZE_LIBRARIES})
- add_library(${target_name}-${lib} STATIC)
- target_link_libraries(${target_name}-${lib} PRIVATE ${lib})
- set_target_properties(${target_name}-${lib} PROPERTIES
- FOLDER "libclc/Device IR/Library"
- )
- list(APPEND link_cmd $<TARGET_FILE:${target_name}-${lib}>)
- list(APPEND link_deps ${target_name}-${lib})
- endforeach()
- endif()
- list(APPEND link_cmd -o ${linked_bc})
+ set(install_files $<TARGET_FILE:${archive_target}>)
+ add_dependencies(${ARG_PARENT_TARGET} ${archive_target})
+
+ if(LIBCLC_GENERATE_BITCODE)
+ # Link the object files, using a temporary library for internalization.
+ set(linked_bc ${CMAKE_CURRENT_BINARY_DIR}/${target_name}.linked.bc)
+ set(link_cmd ${llvm-link_exe})
+ set(link_deps ${llvm-link_target})
+
+ add_library(${target_name}-src STATIC)
+ target_link_libraries(${target_name}-src PRIVATE ${ARG_SOURCE_TARGET})
+ set_target_properties(${target_name}-src PROPERTIES
+ FOLDER "libclc/Device IR/Library"
+ )
+ list(APPEND link_cmd $<TARGET_FILE:${target_name}-src>)
+ list(APPEND link_deps ${target_name}-src)
+
+ if(ARG_INTERNALIZE_LIBRARIES)
+ list(APPEND link_cmd --internalize --only-needed)
+ foreach(lib ${ARG_INTERNALIZE_LIBRARIES})
+ add_library(${target_name}-${lib} STATIC)
+ target_link_libraries(${target_name}-${lib} PRIVATE ${lib})
+ set_target_properties(${target_name}-${lib} PROPERTIES
+ FOLDER "libclc/Device IR/Library"
+ )
+ list(APPEND link_cmd $<TARGET_FILE:${target_name}-${lib}>)
+ list(APPEND link_deps ${target_name}-${lib})
+ endforeach()
+ endif()
+ list(APPEND link_cmd -o ${linked_bc})
- add_custom_command(OUTPUT ${linked_bc}
- COMMAND ${link_cmd}
- DEPENDS ${link_deps}
- )
+ add_custom_command(OUTPUT ${linked_bc}
+ COMMAND ${link_cmd}
+ DEPENDS ${link_deps}
+ )
- string(REPLACE "-" ";" triple_parts "${ARG_TRIPLE}")
- list(GET triple_parts 2 triple_os)
- if(ARG_ARCH IN_LIST LIBCLC_ARCHS_SPIRV AND NOT triple_os STREQUAL vulkan)
- # SPIR-V targets produce a .spv file from the linked bitcode.
- set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.spv)
- if(LIBCLC_USE_SPIRV_BACKEND)
- add_custom_command(OUTPUT ${builtins_lib}
- COMMAND ${CMAKE_CLC_COMPILER} -c --target=${ARG_TRIPLE}
- -mllvm --spirv-ext=+SPV_KHR_fma
- -x ir -o ${builtins_lib} ${linked_bc}
- DEPENDS ${linked_bc}
- )
+ string(REPLACE "-" ";" triple_parts "${ARG_TRIPLE}")
+ list(GET triple_parts 2 triple_os)
+ if(ARG_ARCH IN_LIST LIBCLC_ARCHS_SPIRV AND NOT triple_os STREQUAL vulkan)
+ # SPIR-V targets produce a .spv file from the linked bitcode.
+ set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.spv)
+ if(LIBCLC_USE_SPIRV_BACKEND)
+ add_custom_command(OUTPUT ${builtins_lib}
+ COMMAND ${CMAKE_CLC_COMPILER} -c --target=${ARG_TRIPLE}
+ -mllvm --spirv-ext=+SPV_KHR_fma
+ -x ir -o ${builtins_lib} ${linked_bc}
+ DEPENDS ${linked_bc}
+ )
+ else()
+ add_custom_command(OUTPUT ${builtins_lib}
+ COMMAND ${llvm-spirv_exe}
+ --spirv-max-version=1.1
+ --spirv-ext=+SPV_KHR_fma
+ -o ${builtins_lib} ${linked_bc}
+ DEPENDS ${linked_bc}
+ )
+ endif()
else()
+ # All other targets produce an optimized .bc file.
+ set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.bc)
add_custom_command(OUTPUT ${builtins_lib}
- COMMAND ${llvm-spirv_exe}
- --spirv-max-version=1.1
- --spirv-ext=+SPV_KHR_fma
- -o ${builtins_lib} ${linked_bc}
- DEPENDS ${linked_bc}
+ COMMAND ${opt_exe} ${ARG_OPT_FLAGS} -o ${builtins_lib} ${linked_bc}
+ DEPENDS ${opt_target} ${linked_bc}
)
endif()
- else()
- # All other targets produce an optimized .bc file.
- set(builtins_lib ${library_dir}/${ARG_OUTPUT_FILENAME}.bc)
- add_custom_command(OUTPUT ${builtins_lib}
- COMMAND ${opt_exe} ${ARG_OPT_FLAGS} -o ${builtins_lib} ${linked_bc}
- DEPENDS ${opt_target} ${linked_bc}
- )
- endif()
- add_custom_target(${target_name} ALL DEPENDS ${builtins_lib})
- set_target_properties(${target_name} PROPERTIES
- TARGET_FILE ${builtins_lib}
- FOLDER "libclc/Device IR/Library"
- )
+ add_custom_target(${target_name} ALL DEPENDS ${builtins_lib})
+ set_target_properties(${target_name} PROPERTIES
+ TARGET_FILE ${builtins_lib}
+ FOLDER "libclc/Device IR/Library"
+ )
- add_dependencies(${ARG_PARENT_TARGET} ${target_name} ${archive_target})
+ add_dependencies(${ARG_PARENT_TARGET} ${target_name})
+ list(APPEND install_files ${builtins_lib})
+ endif()
- install(FILES ${builtins_lib} $<TARGET_FILE:${archive_target}>
+ install(FILES ${install_files}
DESTINATION ${LIBCLC_INSTALL_DIR}/${ARG_TARGET_TRIPLE}
COMPONENT ${ARG_PARENT_TARGET}
)
More information about the cfe-commits
mailing list