Skip to content

Commit 3979052

Browse files
committed
ClangJIT minimal infra
1 parent 7976e6d commit 3979052

38 files changed

+6637
-0
lines changed

c/parallel/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ option(
88
"Build cccl.c.parallel standalone headers."
99
OFF
1010
)
11+
option(
12+
CCCL_C_Parallel_ENABLE_CLANGJIT
13+
"Build ClangJIT testing infrastructure (requires LLVM fetch, ~20 min first build)."
14+
OFF
15+
)
1116

1217
# FIXME Ideally this would be handled by presets and install rules, but for now
1318
# consumers may override this to control the target location of cccl.c.parallel.
@@ -27,6 +32,9 @@ file(
2732
"src/*.cpp"
2833
)
2934

35+
# clangjit sources are built as a separate library; exclude from cccl.c.parallel
36+
list(FILTER srcs EXCLUDE REGEX "src/clangjit/")
37+
3038
add_library(cccl.c.parallel SHARED ${srcs})
3139
set_property(TARGET cccl.c.parallel PROPERTY POSITION_INDEPENDENT_CODE ON)
3240
cccl_configure_target(cccl.c.parallel DIALECT 20)
@@ -49,6 +57,10 @@ cccl_get_thrust()
4957

5058
add_subdirectory(src/jit_templates)
5159

60+
if (CCCL_C_Parallel_ENABLE_CLANGJIT)
61+
add_subdirectory(src/clangjit)
62+
endif()
63+
5264
set_target_properties(cccl.c.parallel PROPERTIES CUDA_RUNTIME_LIBRARY STATIC)
5365
target_link_libraries(
5466
cccl.c.parallel
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
cmake_minimum_required(VERSION 3.20)
2+
3+
# --------------------------------------------------------------------------
4+
# LLVM/Clang/LLD — fetched via CPM as static libraries
5+
# --------------------------------------------------------------------------
6+
# CPM.cmake is at the cccl repo root: cccl/cmake/CPM.cmake
7+
# From c/parallel/src/clangjit/ that's ../../../../cmake/CPM.cmake
8+
set(_cccl_cmake_dir "${CMAKE_CURRENT_SOURCE_DIR}/../../../../cmake")
9+
if (EXISTS "${_cccl_cmake_dir}/CPM.cmake")
10+
include("${_cccl_cmake_dir}/CPM.cmake")
11+
else()
12+
message(FATAL_ERROR "CPM.cmake not found at ${_cccl_cmake_dir}/CPM.cmake")
13+
endif()
14+
15+
if (MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug")
16+
message(
17+
FATAL_ERROR
18+
"clangjit does not support Debug builds on Windows. "
19+
"The statically-linked LLVM Debug build is too large and causes stack "
20+
"overflows at runtime. Use MinSizeRel, Release, or RelWithDebInfo instead."
21+
)
22+
endif()
23+
24+
set(CLANGJIT_LLVM_VERSION "llvmorg-22.1.1" CACHE STRING "LLVM git tag to fetch")
25+
26+
# List options must be set before CPMAddPackage
27+
set(LLVM_ENABLE_PROJECTS "clang;lld" CACHE STRING "" FORCE)
28+
set(LLVM_TARGETS_TO_BUILD "X86;NVPTX" CACHE STRING "" FORCE)
29+
30+
CPMAddPackage(
31+
NAME llvm_project
32+
GIT_REPOSITORY https://github.com/llvm/llvm-project.git
33+
GIT_TAG ${CLANGJIT_LLVM_VERSION}
34+
GIT_SHALLOW ON
35+
SOURCE_SUBDIR llvm
36+
EXCLUDE_FROM_ALL YES
37+
OPTIONS
38+
"LLVM_BUILD_LLVM_C_DYLIB OFF"
39+
"LLVM_BUILD_TOOLS OFF"
40+
"LLVM_BUILD_UTILS OFF"
41+
"LLVM_BUILD_RUNTIME OFF"
42+
"LLVM_BUILD_RUNTIMES OFF"
43+
"LLVM_INCLUDE_BENCHMARKS OFF"
44+
"LLVM_INCLUDE_DOCS OFF"
45+
"LLVM_INCLUDE_EXAMPLES OFF"
46+
"LLVM_INCLUDE_RUNTIMES OFF"
47+
"LLVM_INCLUDE_TESTS OFF"
48+
"LLVM_INCLUDE_TOOLS ON"
49+
"LLVM_INCLUDE_UTILS OFF"
50+
"LLVM_ENABLE_ZLIB OFF"
51+
"LLVM_ENABLE_ZSTD OFF"
52+
"LLVM_ENABLE_TERMINFO OFF"
53+
"LLVM_ENABLE_BINDINGS OFF"
54+
"CLANG_BUILD_TOOLS OFF"
55+
"CLANG_ENABLE_ARCMT OFF"
56+
"CLANG_ENABLE_STATIC_ANALYZER OFF"
57+
)
58+
59+
# Ensure the clang resource directory exists
60+
file(
61+
MAKE_DIRECTORY "${llvm_project_BINARY_DIR}/lib/clang/${LLVM_VERSION_MAJOR}"
62+
)
63+
64+
# Find CUDA toolkit (may already be found by parent)
65+
if (NOT CUDAToolkit_FOUND)
66+
find_package(CUDAToolkit)
67+
endif()
68+
69+
# --------------------------------------------------------------------------
70+
# clangjit library
71+
# --------------------------------------------------------------------------
72+
add_library(clangjit_lib compiler.cpp config.cpp loader.cpp jit_compiler.cpp)
73+
74+
# CCCL_SOURCE_DIR points to the cccl repo root
75+
# From c/parallel/src/clangjit -> c/parallel/src -> c/parallel -> c -> cccl
76+
cmake_path(GET CMAKE_CURRENT_SOURCE_DIR PARENT_PATH _src_dir) # c/parallel/src
77+
cmake_path(GET _src_dir PARENT_PATH _c_parallel_dir) # c/parallel
78+
cmake_path(GET _c_parallel_dir PARENT_PATH _c_dir) # c
79+
cmake_path(GET _c_dir PARENT_PATH _cccl_root) # cccl
80+
81+
target_include_directories(
82+
clangjit_lib
83+
PUBLIC
84+
${CMAKE_CURRENT_SOURCE_DIR}/include
85+
${_c_parallel_dir}/include
86+
${llvm_project_SOURCE_DIR}/llvm/include
87+
${llvm_project_BINARY_DIR}/include
88+
${llvm_project_SOURCE_DIR}/clang/include
89+
${llvm_project_BINARY_DIR}/tools/clang/include
90+
${llvm_project_SOURCE_DIR}/lld/include
91+
${llvm_project_BINARY_DIR}/tools/lld/include
92+
)
93+
94+
target_compile_definitions(
95+
clangjit_lib
96+
PRIVATE
97+
CCCL_C_EXPERIMENTAL=1
98+
CCCL_SOURCE_DIR="${_cccl_root}"
99+
CLANG_RESOURCE_DIR="${llvm_project_BINARY_DIR}/lib/clang/${LLVM_VERSION_MAJOR}"
100+
CLANG_HEADERS_DIR="${llvm_project_SOURCE_DIR}/clang/lib/Headers"
101+
CLANGJIT_INCLUDE_DIR="${CMAKE_CURRENT_SOURCE_DIR}/include"
102+
)
103+
104+
if (CUDAToolkit_FOUND)
105+
target_include_directories(clangjit_lib PUBLIC ${CUDAToolkit_INCLUDE_DIRS})
106+
cmake_path(GET CUDAToolkit_BIN_DIR PARENT_PATH CUDA_TOOLKIT_ROOT_FROM_CMAKE)
107+
target_compile_definitions(
108+
clangjit_lib
109+
PRIVATE
110+
CUDA_TOOLKIT_PATH="${CUDA_TOOLKIT_ROOT_FROM_CMAKE}"
111+
CUDA_SDK_VERSION="${CUDAToolkit_VERSION_MAJOR}.0"
112+
)
113+
endif()
114+
115+
# Link against LLVM/Clang/LLD
116+
target_link_libraries(
117+
clangjit_lib
118+
PUBLIC
119+
# LLVM
120+
LLVMCore
121+
LLVMSupport
122+
LLVMIRReader
123+
LLVMMC
124+
LLVMObject
125+
LLVMX86CodeGen
126+
LLVMX86AsmParser
127+
LLVMX86Desc
128+
LLVMX86Info
129+
LLVMNVPTXCodeGen
130+
LLVMNVPTXDesc
131+
LLVMNVPTXInfo
132+
LLVMLinker
133+
LLVMPasses
134+
# Clang
135+
clangAST
136+
clangBasic
137+
clangCodeGen
138+
clangDriver
139+
clangFrontend
140+
clangFrontendTool
141+
clangLex
142+
clangParse
143+
clangSema
144+
clangEdit
145+
clangAnalysis
146+
clangRewrite
147+
clangSerialization
148+
# LLD
149+
$<IF:$<PLATFORM_ID:Windows>,lldCOFF,lldELF>
150+
lldCommon
151+
)
152+
153+
if (NOT WIN32)
154+
target_link_libraries(clangjit_lib PUBLIC dl)
155+
endif()
156+
157+
if (CUDAToolkit_FOUND)
158+
target_link_libraries(clangjit_lib PUBLIC CUDA::cuda_driver CUDA::cudart)
159+
if (WIN32)
160+
# On Windows, static CUDA libs are built with /MT which conflicts with
161+
# the project's dynamic CRT (/MD). Use dynamic variants instead.
162+
target_link_libraries(clangjit_lib PUBLIC CUDA::nvJitLink CUDA::nvfatbin)
163+
else()
164+
target_link_libraries(
165+
clangjit_lib
166+
PUBLIC
167+
CUDA::nvJitLink_static
168+
CUDA::nvptxcompiler_static
169+
CUDA::nvfatbin_static
170+
)
171+
endif()
172+
endif()
173+
174+
if (NOT MSVC)
175+
target_compile_options(clangjit_lib PRIVATE -fno-rtti)
176+
endif()
177+
178+
set_target_properties(
179+
clangjit_lib
180+
PROPERTIES CXX_STANDARD 20 POSITION_INDEPENDENT_CODE ON
181+
)
182+
183+
# On Windows with multi-config generators (Visual Studio), exclude clangjit
184+
# targets from Debug builds — the LLVM Debug build causes stack overflows.
185+
if (MSVC)
186+
set_target_properties(
187+
clangjit_lib
188+
PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD_DEBUG TRUE
189+
)
190+
endif()

0 commit comments

Comments
 (0)