Skip to content

Commit 183b38e

Browse files
committed
[libclc] Split off library build system into helpers
This splits off several key parts of the build system into utility methods. This will be used in upcoming patches to help provide additional sets of target-specific builtin libraries. Running llvm-diff on the resulting LLVM bytecode binaries, and regular diff on SPIR-V binaries, shows no differences before and after this patch.
1 parent 88e23eb commit 183b38e

File tree

2 files changed

+230
-147
lines changed

2 files changed

+230
-147
lines changed

libclc/CMakeLists.txt

Lines changed: 25 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -278,49 +278,22 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
278278
set( DARCH ${ARCH} )
279279
endif()
280280

281-
# Enumerate SOURCES* files
282-
set( source_list )
283-
foreach( l ${dirs} ${DARCH} ${DARCH}-${OS} ${DARCH}-${VENDOR}-${OS} )
284-
foreach( s "SOURCES" "SOURCES_${LLVM_MAJOR}.${LLVM_MINOR}" )
285-
file( TO_CMAKE_PATH ${l}/lib/${s} file_loc )
286-
file( TO_CMAKE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${file_loc} loc )
287-
# Prepend the location to give higher priority to
288-
# specialized implementation
289-
if( EXISTS ${loc} )
290-
set( source_list ${file_loc} ${source_list} )
291-
endif()
292-
endforeach()
293-
endforeach()
294-
295-
# Add the generated convert.cl here to prevent adding the one listed in
296-
# SOURCES
297-
set( objects ) # A "set" of already-added input files
298-
set( rel_files ) # Source directory input files, relative to the root dir
299-
set( gen_files ) # Generated binary input files, relative to the binary dir
300-
if( NOT ${ARCH} STREQUAL "spirv" AND NOT ${ARCH} STREQUAL "spirv64" )
301-
if( NOT ENABLE_RUNTIME_SUBNORMAL AND NOT ${ARCH} STREQUAL "clspv" AND
302-
NOT ${ARCH} STREQUAL "clspv64" )
303-
list( APPEND gen_files convert.cl )
304-
list( APPEND objects convert.cl )
305-
list( APPEND rel_files generic/lib/subnormal_use_default.ll )
306-
elseif(${ARCH} STREQUAL "clspv" OR ${ARCH} STREQUAL "clspv64")
307-
list( APPEND gen_files clspv-convert.cl )
308-
list( APPEND objects clspv-convert.cl )
281+
set( opencl_lib_files )
282+
set( opencl_gen_files )
283+
284+
if( NOT ARCH STREQUAL spirv AND NOT ARCH STREQUAL spirv64 )
285+
if( ARCH STREQUAL clspv OR ARCH STREQUAL clspv64 )
286+
list( APPEND opencl_gen_files clspv-convert.cl )
287+
elseif ( NOT ENABLE_RUNTIME_SUBNORMAL )
288+
list( APPEND opencl_gen_files convert.cl )
289+
list( APPEND opencl_lib_files generic/lib/subnormal_use_default.ll )
309290
endif()
310291
endif()
311292

312-
foreach( l ${source_list} )
313-
file( READ ${l} file_list )
314-
string( REPLACE "\n" ";" file_list ${file_list} )
315-
get_filename_component( dir ${l} DIRECTORY )
316-
foreach( f ${file_list} )
317-
# Only add each file once, so that targets can 'specialize' builtins
318-
if( NOT ${f} IN_LIST objects )
319-
list( APPEND objects ${f} )
320-
list( APPEND rel_files ${dir}/${f} )
321-
endif()
322-
endforeach()
323-
endforeach()
293+
libclc_configure_lib_source(
294+
opencl_lib_files
295+
DIRS ${dirs} ${DARCH} ${DARCH}-${OS} ${DARCH}-${VENDOR}-${OS}
296+
)
324297

325298
foreach( d ${${t}_devices} )
326299
get_libclc_device_info(
@@ -331,11 +304,6 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
331304
CLANG_TRIPLE clang_triple
332305
)
333306

334-
set( mcpu )
335-
if( NOT "${cpu}" STREQUAL "" )
336-
set( mcpu "-mcpu=${cpu}" )
337-
endif()
338-
339307
message( STATUS " device: ${d} ( ${${d}_aliases} )" )
340308

341309
if ( ARCH STREQUAL spirv OR ARCH STREQUAL spirv64 )
@@ -363,109 +331,19 @@ foreach( t ${LIBCLC_TARGETS_TO_BUILD} )
363331
-Wno-bitwise-conditional-parentheses
364332
)
365333

366-
set( bytecode_files "" )
367-
foreach( file IN LISTS gen_files rel_files )
368-
# We need to take each file and produce an absolute input file, as well
369-
# as a unique architecture-specific output file. We deal with a mix of
370-
# different input files, which makes this trickier.
371-
if( ${file} IN_LIST gen_files )
372-
# Generated files are given just as file names, which we must make
373-
# absolute to the binary directory.
374-
set( input_file ${CMAKE_CURRENT_BINARY_DIR}/${file} )
375-
set( output_file "${LIBCLC_ARCH_OBJFILE_DIR}/${file}.bc" )
376-
else()
377-
# Other files are originally relative to each SOURCE file, which are
378-
# then make relative to the libclc root directory. We must normalize
379-
# the path (e.g., ironing out any ".."), then make it relative to the
380-
# root directory again, and use that relative path component for the
381-
# binary path.
382-
get_filename_component( abs_path ${file} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR} )
383-
file( RELATIVE_PATH root_rel_path ${CMAKE_CURRENT_SOURCE_DIR} ${abs_path} )
384-
set( input_file ${CMAKE_CURRENT_SOURCE_DIR}/${file} )
385-
set( output_file "${LIBCLC_ARCH_OBJFILE_DIR}/${root_rel_path}.bc" )
386-
endif()
387-
388-
get_filename_component( file_dir ${file} DIRECTORY )
389-
390-
compile_to_bc(
391-
TRIPLE ${clang_triple}
392-
INPUT ${input_file}
393-
OUTPUT ${output_file}
394-
EXTRA_OPTS "${mcpu}" -fno-builtin -nostdlib
395-
"${build_flags}" -I${CMAKE_CURRENT_SOURCE_DIR}/${file_dir}
396-
DEPENDENCIES generate_convert.cl clspv-generate_convert.cl
397-
)
398-
list( APPEND bytecode_files ${output_file} )
399-
endforeach()
400-
401-
set( builtins_comp_lib_tgt builtins.comp.${arch_suffix} )
402-
add_custom_target( ${builtins_comp_lib_tgt}
403-
DEPENDS ${bytecode_files}
404-
)
405-
set_target_properties( ${builtins_comp_lib_tgt} PROPERTIES FOLDER "libclc/Device IR/Comp" )
334+
if( NOT "${cpu}" STREQUAL "" )
335+
list( APPEND build_flags -mcpu=${cpu} )
336+
endif()
406337

407-
set( builtins_link_lib_tgt builtins.link.${arch_suffix} )
408-
link_bc(
409-
TARGET ${builtins_link_lib_tgt}
410-
INPUTS ${bytecode_files}
411-
DEPENDENCIES ${builtins_comp_lib_tgt}
338+
add_libclc_builtin_set(
339+
ARCH ${ARCH}
340+
ARCH_SUFFIX ${arch_suffix}
341+
TRIPLE ${clang_triple}
342+
COMPILE_FLAGS ${build_flags}
343+
OPT_FLAGS ${opt_flags}
344+
LIB_FILES ${opencl_lib_files}
345+
GEN_FILES ${opencl_gen_files}
346+
ALIASES ${${d}_aliases}
412347
)
413-
414-
set( builtins_link_lib $<TARGET_PROPERTY:${builtins_link_lib_tgt},TARGET_FILE> )
415-
416-
if( ARCH STREQUAL spirv OR ARCH STREQUAL spirv64 )
417-
set( spv_suffix ${arch_suffix}.spv )
418-
add_custom_command( OUTPUT ${spv_suffix}
419-
COMMAND ${llvm-spirv_exe} ${spvflags} -o ${spv_suffix} ${builtins_link_lib}
420-
DEPENDS ${llvm-spirv_target} ${builtins_link_lib} ${builtins_link_lib_tgt}
421-
)
422-
add_custom_target( "prepare-${spv_suffix}" ALL DEPENDS "${spv_suffix}" )
423-
set_target_properties( "prepare-${spv_suffix}" PROPERTIES FOLDER "libclc/Device IR/Prepare" )
424-
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${spv_suffix}
425-
DESTINATION "${CMAKE_INSTALL_DATADIR}/clc" )
426-
else()
427-
set( builtins_opt_lib_tgt builtins.opt.${arch_suffix} )
428-
429-
# Add opt target
430-
add_custom_command( OUTPUT ${builtins_opt_lib_tgt}.bc
431-
COMMAND ${opt_exe} ${opt_flags} -o ${builtins_opt_lib_tgt}.bc
432-
${builtins_link_lib}
433-
DEPENDS ${opt_target} ${builtins_link_lib} ${builtins_link_lib_tgt}
434-
)
435-
add_custom_target( ${builtins_opt_lib_tgt}
436-
ALL DEPENDS ${builtins_opt_lib_tgt}.bc
437-
)
438-
set_target_properties( ${builtins_opt_lib_tgt} PROPERTIES
439-
TARGET_FILE ${CMAKE_CURRENT_BINARY_DIR}/${builtins_opt_lib_tgt}.bc
440-
FOLDER "libclc/Device IR/Opt"
441-
)
442-
443-
set( builtins_opt_lib $<TARGET_PROPERTY:${builtins_opt_lib_tgt},TARGET_FILE> )
444-
445-
# Add prepare target
446-
set( obj_suffix ${arch_suffix}.bc )
447-
add_custom_command( OUTPUT ${obj_suffix}
448-
COMMAND ${prepare_builtins_exe} -o ${obj_suffix} ${builtins_opt_lib}
449-
DEPENDS ${builtins_opt_lib} ${builtins_opt_lib_tgt} ${prepare_builtins_target} )
450-
add_custom_target( prepare-${obj_suffix} ALL DEPENDS ${obj_suffix} )
451-
set_target_properties( "prepare-${obj_suffix}" PROPERTIES FOLDER "libclc/Device IR/Prepare" )
452-
453-
# nvptx-- targets don't include workitem builtins
454-
if( NOT clang_triple MATCHES ".*ptx.*--$" )
455-
add_test( NAME external-calls-${obj_suffix}
456-
COMMAND ./check_external_calls.sh ${CMAKE_CURRENT_BINARY_DIR}/${obj_suffix} ${LLVM_TOOLS_BINARY_DIR}
457-
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
458-
endif()
459-
460-
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${obj_suffix} DESTINATION "${CMAKE_INSTALL_DATADIR}/clc" )
461-
foreach( a ${${d}_aliases} )
462-
set( alias_suffix "${a}-${clang_triple}.bc" )
463-
add_custom_target( ${alias_suffix} ALL
464-
COMMAND ${CMAKE_COMMAND} -E create_symlink ${obj_suffix} ${alias_suffix}
465-
DEPENDS prepare-${obj_suffix} )
466-
set_target_properties( "${alias_suffix}" PROPERTIES FOLDER "libclc/Device IR/Aliases" )
467-
install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${alias_suffix} DESTINATION "${CMAKE_INSTALL_DATADIR}/clc" )
468-
endforeach( a )
469-
endif()
470348
endforeach( d )
471349
endforeach( t )

0 commit comments

Comments
 (0)