Skip to content

Commit 04fe2e5

Browse files
authored
Enable precompiled headers (#286)
* Enable precompiled headers Signed-off-by: haonanya <[email protected]> * Enable __opencl_c_fp64 only for fp64 PCH and add missing optional core language features Signed-off-by: haonanya <[email protected]>
1 parent d0fe829 commit 04fe2e5

File tree

7 files changed

+330
-11
lines changed

7 files changed

+330
-11
lines changed

cl_headers/CMakeLists.txt

Lines changed: 108 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
set(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

47
function(copy_file SRC DST)
58
add_custom_command(
@@ -18,14 +21,81 @@ else(USE_PREBUILT_LLVM)
1821
endif(USE_PREBUILT_LLVM)
1922
copy_file(${OPENCL_HEADERS_DIR}/opencl-c.h opencl-c.h)
2023
copy_file(${OPENCL_HEADERS_DIR}/opencl-c-base.h opencl-c-base.h)
24+
copy_file(${CMAKE_CURRENT_SOURCE_DIR}/module.modulemap module.modulemap)
2125

2226
add_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

30100
function(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+
48148
endif()
49149

50150
add_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+
)

cl_headers/OpenCL.rc

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,18 @@ END
1111
// Module with OpenCL C declarations with corresponding headers
1212
//
1313

14-
OPENCL_C_H PCM "opencl-c.h"
15-
OPENCL_C_BASE_H PCM "opencl-c-base.h"
14+
OPENCL_C_H PCM "opencl-c.h"
15+
OPENCL_C_BASE_H PCM "opencl-c-base.h"
16+
OPENCL_C_12_SPIR_PCM PCM "opencl-c-12-spir.pcm"
17+
OPENCL_C_20_SPIR_PCM PCM "opencl-c-20-spir.pcm"
18+
OPENCL_C_30_SPIR_PCM PCM "opencl-c-30-spir.pcm"
19+
OPENCL_C_12_SPIR64_PCM PCM "opencl-c-12-spir64.pcm"
20+
OPENCL_C_20_SPIR64_PCM PCM "opencl-c-20-spir64.pcm"
21+
OPENCL_C_30_SPIR64_PCM PCM "opencl-c-30-spir64.pcm"
22+
OPENCL_C_12_SPIR_FP64_PCM PCM "opencl-c-12-spir-fp64.pcm"
23+
OPENCL_C_20_SPIR_FP64_PCM PCM "opencl-c-20-spir-fp64.pcm"
24+
OPENCL_C_30_SPIR_FP64_PCM PCM "opencl-c-30-spir-fp64.pcm"
25+
OPENCL_C_12_SPIR64_FP64_PCM PCM "opencl-c-12-spir64-fp64.pcm"
26+
OPENCL_C_20_SPIR64_FP64_PCM PCM "opencl-c-20-spir64-fp64.pcm"
27+
OPENCL_C_30_SPIR64_FP64_PCM PCM "opencl-c-30-spir64-fp64.pcm"
28+
OPENCL_C_MODULE_MAP PCM "module.modulemap"

cl_headers/module.modulemap

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
module cl12spir {
2+
header "opencl-c.h"
3+
header "opencl-c-base.h"
4+
export *
5+
}
6+
module cl20spir {
7+
header "opencl-c.h"
8+
header "opencl-c-base.h"
9+
export *
10+
}
11+
module cl30spir {
12+
header "opencl-c.h"
13+
header "opencl-c-base.h"
14+
export *
15+
}
16+
module cl12spir64 {
17+
header "opencl-c.h"
18+
header "opencl-c-base.h"
19+
export *
20+
}
21+
module cl20spir64 {
22+
header "opencl-c.h"
23+
header "opencl-c-base.h"
24+
export *
25+
}
26+
module cl30spir64 {
27+
header "opencl-c.h"
28+
header "opencl-c-base.h"
29+
export *
30+
}
31+
module cl12spirfp64 {
32+
header "opencl-c.h"
33+
header "opencl-c-base.h"
34+
export *
35+
}
36+
module cl20spirfp64 {
37+
header "opencl-c.h"
38+
header "opencl-c-base.h"
39+
export *
40+
}
41+
module cl30spirfp64 {
42+
header "opencl-c.h"
43+
header "opencl-c-base.h"
44+
export *
45+
}
46+
module cl12spir64fp64 {
47+
header "opencl-c.h"
48+
header "opencl-c-base.h"
49+
export *
50+
}
51+
module cl20spir64fp64 {
52+
header "opencl-c.h"
53+
header "opencl-c-base.h"
54+
export *
55+
}
56+
module cl30spir64fp64 {
57+
header "opencl-c.h"
58+
header "opencl-c-base.h"
59+
export *
60+
}

cl_headers/resource.h

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,20 @@ Copyright (c) Intel Corporation (2009-2017).
1919
#ifndef __RESOURCE__
2020
#define __RESOURCE__
2121

22-
#define OPENCL_C_H "OPENCL_C_H"
23-
#define OPENCL_C_BASE_H "OPENCL_C_BASE_H"
22+
#define OPENCL_C_H "OPENCL_C_H"
23+
#define OPENCL_C_BASE_H "OPENCL_C_BASE_H"
24+
#define OPENCL_C_12_SPIR_PCM "OPENCL_C_12_SPIR_PCM"
25+
#define OPENCL_C_20_SPIR_PCM "OPENCL_C_20_SPIR_PCM"
26+
#define OPENCL_C_30_SPIR_PCM "OPENCL_C_30_SPIR_PCM"
27+
#define OPENCL_C_12_SPIR64_PCM "OPENCL_C_12_SPIR64_PCM"
28+
#define OPENCL_C_20_SPIR64_PCM "OPENCL_C_20_SPIR64_PCM"
29+
#define OPENCL_C_30_SPIR64_PCM "OPENCL_C_30_SPIR64_PCM"
30+
#define OPENCL_C_12_SPIR_FP64_PCM "OPENCL_C_12_SPIR_FP64_PCM"
31+
#define OPENCL_C_20_SPIR_FP64_PCM "OPENCL_C_20_SPIR_FP64_PCM"
32+
#define OPENCL_C_30_SPIR_FP64_PCM "OPENCL_C_30_SPIR_FP64_PCM"
33+
#define OPENCL_C_12_SPIR64_FP64_PCM "OPENCL_C_12_SPIR64_FP64_PCM"
34+
#define OPENCL_C_20_SPIR64_FP64_PCM "OPENCL_C_20_SPIR64_FP64_PCM"
35+
#define OPENCL_C_30_SPIR64_FP64_PCM "OPENCL_C_30_SPIR64_FP64_PCM"
36+
#define OPENCL_C_MODULE_MAP "OPENCL_C_MODULE_MAP"
2437

2538
#endif /* __RESOURCE__ */

common_clang.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,31 @@ void CommonClangInitialize() {
113113
}
114114

115115
static bool GetHeaders(std::vector<Resource> &Result) {
116-
struct {const char *ID; const char *Name;} Headers[] = {
117-
{OPENCL_C_H, "opencl-c.h"},
118-
{OPENCL_C_BASE_H, "opencl-c-base.h"},
119-
};
116+
struct {
117+
const char *ID;
118+
const char *Name;
119+
} Headers[] = {{OPENCL_C_H, "opencl-c.h"},
120+
{OPENCL_C_BASE_H, "opencl-c-base.h"},
121+
{OPENCL_C_12_SPIR_PCM, "opencl-c-12-spir.pcm"},
122+
{OPENCL_C_20_SPIR_PCM, "opencl-c-20-spir.pcm"},
123+
{OPENCL_C_30_SPIR_PCM, "opencl-c-30-spir.pcm"},
124+
{OPENCL_C_12_SPIR64_PCM, "opencl-c-12-spir64.pcm"},
125+
{OPENCL_C_20_SPIR64_PCM, "opencl-c-20-spir64.pcm"},
126+
{OPENCL_C_30_SPIR64_PCM, "opencl-c-30-spir64.pcm"},
127+
{OPENCL_C_12_SPIR_FP64_PCM, "opencl-c-12-spir-fp64.pcm"},
128+
{OPENCL_C_20_SPIR_FP64_PCM, "opencl-c-20-spir-fp64.pcm"},
129+
{OPENCL_C_30_SPIR_FP64_PCM, "opencl-c-30-spir-fp64.pcm"},
130+
{OPENCL_C_12_SPIR64_FP64_PCM, "opencl-c-12-spir64-fp64.pcm"},
131+
{OPENCL_C_20_SPIR64_FP64_PCM, "opencl-c-20-spir64-fp64.pcm"},
132+
{OPENCL_C_30_SPIR64_FP64_PCM, "opencl-c-30-spir64-fp64.pcm"},
133+
{OPENCL_C_MODULE_MAP, "module.modulemap"}};
120134

121135
Result.clear();
122136
Result.reserve(sizeof(Headers) / sizeof(*Headers));
123137

124138
ResourceManager &RM = ResourceManager::instance();
125139

126-
for (auto Header:Headers) {
140+
for (auto Header : Headers) {
127141
Resource R = RM.get_resource(Header.Name, Header.ID, "PCM", true);
128142
if (!R) {
129143
assert(0 && "Resource not found");

common_clang.map

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,19 @@ global:
88
GetKernelArgInfo;
99
PCM_OPENCL_C_H*;
1010
PCM_OPENCL_C_BASE_H*;
11+
PCM_OPENCL_C_12_SPIR_PCM*;
12+
PCM_OPENCL_C_20_SPIR_PCM*;
13+
PCM_OPENCL_C_30_SPIR_PCM*;
14+
PCM_OPENCL_C_12_SPIR64_PCM*;
15+
PCM_OPENCL_C_20_SPIR64_PCM*;
16+
PCM_OPENCL_C_30_SPIR64_PCM*;
17+
PCM_OPENCL_C_12_SPIR_FP64_PCM*;
18+
PCM_OPENCL_C_20_SPIR_FP64_PCM*;
19+
PCM_OPENCL_C_30_SPIR_FP64_PCM*;
20+
PCM_OPENCL_C_12_SPIR64_FP64_PCM*;
21+
PCM_OPENCL_C_20_SPIR64_FP64_PCM*;
22+
PCM_OPENCL_C_30_SPIR64_FP64_PCM*;
23+
PCM_OPENCL_C_MODULE_MAP*;
1124
};
1225
local: *;
1326
};

0 commit comments

Comments
 (0)