1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
#
# Copyright (c) 2018-2025, Intel Corporation
#
# SPDX-License-Identifier: BSD-3-Clause
#
# ispc Stdlib.cmake
#
function(write_stdlib_bitcode_lib name target os bit out_arch out_os)
determine_arch_and_os(${target} ${bit} ${os} fixed_arch fixed_os)
string(REPLACE "-" "_" target ${target})
file(APPEND ${CMAKE_BINARY_DIR}/bitcode_libs_generated.cpp
"static BitcodeLib ${name}(BitcodeLib::BitcodeLibType::Stdlib, \"${name}.bc\", ISPCTarget::${target}, TargetOS::${fixed_os}, Arch::${fixed_arch});\n")
if ("${fixed_os}" STREQUAL "linux" AND NOT ISPC_LINUX_TARGET)
# If ISPC_LINUX_TARGET is disabled then we can't run ispc-slim with
# --target-os=linux to generate stdlib bitcode. So we need pass the
# target-os that is supported by ispc-slim.
if (APPLE)
set(fixed_os "macos")
elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
set(fixed_os "freebsd")
endif()
endif()
set(${out_os} ${fixed_os} PARENT_SCOPE)
set(${out_arch} ${fixed_arch} PARENT_SCOPE)
endfunction()
function (stdlib_to_cpp ispc_name target bit os CPP_LIST BC_LIST)
set(name stdlib-${target}-${bit}bit-${os})
string(REPLACE "-" "_" name "${name}")
set(cpp ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}.cpp)
set(bc ${BITCODE_FOLDER}/${name}.bc)
if ("${os}" STREQUAL "unix" AND APPLE AND NOT ISPC_LINUX_TARGET)
# macOS target supports only x86_64 and aarch64
if ("${bit}" STREQUAL "32")
return()
endif()
# ISPC doesn't support avx512spr targets on macOS
if ("${target}" MATCHES "avx512spr" OR "${target}" MATCHES "avx10")
return()
endif()
endif()
if(target MATCHES "^avx10_[0-9]+")
# Replace the first underscore after "avx10" with a dot for file lookup
string(REGEX REPLACE "^(avx10)_([0-9]+)" "\\1.\\2" target_for_file "${target}")
else()
set(target_for_file "${target}")
endif()
# define canon_os and arch
write_stdlib_bitcode_lib(${name} ${target} ${os} ${bit} canon_arch canon_os)
set(SRC_INCLUDE_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/stdlib/include)
add_custom_command(
OUTPUT ${bc}
COMMAND ${ispc_name} -I ${SRC_INCLUDE_FOLDER} --nostdlib --gen-stdlib --target=${target_for_file} --arch=${canon_arch} --target-os=${canon_os} stdlib/stdlib.ispc --emit-llvm -o ${bc}
DEPENDS ${ispc_name} ${STDLIB_ISPC_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
string(TOUPPER ${os} OS_UP)
add_custom_command(
OUTPUT ${cpp}
COMMAND ${Python3_EXECUTABLE} ${BITCODE2CPP} ${bc} --type=stdlib --runtime=${bit} --os=${OS_UP} ${cpp}
DEPENDS ${BITCODE2CPP} ${bc}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
set(tmp_list_bc ${${BC_LIST}})
list(APPEND tmp_list_bc ${bc})
set(${BC_LIST} ${tmp_list_bc} PARENT_SCOPE)
set(tmp_list_cpp ${${CPP_LIST}})
list(APPEND tmp_list_cpp ${cpp})
set(${CPP_LIST} ${tmp_list_cpp} PARENT_SCOPE)
endfunction()
function (generate_stdlibs_1 ispc_name)
generate_stdlib_or_target_builtins(stdlib_to_cpp ${ispc_name} STDLIB_CPP_FILES STDLIB_BC_FILES)
set(STDLIB_BC_FILES ${STDLIB_BC_FILES} PARENT_SCOPE)
set(STDLIB_CPP_FILES ${STDLIB_CPP_FILES} PARENT_SCOPE)
endfunction()
function (stdlib_header_cpp name)
set(src ${INCLUDE_FOLDER}/stdlib/${header})
string(REPLACE "." "_" header ${header})
set(cpp ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${header}.cpp)
add_custom_command(
OUTPUT ${cpp}
COMMAND ${Python3_EXECUTABLE} ${BITCODE2CPP} ${src} --type=header ${cpp}
DEPENDS ${BITCODE2CPP} ${src}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
set(tmp_list ${STDLIB_HEADERS_CPP})
list(APPEND tmp_list ${cpp})
set(STDLIB_HEADERS_CPP ${tmp_list} PARENT_SCOPE)
endfunction()
function (stdlib_headers)
foreach (header ${STDLIB_HEADERS})
set(target_name stdlib-${header})
set(src ${CMAKE_SOURCE_DIR}/stdlib/include/${header})
set(dest ${INCLUDE_FOLDER}/stdlib/${header})
list(APPEND stdlib_headers_list ${dest})
add_custom_command(
OUTPUT ${dest}
DEPENDS ${src}
COMMAND ${CMAKE_COMMAND} -E copy ${src} ${dest})
stdlib_header_cpp(${header})
endforeach()
add_custom_target(stdlib-headers ALL DEPENDS ${stdlib_headers_list})
set(STDLIB_HEADERS_CPP ${STDLIB_HEADERS_CPP} PARENT_SCOPE)
endfunction()
function (generate_stdlibs ispc_name)
stdlib_headers()
add_custom_target(stdlib-headers-cpp DEPENDS ${STDLIB_HEADERS_CPP})
set_target_properties(stdlib-headers-cpp PROPERTIES SOURCE "${STDLIB_HEADERS_CPP}")
generate_stdlibs_1(${ispc_name})
add_custom_target(stdlibs-bc DEPENDS ${STDLIB_BC_FILES})
# TODO! stdlibs-cpp is kind of empty
add_custom_target(stdlibs-cpp DEPENDS stdlibs-bc)
set_target_properties(stdlibs-cpp PROPERTIES SOURCE "${STDLIB_CPP_FILES}")
add_library(stdlib OBJECT EXCLUDE_FROM_ALL ${STDLIB_CPP_FILES} ${STDLIB_HEADERS_CPP})
add_dependencies(stdlib stdlibs-cpp)
add_dependencies(stdlib stdlib-headers-cpp)
if (MSVC)
source_group("Generated Include Files" FILES ${STDLIB_HEADERS_CPP})
source_group("Generated Stdlib Files" FILES ${STDLIB_CPP_FILES})
endif()
set_source_files_properties(${STDLIB_HEADERS_CPP} PROPERTIES GENERATED true)
set_source_files_properties(${STDLIB_CPP_FILES} PROPERTIES GENERATED true)
endfunction()
|