11set (CL_HEADERS_LIB cl_headers)
2- set (CLANG_COMMAND clang)
2+ set (CLANG_COMMAND $<TARGET_FILE:clang> )
3+ if (LLVM_USE_HOST_TOOLS)
4+ build_native_tool(clang CLANG_COMMAND)
5+ endif ()
36
47function (copy_file SRC DST)
58add_custom_command (
@@ -18,14 +21,81 @@ else(USE_PREBUILT_LLVM)
1821endif (USE_PREBUILT_LLVM)
1922copy_file (${OPENCL_HEADERS_DIR} /opencl-c.h opencl-c.h)
2023copy_file (${OPENCL_HEADERS_DIR} /opencl-c-base.h opencl-c-base.h)
24+ copy_file (${CMAKE_CURRENT_SOURCE_DIR} /module.modulemap module.modulemap)
2125
2226add_custom_target (
2327 opencl.headers.target
2428 DEPENDS
29+ module.modulemap
2530 opencl-c.h
2631 opencl-c-base.h
2732)
2833
34+ function (create_pcm DST MODULE HEADER OPTS DEPS)
35+ add_custom_command (
36+ OUTPUT ${DST}
37+ MAIN_DEPENDENCY ${MODMAP}
38+ DEPENDS ${HEADER} ${DEPS} ${CLANG_COMMAND}
39+ COMMAND
40+ ${CLANG_COMMAND} -cc1 -x cl
41+ -I. -O0 ${OPTS}
42+ -fmodules -fmodule-name =${MODULE} -fmodule-map-file-home-is-cwd
43+ -emit-module "module.modulemap"
44+ -fno-validate-pch
45+ -o ${DST}
46+ VERBATIM
47+ COMMENT "Generating ${DST} "
48+ )
49+ endfunction (create_pcm)
50+
51+ set (CL12 "-cl-std=CL1.2" )
52+ set (CL20 "-cl-std=CL2.0" )
53+ set (CL30 "-cl-std=CL3.0" )
54+ # Add OpenCL C 3.0 Optional features
55+ set (OPTS30 "-cl-ext=+__opencl_c_3d_image_writes,+__opencl_c_atomic_order_acq_rel,+__opencl_c_atomic_order_seq_cst,+__opencl_c_atomic_scope_device,+__opencl_c_atomic_scope_all_devices,+__opencl_c_device_enqueue,+__opencl_c_generic_address_space,+__opencl_c_images,+__opencl_c_int64,+__opencl_c_pipes,+__opencl_c_program_scope_global_variables,+__opencl_c_read_write_images,+__opencl_c_subgroups,+__opencl_c_work_group_collective_functions" )
56+ set (OPTS30_FP64 "-cl-ext=+__opencl_c_fp64" )
57+
58+ set (SPIR_TRIPLE "-triple;spir-unknown-unknown" )
59+ set (SPIR64_TRIPLE "-triple;spir64-unknown-unknown" )
60+
61+ if (BUILD_X64)
62+ set (HOST_TRIPLE "${SPIR64_TRIPLE} " )
63+ else ()
64+ set (HOST_TRIPLE "${SPIR_TRIPLE} " )
65+ endif ()
66+
67+ set (OPTS -cl-ext =+all ,-cl_khr_fp64)
68+ create_pcm(opencl-c-12-spir.pcm cl12spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
69+ create_pcm(opencl-c-20-spir.pcm cl20spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
70+ create_pcm(opencl-c-30-spir.pcm cl30spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} " "${DEPS} " )
71+ create_pcm(opencl-c-12-spir64.pcm cl12spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
72+ create_pcm(opencl-c-20-spir64.pcm cl20spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
73+ create_pcm(opencl-c-30-spir64.pcm cl30spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} " "${DEPS} " )
74+ set (OPTS -cl-ext =+all )
75+ create_pcm(opencl-c-12-spir-fp64.pcm cl12spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
76+ create_pcm(opencl-c-20-spir-fp64.pcm cl20spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
77+ create_pcm(opencl-c-30-spir-fp64.pcm cl30spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} ;${OPTS30_FP64} " "${DEPS} " )
78+ create_pcm(opencl-c-12-spir64-fp64.pcm cl12spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
79+ create_pcm(opencl-c-20-spir64-fp64.pcm cl20spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
80+ create_pcm(opencl-c-30-spir64-fp64.pcm cl30spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} ;${OPTS30_FP64} " "${DEPS} " )
81+
82+ add_custom_target (
83+ opencl.pcm.target
84+ DEPENDS
85+ opencl.headers.target
86+ opencl-c-12-spir.pcm
87+ opencl-c-20-spir.pcm
88+ opencl-c-30-spir.pcm
89+ opencl-c-12-spir64.pcm
90+ opencl-c-20-spir64.pcm
91+ opencl-c-30-spir64.pcm
92+ opencl-c-12-spir-fp64.pcm
93+ opencl-c-20-spir-fp64.pcm
94+ opencl-c-30-spir-fp64.pcm
95+ opencl-c-12-spir64-fp64.pcm
96+ opencl-c-20-spir64-fp64.pcm
97+ opencl-c-30-spir64-fp64.pcm
98+ )
2999
30100function (pack_to_obj SRC DST TAG)
31101 add_custom_command (
@@ -44,11 +114,47 @@ else()
44114 list (APPEND CL_HEADERS_SRC
45115 opencl-c.h.cpp
46116 opencl-c-base.h.cpp
117+ opencl-c-12-spir.mod.cpp
118+ opencl-c-20-spir.mod.cpp
119+ opencl-c-30-spir.mod.cpp
120+ opencl-c-12-spir64.mod.cpp
121+ opencl-c-20-spir64.mod.cpp
122+ opencl-c-30-spir64.mod.cpp
123+ opencl-c-12-spir-fp64.mod.cpp
124+ opencl-c-20-spir-fp64.mod.cpp
125+ opencl-c-30-spir-fp64.mod.cpp
126+ opencl-c-12-spir64-fp64.mod.cpp
127+ opencl-c-20-spir64-fp64.mod.cpp
128+ opencl-c-30-spir64-fp64.mod.cpp
129+ module.modulemap.cpp
47130 )
131+ # note the .pcm -> .mod extension change
132+ # this is a workaround for CMake bug that caused
133+ # dependency cycle in generated build rules
134+ pack_to_obj(opencl-c-12-spir.pcm opencl-c-12-spir.mod.cpp "PCM_OPENCL_C_12_SPIR_PCM" )
135+ pack_to_obj(opencl-c-20-spir.pcm opencl-c-20-spir.mod.cpp "PCM_OPENCL_C_20_SPIR_PCM" )
136+ pack_to_obj(opencl-c-30-spir.pcm opencl-c-30-spir.mod.cpp "PCM_OPENCL_C_30_SPIR_PCM" )
137+ pack_to_obj(opencl-c-12-spir64.pcm opencl-c-12-spir64.mod.cpp "PCM_OPENCL_C_12_SPIR64_PCM" )
138+ pack_to_obj(opencl-c-20-spir64.pcm opencl-c-20-spir64.mod.cpp "PCM_OPENCL_C_20_SPIR64_PCM" )
139+ pack_to_obj(opencl-c-30-spir64.pcm opencl-c-30-spir64.mod.cpp "PCM_OPENCL_C_30_SPIR64_PCM" )
140+ pack_to_obj(opencl-c-12-spir-fp64.pcm opencl-c-12-spir-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR_FP64_PCM" )
141+ pack_to_obj(opencl-c-20-spir-fp64.pcm opencl-c-20-spir-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR_FP64_PCM" )
142+ pack_to_obj(opencl-c-30-spir-fp64.pcm opencl-c-30-spir-fp64.mod.cpp "PCM_OPENCL_C_30_SPIR_FP64_PCM" )
143+ pack_to_obj(opencl-c-12-spir64-fp64.pcm opencl-c-12-spir64-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR64_FP64_PCM" )
144+ pack_to_obj(opencl-c-20-spir64-fp64.pcm opencl-c-20-spir64-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR64_FP64_PCM" )
145+ pack_to_obj(opencl-c-30-spir64-fp64.pcm opencl-c-30-spir64-fp64.mod.cpp "PCM_OPENCL_C_30_SPIR64_FP64_PCM" )
146+ pack_to_obj(module.modulemap module.modulemap.cpp "PCM_OPENCL_C_MODULE_MAP" )
147+
48148endif ()
49149
50150add_library (${CL_HEADERS_LIB} OBJECT
51151 ${CL_HEADERS_SRC}
52152)
53153
54- add_dependencies (${CL_HEADERS_LIB} opencl.headers.target )
154+ add_dependencies (${CL_HEADERS_LIB} opencl.pcm.target )
155+ install (FILES
156+ ${CMAKE_CURRENT_BINARY_DIR} /opencl-c.h
157+ ${CMAKE_CURRENT_BINARY_DIR} /opencl-c-base.h
158+ ${CMAKE_CURRENT_BINARY_DIR} /module.modulemap
159+ DESTINATION include /cclang
160+ )
0 commit comments