1
1
set (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 ()
3
6
set (LINUX_RESOURCE_LINKER_COMMAND linux_resource_linker)
4
7
5
8
function (copy_file SRC DST)
@@ -19,19 +22,86 @@ else(USE_PREBUILT_LLVM)
19
22
endif (USE_PREBUILT_LLVM)
20
23
copy_file (${OPENCL_HEADERS_DIR} /opencl-c.h opencl-c.h)
21
24
copy_file (${OPENCL_HEADERS_DIR} /opencl-c-base.h opencl-c-base.h)
25
+ copy_file (${CMAKE_CURRENT_SOURCE_DIR} /module.modulemap module.modulemap)
22
26
23
27
add_custom_target (
24
28
opencl.headers.target
25
29
DEPENDS
30
+ module.modulemap
26
31
opencl-c.h
27
32
opencl-c-base.h
28
33
)
29
34
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
+ )
30
100
31
101
function (pack_to_obj SRC DST TAG)
32
102
add_custom_command (
33
103
OUTPUT ${DST}
34
- DEPENDS ${SRC} ${LINUX_RESOURCE_LINKER_COMMAND}
104
+ DEPENDS ${SRC} linux_resource_linker
35
105
COMMAND ${LINUX_RESOURCE_LINKER_COMMAND} "${SRC} " "${DST} " "${TAG} "
36
106
COMMENT "Packing ${SRC} "
37
107
)
@@ -45,11 +115,46 @@ else()
45
115
list (APPEND CL_HEADERS_SRC
46
116
opencl-c.h.cpp
47
117
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
48
131
)
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" )
49
148
endif ()
50
149
51
150
add_library (${CL_HEADERS_LIB} OBJECT
52
151
${CL_HEADERS_SRC}
53
152
)
54
153
55
- 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