Summary: This patch rewrites the `llvm-gpu-loader` utility to use the LLVMOffload interface. This heavily simplifies it while re-using the already existing support. Another benefit is that I can now easily do this dynamically so we can always build this utility without needing to find non-standard packages. One issue is mentioned in https://github.com/llvm/llvm-project/issues/159636 where this will now take extra time if you have both installed on the same machine. This is just slightly annoying since most people don't have both CUDA and ROCm at the same time so I don't consider it a blocker. I will work later to address it. Slightly unfortunate environment variable usage, I will also expose that better in the future. Fixes: https://github.com/llvm/llvm-project/issues/132890
67 lines
2.0 KiB
CMake
67 lines
2.0 KiB
CMake
function(add_startup_object name)
|
|
cmake_parse_arguments(
|
|
"ADD_STARTUP_OBJECT"
|
|
"ALIAS" # Option argument
|
|
"SRC" # Single value arguments
|
|
"DEPENDS;COMPILE_OPTIONS" # Multi value arguments
|
|
${ARGN}
|
|
)
|
|
|
|
get_fq_target_name(${name} fq_target_name)
|
|
if(ADD_STARTUP_OBJECT_ALIAS)
|
|
get_fq_deps_list(fq_dep_list ${ADD_STARTUP_OBJECT_DEPENDS})
|
|
add_library(${fq_target_name} ALIAS ${fq_dep_list})
|
|
return()
|
|
endif()
|
|
|
|
add_object_library(
|
|
${name}
|
|
SRCS ${ADD_STARTUP_OBJECT_SRC}
|
|
COMPILE_OPTIONS ${ADD_STARTUP_OBJECT_COMPILE_OPTIONS}
|
|
${ADD_STARTUP_OBJECT_UNPARSED_ARGUMENTS}
|
|
DEPENDS ${ADD_STARTUP_OBJECT_DEPENDS}
|
|
)
|
|
set_target_properties(
|
|
${fq_target_name}
|
|
PROPERTIES
|
|
OUTPUT_NAME ${name}.o
|
|
)
|
|
|
|
# Make an executable target of relocatable bitcode for clang if needed.
|
|
if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR)
|
|
add_executable(${fq_target_name}.exe $<TARGET_OBJECTS:${fq_target_name}>)
|
|
set_target_properties(${fq_target_name}.exe PROPERTIES
|
|
RUNTIME_OUTPUT_DIRECTORY ${LIBC_LIBRARY_DIR}
|
|
RUNTIME_OUTPUT_NAME ${name}.o)
|
|
target_link_options(${fq_target_name}.exe PRIVATE
|
|
${LIBC_COMPILE_OPTIONS_DEFAULT}
|
|
"-r" "-nostdlib" "-flto" "-Wl,--lto-emit-llvm")
|
|
endif()
|
|
endfunction()
|
|
|
|
add_startup_object(
|
|
crt1
|
|
SRC
|
|
start.cpp
|
|
DEPENDS
|
|
libc.config.app_h
|
|
libc.src.__support.RPC.rpc_client
|
|
libc.src.__support.GPU.utils
|
|
libc.src.stdlib.exit
|
|
libc.src.stdlib.atexit
|
|
COMPILE_OPTIONS
|
|
-ffreestanding # To avoid compiler warnings about calling the main function.
|
|
-fno-builtin
|
|
)
|
|
|
|
add_custom_target(libc-startup)
|
|
set(startup_components crt1)
|
|
foreach(target IN LISTS startup_components)
|
|
set(fq_target_name libc.startup.gpu.${target})
|
|
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)
|
|
endforeach()
|