Skip to content

Commit 8de9753

Browse files
committed
Enable precompiled headers
1 parent 3d1085f commit 8de9753

File tree

7 files changed

+290
-46
lines changed

7 files changed

+290
-46
lines changed

cl_headers/CMakeLists.txt

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,66 @@ else(USE_PREBUILT_LLVM)
1818
set(OPENCL_HEADERS_DIR "${CLANG_SOURCE_DIR}/lib/Headers")
1919
endif(USE_PREBUILT_LLVM)
2020
copy_file(${OPENCL_HEADERS_DIR}/opencl-c.h opencl-c.h)
21+
copy_file(${CMAKE_CURRENT_SOURCE_DIR}/module.modulemap module.modulemap)
2122

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

2883

@@ -41,11 +96,33 @@ else()
4196
pack_to_obj(opencl-c.h opencl-c.h.cpp "PCM_OPENCL_C_H")
4297
list(APPEND CL_HEADERS_SRC
4398
opencl-c.h.cpp
99+
opencl-c-12-spir.mod.cpp
100+
opencl-c-20-spir.mod.cpp
101+
opencl-c-12-spir64.mod.cpp
102+
opencl-c-20-spir64.mod.cpp
103+
opencl-c-12-spir-fp64.mod.cpp
104+
opencl-c-20-spir-fp64.mod.cpp
105+
opencl-c-12-spir64-fp64.mod.cpp
106+
opencl-c-20-spir64-fp64.mod.cpp
107+
module.modulemap.cpp
44108
)
109+
# note the .pcm -> .mod extension change
110+
# this is a workaround for CMake bug that caused
111+
# dependency cycle in generated build rules
112+
pack_to_obj(opencl-c-12-spir.pcm opencl-c-12-spir.mod.cpp "PCM_OPENCL_C_12_SPIR_PCM")
113+
pack_to_obj(opencl-c-20-spir.pcm opencl-c-20-spir.mod.cpp "PCM_OPENCL_C_20_SPIR_PCM")
114+
pack_to_obj(opencl-c-12-spir64.pcm opencl-c-12-spir64.mod.cpp "PCM_OPENCL_C_12_SPIR64_PCM")
115+
pack_to_obj(opencl-c-20-spir64.pcm opencl-c-20-spir64.mod.cpp "PCM_OPENCL_C_20_SPIR64_PCM")
116+
pack_to_obj(opencl-c-12-spir-fp64.pcm opencl-c-12-spir-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR_FP64_PCM")
117+
pack_to_obj(opencl-c-20-spir-fp64.pcm opencl-c-20-spir-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR_FP64_PCM")
118+
pack_to_obj(opencl-c-12-spir64-fp64.pcm opencl-c-12-spir64-fp64.mod.cpp "PCM_OPENCL_C_12_SPIR64_FP64_PCM")
119+
pack_to_obj(opencl-c-20-spir64-fp64.pcm opencl-c-20-spir64-fp64.mod.cpp "PCM_OPENCL_C_20_SPIR64_FP64_PCM")
120+
pack_to_obj(module.modulemap module.modulemap.cpp "PCM_OPENCL_C_MODULE_MAP")
121+
45122
endif()
46123

47124
add_library(${CL_HEADERS_LIB} OBJECT
48125
${CL_HEADERS_SRC}
49126
)
50127

51-
add_dependencies(${CL_HEADERS_LIB} opencl.headers.target)
128+
add_dependencies(${CL_HEADERS_LIB} opencl.pcm.target)

cl_headers/OpenCL.rc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,14 @@ END
1212
//
1313

1414
OPENCL_C_H PCM "opencl-c.h"
15+
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_12_SPIR64_PCM PCM "opencl-c-12-spir64.pcm"
19+
OPENCL_C_20_SPIR64_PCM PCM "opencl-c-20-spir64.pcm"
20+
OPENCL_C_12_SPIR_FP64_PCM PCM "opencl-c-12-spir-fp64.pcm"
21+
OPENCL_C_20_SPIR_FP64_PCM PCM "opencl-c-20-spir-fp64.pcm"
22+
OPENCL_C_12_SPIR64_FP64_PCM PCM "opencl-c-12-spir64-fp64.pcm"
23+
OPENCL_C_20_SPIR64_FP64_PCM PCM "opencl-c-20-spir64-fp64.pcm"
24+
25+
OPENCL_C_MODULE_MAP PCM "module.modulemap"

cl_headers/module.modulemap

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module cl12spir {
2+
header "opencl-c.h"
3+
export *
4+
}
5+
module cl20spir {
6+
header "opencl-c.h"
7+
export *
8+
}
9+
module cl12spir64 {
10+
header "opencl-c.h"
11+
export *
12+
}
13+
module cl20spir64 {
14+
header "opencl-c.h"
15+
export *
16+
}
17+
module cl12spirfp64 {
18+
header "opencl-c.h"
19+
export *
20+
}
21+
module cl20spirfp64 {
22+
header "opencl-c.h"
23+
export *
24+
}
25+
module cl12spir64fp64 {
26+
header "opencl-c.h"
27+
export *
28+
}
29+
module cl20spir64fp64 {
30+
header "opencl-c.h"
31+
export *
32+
}

cl_headers/resource.h

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

22-
#define OPENCL_C_H "OPENCL_C_H"
22+
#define OPENCL_C_H "OPENCL_C_H"
23+
#define OPENCL_C_12_SPIR_PCM "OPENCL_C_12_SPIR_PCM"
24+
#define OPENCL_C_20_SPIR_PCM "OPENCL_C_20_SPIR_PCM"
25+
#define OPENCL_C_12_SPIR64_PCM "OPENCL_C_12_SPIR64_PCM"
26+
#define OPENCL_C_20_SPIR64_PCM "OPENCL_C_20_SPIR64_PCM"
27+
#define OPENCL_C_12_SPIR_FP64_PCM "OPENCL_C_12_SPIR_FP64_PCM"
28+
#define OPENCL_C_20_SPIR_FP64_PCM "OPENCL_C_20_SPIR_FP64_PCM"
29+
#define OPENCL_C_12_SPIR64_FP64_PCM "OPENCL_C_12_SPIR64_FP64_PCM"
30+
#define OPENCL_C_20_SPIR64_FP64_PCM "OPENCL_C_20_SPIR64_FP64_PCM"
31+
#define OPENCL_C_MODULE_MAP "OPENCL_C_MODULE_MAP"
2332

2433
#endif /* __RESOURCE__ */

common_clang.cpp

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static volatile bool lazyCCInit =
8585
true; // the flag must be 'volatile' to prevent caching in a CPU register
8686
static llvm::sys::Mutex lazyCCInitMutex;
8787

88-
static llvm::ManagedStatic<llvm::sys::SmartMutex<true> > compileMutex;
88+
static llvm::ManagedStatic<llvm::sys::SmartMutex<true>> compileMutex;
8989

9090
void CommonClangTerminate() { llvm::llvm_shutdown(); }
9191

@@ -113,16 +113,26 @@ 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-
};
116+
struct {
117+
const char *ID;
118+
const char *Name;
119+
} Headers[] = {{OPENCL_C_H, "opencl-c.h"},
120+
{OPENCL_C_12_SPIR_PCM, "opencl-c-12-spir.pcm"},
121+
{OPENCL_C_20_SPIR_PCM, "opencl-c-20-spir.pcm"},
122+
{OPENCL_C_12_SPIR64_PCM, "opencl-c-12-spir64.pcm"},
123+
{OPENCL_C_20_SPIR64_PCM, "opencl-c-20-spir64.pcm"},
124+
{OPENCL_C_12_SPIR_FP64_PCM, "opencl-c-12-spir-fp64.pcm"},
125+
{OPENCL_C_20_SPIR_FP64_PCM, "opencl-c-20-spir-fp64.pcm"},
126+
{OPENCL_C_12_SPIR64_FP64_PCM, "opencl-c-12-spir64-fp64.pcm"},
127+
{OPENCL_C_20_SPIR64_FP64_PCM, "opencl-c-20-spir64-fp64.pcm"},
128+
{OPENCL_C_MODULE_MAP, "module.modulemap"}};
119129

120130
Result.clear();
121131
Result.reserve(sizeof(Headers) / sizeof(*Headers));
122132

123133
ResourceManager &RM = ResourceManager::instance();
124134

125-
for (auto Header:Headers) {
135+
for (auto Header : Headers) {
126136
Resource R = RM.get_resource(Header.Name, Header.ID, "PCM", true);
127137
if (!R) {
128138
assert(0 && "Resource not found");
@@ -135,17 +145,21 @@ static bool GetHeaders(std::vector<Resource> &Result) {
135145
return true;
136146
}
137147

138-
static void PrintCompileOptions(const char *pszOptions, const char *pszOptionsEx,
139-
const char *pszOpenCLVer, const char * pszSource) {
148+
static void PrintCompileOptions(const char *pszOptions,
149+
const char *pszOptionsEx,
150+
const char *pszOpenCLVer,
151+
const char *pszSource) {
140152
#ifdef _DEBUG
141153
static int ID = 0;
142154

143-
if (!getenv("CCLANG_OPTIONS_DIR")) return;
155+
if (!getenv("CCLANG_OPTIONS_DIR"))
156+
return;
144157

145158
std::string OptionsDir = getenv("CCLANG_OPTIONS_DIR");
146159

147160
std::stringstream logPath;
148-
logPath << OptionsDir << "/log_" << std::this_thread::get_id() << "_" << ID << ".txt";
161+
logPath << OptionsDir << "/log_" << std::this_thread::get_id() << "_" << ID
162+
<< ".txt";
149163
std::cout << logPath.str() << std::endl;
150164

151165
// Creating log file
@@ -165,22 +179,21 @@ static void PrintCompileOptions(const char *pszOptions, const char *pszOptionsEx
165179
#endif
166180
}
167181

168-
class SmallVectorBuffer : public std::streambuf
169-
{
182+
class SmallVectorBuffer : public std::streambuf {
170183
// All memory management is delegated to llvm::SmallVectorImpl
171184
llvm::SmallVectorImpl<char> &OS;
172185

173186
// Since we don't touch any pointer in streambuf(pbase, pptr, epptr) this is
174187
// the only method we need to override.
175-
virtual std::streamsize xsputn(const char *s, std::streamsize n) override {
188+
virtual std::streamsize xsputn(const char *s, std::streamsize n) override {
176189
OS.append(s, s + n);
177190
return n;
178191
}
179192

180193
public:
181194
SmallVectorBuffer() = delete;
182-
SmallVectorBuffer(const SmallVectorBuffer&) = delete;
183-
SmallVectorBuffer &operator=(const SmallVectorBuffer&) = delete;
195+
SmallVectorBuffer(const SmallVectorBuffer &) = delete;
196+
SmallVectorBuffer &operator=(const SmallVectorBuffer &) = delete;
184197
SmallVectorBuffer(llvm::SmallVectorImpl<char> &O) : OS(O) {}
185198
};
186199

@@ -202,7 +215,7 @@ Compile(const char *pszProgramSource, const char **pInputHeaders,
202215

203216
// LLVM doesn't guarantee thread safety,
204217
// therefore we serialize execution of LLVM code.
205-
llvm::sys::SmartScopedLock<true> compileGuard {*compileMutex};
218+
llvm::sys::SmartScopedLock<true> compileGuard{*compileMutex};
206219

207220
// Parse options
208221
CompileOptionsParser optionsParser(pszOpenCLVer);
@@ -227,16 +240,16 @@ Compile(const char *pszProgramSource, const char **pInputHeaders,
227240
new clang::CompilerInstance());
228241

229242
// Prepare output buffer
230-
std::unique_ptr<llvm::raw_pwrite_stream>
231-
ir_ostream(new llvm::raw_svector_ostream(pResult->getIRBufferRef()));
243+
std::unique_ptr<llvm::raw_pwrite_stream> ir_ostream(
244+
new llvm::raw_svector_ostream(pResult->getIRBufferRef()));
232245
// Set buffers
233246
// CompilerInstance takes ownership over output stream
234247
compiler->setOutputStream(std::move(ir_ostream));
235248

236249
compiler->setDiagnostics(&*Diags);
237250

238-
auto OverlayFS = new llvm::vfs::OverlayFileSystem(
239-
llvm::vfs::getRealFileSystem());
251+
auto OverlayFS =
252+
new llvm::vfs::OverlayFileSystem(llvm::vfs::getRealFileSystem());
240253
auto MemFS = new llvm::vfs::InMemoryFileSystem();
241254
OverlayFS->pushOverlay(MemFS);
242255

@@ -258,31 +271,29 @@ Compile(const char *pszProgramSource, const char **pInputHeaders,
258271
// Source file
259272
MemFS->addFile(
260273
optionsParser.getSourceName(), (time_t)0,
261-
llvm::MemoryBuffer::getMemBuffer(
262-
llvm::StringRef(pszProgramSource), optionsParser.getSourceName()));
274+
llvm::MemoryBuffer::getMemBuffer(llvm::StringRef(pszProgramSource),
275+
optionsParser.getSourceName()));
263276

264277
// Input header with OpenCL defines.
265278
std::vector<Resource> vHeaderWithDefs;
266279
if (!GetHeaders(vHeaderWithDefs)) {
267280
return CL_COMPILE_PROGRAM_FAILURE;
268281
}
269282

270-
for (const auto &Header:vHeaderWithDefs) {
283+
for (const auto &Header : vHeaderWithDefs) {
271284
auto Buf = llvm::MemoryBuffer::getMemBuffer(
272-
llvm::StringRef(Header.m_data, Header.m_size),
273-
Header.m_name);
285+
llvm::StringRef(Header.m_data, Header.m_size), Header.m_name);
274286

275-
MemFS->addFile(Header.m_name,(time_t)0, std::move(Buf));
287+
MemFS->addFile(Header.m_name, (time_t)0, std::move(Buf));
276288
}
277289

278290
// Input Headers
279291
for (unsigned int i = 0; i < uiNumInputHeaders; ++i) {
280-
auto Header = llvm::MemoryBuffer::getMemBuffer(
281-
pInputHeaders[i], pInputHeadersNames[i]);
292+
auto Header = llvm::MemoryBuffer::getMemBuffer(pInputHeaders[i],
293+
pInputHeadersNames[i]);
282294
MemFS->addFile(pInputHeadersNames[i], (time_t)0, std::move(Header));
283295
}
284296

285-
286297
// Execute the frontend actions.
287298
bool success = false;
288299
try {
@@ -303,12 +314,14 @@ Compile(const char *pszProgramSource, const char **pInputHeaders,
303314

304315
if (success && optionsParser.hasEmitSPIRV()) {
305316
// Translate LLVM IR to SPIR-V.
306-
llvm::StringRef LLVM_IR(static_cast<const char*>(pResult->GetIR()),
317+
llvm::StringRef LLVM_IR(static_cast<const char *>(pResult->GetIR()),
307318
pResult->GetIRSize());
308-
std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBuffer(LLVM_IR, pResult->GetIRName(), false);
319+
std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBuffer(
320+
LLVM_IR, pResult->GetIRName(), false);
309321
llvm::LLVMContext Context;
310-
auto E = llvm::getOwningLazyBitcodeModule(std::move(MB), Context,
311-
/*ShouldLazyLoadMetadata=*/true);
322+
auto E =
323+
llvm::getOwningLazyBitcodeModule(std::move(MB), Context,
324+
/*ShouldLazyLoadMetadata=*/true);
312325
llvm::logAllUnhandledErrors(E.takeError(), err_ostream, "error: ");
313326
std::unique_ptr<llvm::Module> M = std::move(*E);
314327

common_clang.map

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ global:
77
Link;
88
GetKernelArgInfo;
99
PCM_OPENCL_C_H*;
10+
PCM_OPENCL_C_12_SPIR_PCM*;
11+
PCM_OPENCL_C_20_SPIR_PCM*;
12+
PCM_OPENCL_C_12_SPIR64_PCM*;
13+
PCM_OPENCL_C_20_SPIR64_PCM*;
14+
PCM_OPENCL_C_12_SPIR_FP64_PCM*;
15+
PCM_OPENCL_C_20_SPIR_FP64_PCM*;
16+
PCM_OPENCL_C_12_SPIR64_FP64_PCM*;
17+
PCM_OPENCL_C_20_SPIR64_FP64_PCM*;
18+
PCM_OPENCL_C_MODULE_MAP*;
1019
};
1120
local: *;
1221
};

0 commit comments

Comments
 (0)