Skip to content

Commit 05b7838

Browse files
[SYCL-RTC] Distribute SYCL toolchain header files inside libsycl-jit.so
We're still accessing `libdevice`'s `*.bc` files from the file system, those are left for another PR.
1 parent b3c1732 commit 05b7838

File tree

5 files changed

+201
-148
lines changed

5 files changed

+201
-148
lines changed

sycl-jit/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ if (NOT WIN32 AND NOT CYGWIN)
1919
endif(SYCL_JIT_ENABLE_WERROR)
2020
endif()
2121

22-
22+
add_subdirectory(jit-compiler-resource)
2323
add_subdirectory(jit-compiler)
2424
add_subdirectory(passes)
2525

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# We use C23/C++26's `#embed` to implement this resource creation, and "host"
2+
# CXX compiler might not have support for it. As such, use freshly built
3+
# `clang++` instead. That, in turn, requires dedicated directory for CMake to
4+
# allow to override `CMAKE_CXX_COMPILER`.
5+
6+
7+
set(SYCL_JIT_RESOURCE_CPP "${CMAKE_CURRENT_BINARY_DIR}/resource.cpp")
8+
add_custom_command(
9+
OUTPUT ${SYCL_JIT_RESOURCE_CPP}
10+
COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/generate.py --toolchain-dir ${CMAKE_BINARY_DIR} --output ${SYCL_JIT_RESOURCE_CPP} --prefix /sycl-jit-toolchain/
11+
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
12+
DEPENDS sycl-headers ${CMAKE_CURRENT_SOURCE_DIR}/generate.py
13+
)
14+
15+
set_source_files_properties(${SYCL_JIT_RESOURCE_CPP} PROPERTIES
16+
COMPILE_FLAGS -Wno-c23-extensions
17+
)
18+
19+
add_llvm_library(sycl-jit-resource
20+
${SYCL_JIT_RESOURCE_CPP}
21+
OBJECT
22+
DEPENDS
23+
clang
24+
# TODO: libdevice
25+
)
26+
27+
set(CMAKE_CXX_COMPILER ${CMAKE_BINARY_DIR}/bin/clang++)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import os
2+
import argparse
3+
4+
def main():
5+
parser = argparse.ArgumentParser(description="Generate SYCL Headers Resource C++ file")
6+
parser.add_argument("-o", "--output", type=str, required=True,
7+
help="Output file")
8+
parser.add_argument("-i", "--toolchain-dir", type=str, required=True,
9+
help="Path to toolchain root directory")
10+
parser.add_argument("--prefix", type=str, required=True,
11+
help="Prefix for file locations")
12+
args = parser.parse_args()
13+
14+
# abspath also strips trailing "/"
15+
toolchain_dir = os.path.abspath(args.toolchain_dir)
16+
17+
with open(args.output, "w") as out:
18+
out.write("""
19+
#include <utility>
20+
#include <string_view>
21+
22+
namespace jit_compiler {
23+
extern const std::pair<std::string_view, std::string_view> ToolchainFiles[];
24+
const std::pair<std::string_view, std::string_view> ToolchainFiles[] = {""")
25+
26+
def process_dir(dir):
27+
for root, _, files in os.walk(dir):
28+
for file in files:
29+
file_path = os.path.join(root, file)
30+
out.write(f"""
31+
{{
32+
{{"{args.prefix}{os.path.relpath(file_path, toolchain_dir)}"}} ,
33+
[]() {{
34+
static const char data[] = {{
35+
#embed "{file_path}"
36+
, 0}};
37+
return std::string_view(data);
38+
}}()
39+
}},""")
40+
41+
process_dir(os.path.join(args.toolchain_dir, 'include/'))
42+
process_dir(os.path.join(args.toolchain_dir, 'lib/clang/'))
43+
44+
out.write(f"""
45+
}};
46+
47+
extern size_t NumToolchainFiles;
48+
size_t NumToolchainFiles = std::size(ToolchainFiles);
49+
extern std::string_view ToolchainPrefix;
50+
std::string_view ToolchainPrefix = "{args.prefix}";
51+
}} // namespace jit_compiler
52+
""")
53+
54+
55+
if __name__ == "__main__":
56+
main()

sycl-jit/jit-compiler/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ add_llvm_library(sycl-jit
4545
clangCodeGen
4646
clangTooling
4747
clangSerialization
48+
sycl-jit-resource
4849
)
4950

5051
if(WIN32)

0 commit comments

Comments
 (0)