11set (CL_HEADERS_LIB cl_headers)
2- set (CLANG_COMMAND clang)
2+ set (CLANG_COMMAND $<TARGET_FILE:clang> )
3+ if (LLVM_USE_HOST_TOOLS AND NOT OPENCL_CLANG_BUILD_EXTERNAL)
4+ build_native_tool(clang CLANG_COMMAND)
5+ endif ()
6+ set (LINUX_RESOURCE_LINKER_COMMAND linux_resource_linker)
37
48function (copy_file SRC DST)
59add_custom_command (
@@ -18,14 +22,81 @@ else(USE_PREBUILT_LLVM)
1822endif (USE_PREBUILT_LLVM)
1923copy_file (${OPENCL_HEADERS_DIR} /opencl-c.h opencl-c.h)
2024copy_file (${OPENCL_HEADERS_DIR} /opencl-c-base.h opencl-c-base.h)
25+ copy_file (${CMAKE_CURRENT_SOURCE_DIR} /module.modulemap module.modulemap)
2126
2227add_custom_target (
2328 opencl.headers.target
2429 DEPENDS
30+ module.modulemap
2531 opencl-c.h
2632 opencl-c-base.h
2733)
2834
35+ function (create_pcm DST MODULE HEADER OPTS DEPS)
36+ add_custom_command (
37+ OUTPUT ${DST}
38+ MAIN_DEPENDENCY ${MODMAP}
39+ DEPENDS ${HEADER} ${DEPS} ${CLANG_COMMAND}
40+ COMMAND
41+ ${CLANG_COMMAND} -cc1 -x cl
42+ -I. -O0 ${OPTS}
43+ -fmodules -fmodule-name =${MODULE} -fmodule-map-file-home-is-cwd
44+ -emit-module "module.modulemap"
45+ -fno-validate-pch
46+ -o ${DST}
47+ VERBATIM
48+ COMMENT "Generating ${DST} "
49+ )
50+ endfunction (create_pcm)
51+
52+ set (CL12 "-cl-std=CL1.2" )
53+ set (CL20 "-cl-std=CL2.0" )
54+ set (CL30 "-cl-std=CL3.0" )
55+ # Add OpenCL C 3.0 Optional features
56+ 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" )
57+ set (OPTS30_FP64 "-D__opencl_c_fp64=1" )
58+
59+ set (SPIR_TRIPLE "-triple;spir-unknown-unknown" )
60+ set (SPIR64_TRIPLE "-triple;spir64-unknown-unknown" )
61+
62+ if (BUILD_X64)
63+ set (HOST_TRIPLE "${SPIR64_TRIPLE} " )
64+ else ()
65+ set (HOST_TRIPLE "${SPIR_TRIPLE} " )
66+ endif ()
67+
68+ set (OPTS -cl-ext =+all ,-cl_khr_fp64,-__opencl_c_fp64)
69+ create_pcm(opencl-c-12-spir.pcm cl12spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
70+ create_pcm(opencl-c-20-spir.pcm cl20spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
71+ create_pcm(opencl-c-30-spir.pcm cl30spir opencl-c-base.h "${SPIR_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} " "${DEPS} " )
72+ create_pcm(opencl-c-12-spir64.pcm cl12spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
73+ create_pcm(opencl-c-20-spir64.pcm cl20spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
74+ create_pcm(opencl-c-30-spir64.pcm cl30spir64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} " "${DEPS} " )
75+ set (OPTS -cl-ext =+all )
76+ create_pcm(opencl-c-12-spir-fp64.pcm cl12spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
77+ create_pcm(opencl-c-20-spir-fp64.pcm cl20spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
78+ create_pcm(opencl-c-30-spir-fp64.pcm cl30spirfp64 opencl-c-base.h "${SPIR_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} ;${OPTS30_FP64} " "${DEPS} " )
79+ create_pcm(opencl-c-12-spir64-fp64.pcm cl12spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL12} ;${OPTS} " "${DEPS} " )
80+ create_pcm(opencl-c-20-spir64-fp64.pcm cl20spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL20} ;${OPTS} " "${DEPS} " )
81+ create_pcm(opencl-c-30-spir64-fp64.pcm cl30spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE} ;${CL30} ;${OPTS} ;${OPTS30} ;${OPTS30_FP64} " "${DEPS} " )
82+
83+ add_custom_target (
84+ opencl.pcm.target
85+ DEPENDS
86+ opencl.headers.target
87+ opencl-c-12-spir.pcm
88+ opencl-c-20-spir.pcm
89+ opencl-c-30-spir.pcm
90+ opencl-c-12-spir64.pcm
91+ opencl-c-20-spir64.pcm
92+ opencl-c-30-spir64.pcm
93+ opencl-c-12-spir-fp64.pcm
94+ opencl-c-20-spir-fp64.pcm
95+ opencl-c-30-spir-fp64.pcm
96+ opencl-c-12-spir64-fp64.pcm
97+ opencl-c-20-spir64-fp64.pcm
98+ opencl-c-30-spir64-fp64.pcm
99+ )
29100
30101function (pack_to_obj SRC DST TAG)
31102 add_custom_command (
@@ -44,11 +115,46 @@ else()
44115 list (APPEND CL_HEADERS_SRC
45116 opencl-c.h.cpp
46117 opencl-c-base.h.cpp
118+ opencl-c-12-spir.mod.cpp
119+ opencl-c-20-spir.mod.cpp
120+ opencl-c-30-spir.mod.cpp
121+ opencl-c-12-spir64.mod.cpp
122+ opencl-c-20-spir64.mod.cpp
123+ opencl-c-30-spir64.mod.cpp
124+ opencl-c-12-spir-fp64.mod.cpp
125+ opencl-c-20-spir-fp64.mod.cpp
126+ opencl-c-30-spir-fp64.mod.cpp
127+ opencl-c-12-spir64-fp64.mod.cpp
128+ opencl-c-20-spir64-fp64.mod.cpp
129+ opencl-c-30-spir64-fp64.mod.cpp
130+ module.modulemap.cpp
47131 )
132+ # note the .pcm -> .mod extension change
133+ # this is a workaround for CMake bug that caused
134+ # dependency cycle in generated build rules
135+ pack_to_obj(opencl-c-12-spir.pcm opencl-c-12-spir.mod.cpp "PCM_OPENCL_C_12_SPIR_PCM" )
136+ pack_to_obj(opencl-c-20-spir.pcm opencl-c-20-spir.mod.cpp "PCM_OPENCL_C_20_SPIR_PCM" )
137+ pack_to_obj(opencl-c-30-spir.pcm opencl-c-30-spir.mod.cpp "PCM_OPENCL_C_30_SPIR_PCM" )
138+ pack_to_obj(opencl-c-12-spir64.pcm opencl-c-12-spir64.mod.cpp "PCM_OPENCL_C_12_SPIR64_PCM" )
139+ pack_to_obj(opencl-c-20-spir64.pcm opencl-c-20-spir64.mod.cpp "PCM_OPENCL_C_20_SPIR64_PCM" )
140+ pack_to_obj(opencl-c-30-spir64.pcm opencl-c-30-spir64.mod.cpp "PCM_OPENCL_C_30_SPIR64_PCM" )
141+ pack_to_obj(opencl-c-12-spir-fp64.pcm opencl-c-12-spir-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR_FP64_PCM" )
142+ pack_to_obj(opencl-c-20-spir-fp64.pcm opencl-c-20-spir-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR_FP64_PCM" )
143+ pack_to_obj(opencl-c-30-spir-fp64.pcm opencl-c-30-spir-fp64.mod.cpp "PCM_OPENCL_C_30_SPIR_FP64_PCM" )
144+ pack_to_obj(opencl-c-12-spir64-fp64.pcm opencl-c-12-spir64-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR64_FP64_PCM" )
145+ pack_to_obj(opencl-c-20-spir64-fp64.pcm opencl-c-20-spir64-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR64_FP64_PCM" )
146+ pack_to_obj(opencl-c-30-spir64-fp64.pcm opencl-c-30-spir64-fp64.mod.cpp "PCM_OPENCL_C_30_SPIR64_FP64_PCM" )
147+ pack_to_obj(module.modulemap module.modulemap.cpp "PCM_OPENCL_C_MODULE_MAP" )
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