Skip to content

Commit 2638c80

Browse files
committed
Enable precompiled headers
1 parent d4ce529 commit 2638c80

File tree

7 files changed

+203
-2
lines changed

7 files changed

+203
-2
lines changed

cl_headers/CMakeLists.txt

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,68 @@ else(USE_PREBUILT_LLVM)
1919
endif(USE_PREBUILT_LLVM)
2020
copy_file(${OPENCL_HEADERS_DIR}/opencl-c.h opencl-c.h)
2121
copy_file(${OPENCL_HEADERS_DIR}/opencl-c-base.h opencl-c-base.h)
22+
copy_file(${CMAKE_CURRENT_SOURCE_DIR}/module.modulemap module.modulemap)
2223

2324
add_custom_target (
2425
opencl.headers.target
2526
DEPENDS
27+
module.modulemap
2628
opencl-c.h
2729
opencl-c-base.h
2830
)
2931

32+
function(create_pcm DST MODULE HEADER OPTS DEPS)
33+
add_custom_command (
34+
OUTPUT ${DST}
35+
MAIN_DEPENDENCY ${MODMAP}
36+
DEPENDS ${HEADER} ${DEPS}
37+
COMMAND
38+
${CLANG_COMMAND} -cc1 -x cl
39+
-I. -O0 ${OPTS}
40+
-fmodules -fmodule-name=${MODULE} -fmodule-map-file-home-is-cwd
41+
-emit-module "module.modulemap"
42+
-fno-validate-pch
43+
-o ${DST}
44+
VERBATIM
45+
COMMENT "Generating ${DST}"
46+
)
47+
endfunction(create_pcm)
48+
49+
set(CL12 "-cl-std=CL1.2")
50+
set(CL20 "-cl-std=CL2.0")
51+
52+
set(SPIR_TRIPLE "-triple;spir-unknown-unknown")
53+
set(SPIR64_TRIPLE "-triple;spir64-unknown-unknown")
54+
if (BUILD_X64)
55+
set(HOST_TRIPLE "${SPIR64_TRIPLE}")
56+
else()
57+
set(HOST_TRIPLE "${SPIR_TRIPLE}")
58+
endif()
59+
60+
set(OPTS -cl-ext=-cl_khr_fp64)
61+
create_pcm(opencl-c-12-spir.pcm cl12spir opencl-c-base.h "${SPIR_TRIPLE};${CL12};${OPTS}" "${DEPS}")
62+
create_pcm(opencl-c-20-spir.pcm cl20spir opencl-c-base.h "${SPIR_TRIPLE};${CL20};${OPTS}" "${DEPS}")
63+
create_pcm(opencl-c-12-spir64.pcm cl12spir64 opencl-c-base.h "${SPIR64_TRIPLE};${CL12};${OPTS}" "${DEPS}")
64+
create_pcm(opencl-c-20-spir64.pcm cl20spir64 opencl-c-base.h "${SPIR64_TRIPLE};${CL20};${OPTS}" "${DEPS}")
65+
set(OPTS -cl-ext=+cl_khr_fp64)
66+
create_pcm(opencl-c-12-spir-fp64.pcm cl12spirfp64 opencl-c-base.h "${SPIR_TRIPLE};${CL12};${OPTS}" "${DEPS}")
67+
create_pcm(opencl-c-20-spir-fp64.pcm cl20spirfp64 opencl-c-base.h "${SPIR_TRIPLE};${CL20};${OPTS}" "${DEPS}")
68+
create_pcm(opencl-c-12-spir64-fp64.pcm cl12spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE};${CL12};${OPTS}" "${DEPS}")
69+
create_pcm(opencl-c-20-spir64-fp64.pcm cl20spir64fp64 opencl-c-base.h "${SPIR64_TRIPLE};${CL20};${OPTS}" "${DEPS}")
70+
71+
add_custom_target (
72+
opencl.pcm.target
73+
DEPENDS
74+
opencl.headers.target
75+
opencl-c-12-spir.pcm
76+
opencl-c-20-spir.pcm
77+
opencl-c-12-spir64.pcm
78+
opencl-c-20-spir64.pcm
79+
opencl-c-12-spir-fp64.pcm
80+
opencl-c-20-spir-fp64.pcm
81+
opencl-c-12-spir64-fp64.pcm
82+
opencl-c-20-spir64-fp64.pcm
83+
)
3084

3185
function(pack_to_obj SRC DST TAG)
3286
add_custom_command (
@@ -40,16 +94,45 @@ endfunction(pack_to_obj)
4094
if(WIN32)
4195
list(APPEND CL_HEADERS_SRC OpenCL.rc)
4296
else()
97+
4398
pack_to_obj(opencl-c.h opencl-c.h.cpp "PCM_OPENCL_C_H")
4499
pack_to_obj(opencl-c-base.h opencl-c-base.h.cpp "PCM_OPENCL_C_BASE_H")
45100
list(APPEND CL_HEADERS_SRC
46101
opencl-c.h.cpp
47102
opencl-c-base.h.cpp
103+
opencl-c-12-spir.mod.cpp
104+
opencl-c-20-spir.mod.cpp
105+
opencl-c-12-spir64.mod.cpp
106+
opencl-c-20-spir64.mod.cpp
107+
opencl-c-12-spir-fp64.mod.cpp
108+
opencl-c-20-spir-fp64.mod.cpp
109+
opencl-c-12-spir64-fp64.mod.cpp
110+
opencl-c-20-spir64-fp64.mod.cpp
111+
module.modulemap.cpp
48112
)
113+
# note the .pcm -> .mod extension change
114+
# this is a workaround for CMake bug that caused
115+
# dependency cycle in generated build rules
116+
pack_to_obj(opencl-c-12-spir.pcm opencl-c-12-spir.mod.cpp "PCM_OPENCL_C_12_SPIR_PCM")
117+
pack_to_obj(opencl-c-20-spir.pcm opencl-c-20-spir.mod.cpp "PCM_OPENCL_C_20_SPIR_PCM")
118+
pack_to_obj(opencl-c-12-spir64.pcm opencl-c-12-spir64.mod.cpp "PCM_OPENCL_C_12_SPIR64_PCM")
119+
pack_to_obj(opencl-c-20-spir64.pcm opencl-c-20-spir64.mod.cpp "PCM_OPENCL_C_20_SPIR64_PCM")
120+
pack_to_obj(opencl-c-12-spir-fp64.pcm opencl-c-12-spir-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR_FP64_PCM")
121+
pack_to_obj(opencl-c-20-spir-fp64.pcm opencl-c-20-spir-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR_FP64_PCM")
122+
pack_to_obj(opencl-c-12-spir64-fp64.pcm opencl-c-12-spir64-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR64_FP64_PCM")
123+
pack_to_obj(opencl-c-20-spir64-fp64.pcm opencl-c-20-spir64-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR64_FP64_PCM")
124+
pack_to_obj(module.modulemap module.modulemap.cpp "PCM_OPENCL_C_MODULE_MAP")
125+
49126
endif()
50127

51128
add_library(${CL_HEADERS_LIB} OBJECT
52129
${CL_HEADERS_SRC}
53130
)
54131

55132
add_dependencies(${CL_HEADERS_LIB} opencl.headers.target)
133+
install(FILES
134+
${CMAKE_CURRENT_BINARY_DIR}/opencl-c.h
135+
${CMAKE_CURRENT_BINARY_DIR}/opencl-c-base.h
136+
${CMAKE_CURRENT_BINARY_DIR}/module.modulemap
137+
DESTINATION include/cclang
138+
)

cl_headers/OpenCL.rc

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,15 @@ END
1212
//
1313

1414
OPENCL_C_H PCM "opencl-c.h"
15-
OPENCL_C_BASE_H PCM "opencl-c-base.h"
15+
OPENCL_C_BASE_H PCM "opencl-c-base.h"
16+
17+
OPENCL_C_12_SPIR_PCM PCM "opencl-c-12-spir.pcm"
18+
OPENCL_C_20_SPIR_PCM PCM "opencl-c-20-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_12_SPIR_FP64_PCM PCM "opencl-c-12-spir-fp64.pcm"
22+
OPENCL_C_20_SPIR_FP64_PCM PCM "opencl-c-20-spir-fp64.pcm"
23+
OPENCL_C_12_SPIR64_FP64_PCM PCM "opencl-c-12-spir64-fp64.pcm"
24+
OPENCL_C_20_SPIR64_FP64_PCM PCM "opencl-c-20-spir64-fp64.pcm"
25+
26+
OPENCL_C_MODULE_MAP PCM "module.modulemap"

cl_headers/module.modulemap

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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 cl12spir64 {
12+
header "opencl-c.h"
13+
header "opencl-c-base.h"
14+
export *
15+
}
16+
module cl20spir64 {
17+
header "opencl-c.h"
18+
header "opencl-c-base.h"
19+
export *
20+
}
21+
module cl12spirfp64 {
22+
header "opencl-c.h"
23+
header "opencl-c-base.h"
24+
export *
25+
}
26+
module cl20spirfp64 {
27+
header "opencl-c.h"
28+
header "opencl-c-base.h"
29+
export *
30+
}
31+
module cl12spir64fp64 {
32+
header "opencl-c.h"
33+
header "opencl-c-base.h"
34+
export *
35+
}
36+
module cl20spir64fp64 {
37+
header "opencl-c.h"
38+
header "opencl-c-base.h"
39+
export *
40+
}

cl_headers/resource.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,14 @@ Copyright (c) Intel Corporation (2009-2017).
2222
#define OPENCL_C_H "OPENCL_C_H"
2323
#define OPENCL_C_BASE_H "OPENCL_C_BASE_H"
2424

25+
#define OPENCL_C_12_SPIR_PCM "OPENCL_C_12_SPIR_PCM"
26+
#define OPENCL_C_20_SPIR_PCM "OPENCL_C_20_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_12_SPIR_FP64_PCM "OPENCL_C_12_SPIR_FP64_PCM"
30+
#define OPENCL_C_20_SPIR_FP64_PCM "OPENCL_C_20_SPIR_FP64_PCM"
31+
#define OPENCL_C_12_SPIR64_FP64_PCM "OPENCL_C_12_SPIR64_FP64_PCM"
32+
#define OPENCL_C_20_SPIR64_FP64_PCM "OPENCL_C_20_SPIR64_FP64_PCM"
33+
#define OPENCL_C_MODULE_MAP "OPENCL_C_MODULE_MAP"
34+
2535
#endif /* __RESOURCE__ */

common_clang.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,15 @@ static bool GetHeaders(std::vector<Resource> &Result) {
116116
struct {const char *ID; const char *Name;} Headers[] = {
117117
{OPENCL_C_H, "opencl-c.h"},
118118
{OPENCL_C_BASE_H, "opencl-c-base.h"},
119+
{OPENCL_C_12_SPIR_PCM, "opencl-c-12-spir.pcm"},
120+
{OPENCL_C_20_SPIR_PCM, "opencl-c-20-spir.pcm"},
121+
{OPENCL_C_12_SPIR64_PCM, "opencl-c-12-spir64.pcm"},
122+
{OPENCL_C_20_SPIR64_PCM, "opencl-c-20-spir64.pcm"},
123+
{OPENCL_C_12_SPIR_FP64_PCM, "opencl-c-12-spir-fp64.pcm"},
124+
{OPENCL_C_20_SPIR_FP64_PCM, "opencl-c-20-spir-fp64.pcm"},
125+
{OPENCL_C_12_SPIR64_FP64_PCM, "opencl-c-12-spir64-fp64.pcm"},
126+
{OPENCL_C_20_SPIR64_FP64_PCM, "opencl-c-20-spir64-fp64.pcm"},
127+
{OPENCL_C_MODULE_MAP, "module.modulemap"}
119128
};
120129

121130
Result.clear();

common_clang.map

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,15 @@ 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_12_SPIR64_PCM*;
14+
PCM_OPENCL_C_20_SPIR64_PCM*;
15+
PCM_OPENCL_C_12_SPIR_FP64_PCM*;
16+
PCM_OPENCL_C_20_SPIR_FP64_PCM*;
17+
PCM_OPENCL_C_12_SPIR64_FP64_PCM*;
18+
PCM_OPENCL_C_20_SPIR64_FP64_PCM*;
19+
PCM_OPENCL_C_MODULE_MAP*;
1120
};
1221
local: *;
1322
};

options_compile.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ std::string EffectiveOptionsFilter::processOptions(const OpenCLArgList &args,
6464
ArgsVector &effectiveArgs) {
6565
// Reset args
6666
int iCLStdSet = 0;
67+
int fp64Enable = 0;
6768
std::string szTriple;
6869
std::string sourceName(llvm::Twine(s_progID++).str());
6970

@@ -191,7 +192,6 @@ std::string EffectiveOptionsFilter::processOptions(const OpenCLArgList &args,
191192
}
192193

193194
effectiveArgs.push_back(szTriple);
194-
195195
effectiveArgs.push_back("-include");
196196
effectiveArgs.push_back("opencl-c.h");
197197

@@ -220,6 +220,45 @@ std::string EffectiveOptionsFilter::processOptions(const OpenCLArgList &args,
220220
std::back_insert_iterator<ArgsVector> it(std::back_inserter(effectiveArgs));
221221
quoted_tokenize(it, pszOptionsEx, " \t", '"', '\x00');
222222

223+
for (ArgsVector::iterator it = effectiveArgs.begin(),
224+
end = effectiveArgs.end();
225+
it != end; ++it) {
226+
if (it->compare("-Dcl_khr_fp64") == 0) {
227+
fp64Enable = true;
228+
}
229+
}
230+
effectiveArgs.push_back("-fmodules");
231+
if (fp64Enable == 0) {
232+
if (szTriple.find("spir64") != szTriple.npos) {
233+
if (iCLStdSet <= 120) {
234+
effectiveArgs.push_back("-fmodule-file=opencl-c-12-spir64.pcm");
235+
} else {
236+
effectiveArgs.push_back("-fmodule-file=opencl-c-20-spir64.pcm");
237+
}
238+
} else if (szTriple.find("spir") != szTriple.npos) {
239+
if (iCLStdSet <= 120) {
240+
effectiveArgs.push_back("-fmodule-file=opencl-c-12-spir.pcm");
241+
} else {
242+
effectiveArgs.push_back("-fmodule-file=opencl-c-20-spir.pcm");
243+
}
244+
}
245+
}
246+
else if (fp64Enable == 1) {
247+
if (szTriple.find("spir64") != szTriple.npos) {
248+
if (iCLStdSet <= 120) {
249+
effectiveArgs.push_back("-fmodule-file=opencl-c-12-spir64-fp64.pcm");
250+
} else {
251+
effectiveArgs.push_back("-fmodule-file=opencl-c-20-spir64-fp64.pcm");
252+
}
253+
} else if (szTriple.find("spir") != szTriple.npos) {
254+
if (iCLStdSet <= 120) {
255+
effectiveArgs.push_back("-fmodule-file=opencl-c-12-spir-fp64.pcm");
256+
} else {
257+
effectiveArgs.push_back("-fmodule-file=opencl-c-20-spir-fp64.pcm");
258+
}
259+
}
260+
}
261+
223262
// add source name to options as an input file
224263
assert(!sourceName.empty() && "Empty source name.");
225264
effectiveArgs.push_back(sourceName);

0 commit comments

Comments
 (0)