Coverage for cuda / core / _program.pyx: 81.73%

624 statements  

« prev     ^ index     » next       coverage.py v7.13.4, created at 2026-03-08 01:07 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4"""Compilation machinery for CUDA programs. 

5  

6This module provides :class:`Program` for compiling source code into 

7:class:`~cuda.core.ObjectCode`, with :class:`ProgramOptions` for configuration. 

8""" 

9  

10from __future__ import annotations 

11  

12from dataclasses import dataclass 

13import threading 

14from warnings import warn 

15  

16from cuda.bindings import driver, nvrtc 

17from cuda.pathfinder import optional_cuda_import 

18  

19from libcpp.vector cimport vector 

20  

21from ._resource_handles cimport ( 

22 as_cu, 

23 as_py, 

24 create_nvrtc_program_handle, 

25 create_nvvm_program_handle, 

26) 

27from cuda.bindings cimport cynvrtc, cynvvm 

28from cuda.core._utils.cuda_utils cimport HANDLE_RETURN_NVRTC, HANDLE_RETURN_NVVM 

29from cuda.core._device import Device 

30from cuda.core._linker import Linker, LinkerHandleT, LinkerOptions 

31from cuda.core._module import ObjectCode 

32from cuda.core._utils.clear_error_support import assert_type 

33from cuda.core._utils.cuda_utils import ( 

34 CUDAError, 

35 _handle_boolean_option, 

36 check_or_create_options, 

37 get_binding_version, 

38 handle_return, 

39 is_nested_sequence, 

40 is_sequence, 

41) 

42  

43__all__ = ["Program", "ProgramOptions"] 

44  

45ProgramHandleT = nvrtc.nvrtcProgram | int | LinkerHandleT 

46"""Type alias for program handle types across different backends. 

47  

48The ``int`` type covers NVVM handles, which don't have a wrapper class. 

49""" 

50  

51  

52# ============================================================================= 

53# Principal Class 

54# ============================================================================= 

55  

56  

57cdef class Program: 

58 """Represent a compilation machinery to process programs into 

59 :class:`~cuda.core.ObjectCode`. 

60  

61 This object provides a unified interface to multiple underlying 

62 compiler libraries. Compilation support is enabled for a wide 

63 range of code types and compilation types. 

64  

65 Parameters 

66 ---------- 

67 code : str | bytes | bytearray 

68 The source code to compile. For C++ and PTX, must be a string. 

69 For NVVM IR, can be str, bytes, or bytearray. 

70 code_type : str 

71 The type of source code. Must be one of ``"c++"``, ``"ptx"``, or ``"nvvm"``. 

72 options : :class:`ProgramOptions`, optional 

73 Options to customize the compilation process. 

74 """ 

75  

76 def __init__(self, code: str | bytes | bytearray, code_type: str, options: ProgramOptions | None = None): 

77 Program_init(self, code, code_type, options) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

78  

79 def close(self): 

80 """Destroy this program.""" 

81 if self._linker: 2.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 'd3d4d5d6d7d8d9d!d#d

82 self._linker.close() 23d4d5d6d7d8d9d!d#d

83 # Reset handles - the C++ shared_ptr destructor handles cleanup 

84 self._h_nvrtc.reset() 2.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 'd3d4d5d6d7d8d9d!d#d

85 self._h_nvvm.reset() 2.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 'd3d4d5d6d7d8d9d!d#d

86  

87 def compile( 

88 self, target_type: str, name_expressions: tuple | list = (), logs = None 

89 ) -> ObjectCode: 

90 """Compile the program to the specified target type. 

91  

92 Parameters 

93 ---------- 

94 target_type : str 

95 The compilation target. Must be one of ``"ptx"``, ``"cubin"``, or ``"ltoir"``. 

96 name_expressions : tuple | list, optional 

97 Sequence of name expressions to make accessible in the compiled code. 

98 Used for template instantiation and similar cases. 

99 logs : object, optional 

100 Object with a ``write`` method to receive compilation logs. 

101  

102 Returns 

103 ------- 

104 :class:`~cuda.core.ObjectCode` 

105 The compiled object code. 

106 """ 

107 return Program_compile(self, target_type, name_expressions, logs) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f %d,c3d4d5d-c6d7d8d9d!d#d

108  

109 @property 

110 def pch_status(self) -> str | None: 

111 """PCH creation outcome from the most recent :meth:`compile` call. 

112  

113 Possible values: 

114  

115 * ``"created"`` — PCH file was written successfully. 

116 * ``"not_attempted"`` — PCH creation was not attempted (e.g. the 

117 compiler decided not to, or automatic PCH processing skipped it). 

118 * ``"failed"`` — an error prevented PCH creation. 

119 * ``None`` — PCH was not requested, the program has not been 

120 compiled yet, the backend is not NVRTC (e.g. PTX or NVVM), 

121 or the NVRTC bindings are too old to report status. 

122  

123 When ``create_pch`` is set in :class:`ProgramOptions` and the PCH 

124 heap is too small, :meth:`compile` automatically resizes the heap 

125 and retries, so ``"created"`` should be the common outcome. 

126  

127 .. note:: 

128  

129 PCH is only supported for ``code_type="c++"`` programs that 

130 use the NVRTC backend. For PTX and NVVM programs this property 

131 always returns ``None``. 

132 """ 

133 return self._pch_status 2:cb dc

134  

135 @property 

136 def backend(self) -> str: 

137 """Return this Program instance's underlying backend.""" 

138 return self._backend 2.c/ca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d(d3d4d5d6d7d8d9d!d#d

139  

140 @property 

141 def handle(self) -> ProgramHandleT: 

142 """Return the underlying handle object. 

143  

144 .. note:: 

145  

146 The type of the returned object depends on the backend. 

147  

148 .. caution:: 

149  

150 This handle is a Python object. To get the memory address of the underlying C 

151 handle, call ``int(Program.handle)``. 

152 """ 

153 if self._backend == "NVRTC": 2+c)d(d

154 return as_py(self._h_nvrtc) 2)d(d

155 elif self._backend == "NVVM": 2+c

156 return as_py(self._h_nvvm) # returns int (NVVM uses raw integers) 2+c

157 else: 

158 return self._linker.handle 

159  

160 def __repr__(self) -> str: 

161 return f"<Program backend='{self._backend}'>" 2*d$d+c

162  

163  

164# ============================================================================= 

165# Other Public Classes 

166# ============================================================================= 

167  

168  

169@dataclass 

170class ProgramOptions: 

171 """Customizable options for configuring :class:`Program`. 

172  

173 Attributes 

174 ---------- 

175 name : str, optional 

176 Name of the program. If the compilation succeeds, the name is passed down to the generated `ObjectCode`. 

177 arch : str, optional 

178 Pass the SM architecture value, such as ``sm_<CC>`` (for generating CUBIN) or 

179 ``compute_<CC>`` (for generating PTX). If not provided, the current device's architecture 

180 will be used. 

181 relocatable_device_code : bool, optional 

182 Enable (disable) the generation of relocatable device code. 

183 Default: False 

184 extensible_whole_program : bool, optional 

185 Do extensible whole program compilation of device code. 

186 Default: False 

187 debug : bool, optional 

188 Generate debug information. If --dopt is not specified, then turns off all optimizations. 

189 Default: False 

190 lineinfo: bool, optional 

191 Generate line-number information. 

192 Default: False 

193 device_code_optimize : bool, optional 

194 Enable device code optimization. When specified along with '-G', enables limited debug information generation 

195 for optimized device code. 

196 Default: None 

197 ptxas_options : Union[str, list[str]], optional 

198 Specify one or more options directly to ptxas, the PTX optimizing assembler. Options should be strings. 

199 For example ["-v", "-O2"]. 

200 Default: None 

201 max_register_count : int, optional 

202 Specify the maximum amount of registers that GPU functions can use. 

203 Default: None 

204 ftz : bool, optional 

205 When performing single-precision floating-point operations, flush denormal values to zero or preserve denormal 

206 values. 

207 Default: False 

208 prec_sqrt : bool, optional 

209 For single-precision floating-point square root, use IEEE round-to-nearest mode or use a faster approximation. 

210 Default: True 

211 prec_div : bool, optional 

212 For single-precision floating-point division and reciprocals, use IEEE round-to-nearest mode or use a faster 

213 approximation. 

214 Default: True 

215 fma : bool, optional 

216 Enables (disables) the contraction of floating-point multiplies and adds/subtracts into floating-point 

217 multiply-add operations. 

218 Default: True 

219 use_fast_math : bool, optional 

220 Make use of fast math operations. 

221 Default: False 

222 extra_device_vectorization : bool, optional 

223 Enables more aggressive device code vectorization in the NVVM optimizer. 

224 Default: False 

225 link_time_optimization : bool, optional 

226 Generate intermediate code for later link-time optimization. 

227 Default: False 

228 gen_opt_lto : bool, optional 

229 Run the optimizer passes before generating the LTO IR. 

230 Default: False 

231 define_macro : Union[str, tuple[str, str], list[Union[str, tuple[str, str]]]], optional 

232 Predefine a macro. Can be either a string, in which case that macro will be set to 1, a 2 element tuple of 

233 strings, in which case the first element is defined as the second, or a list of strings or tuples. 

234 Default: None 

235 undefine_macro : Union[str, list[str]], optional 

236 Cancel any previous definition of a macro, or list of macros. 

237 Default: None 

238 include_path : Union[str, list[str]], optional 

239 Add the directory or directories to the list of directories to be searched for headers. 

240 Default: None 

241 pre_include : Union[str, list[str]], optional 

242 Preinclude one or more headers during preprocessing. Can be either a string or a list of strings. 

243 Default: None 

244 no_source_include : bool, optional 

245 Disable the default behavior of adding the directory of each input source to the include path. 

246 Default: False 

247 std : str, optional 

248 Set language dialect to C++03, C++11, C++14, C++17 or C++20. 

249 Default: c++17 

250 builtin_move_forward : bool, optional 

251 Provide builtin definitions of std::move and std::forward. 

252 Default: True 

253 builtin_initializer_list : bool, optional 

254 Provide builtin definitions of std::initializer_list class and member functions. 

255 Default: True 

256 disable_warnings : bool, optional 

257 Inhibit all warning messages. 

258 Default: False 

259 restrict : bool, optional 

260 Programmer assertion that all kernel pointer parameters are restrict pointers. 

261 Default: False 

262 device_as_default_execution_space : bool, optional 

263 Treat entities with no execution space annotation as __device__ entities. 

264 Default: False 

265 device_int128 : bool, optional 

266 Allow the __int128 type in device code. 

267 Default: False 

268 optimization_info : str, optional 

269 Provide optimization reports for the specified kind of optimization. 

270 Default: None 

271 no_display_error_number : bool, optional 

272 Disable the display of a diagnostic number for warning messages. 

273 Default: False 

274 diag_error : Union[int, list[int]], optional 

275 Emit error for a specified diagnostic message number or comma separated list of numbers. 

276 Default: None 

277 diag_suppress : Union[int, list[int]], optional 

278 Suppress a specified diagnostic message number or comma separated list of numbers. 

279 Default: None 

280 diag_warn : Union[int, list[int]], optional 

281 Emit warning for a specified diagnostic message number or comma separated lis of numbers. 

282 Default: None 

283 brief_diagnostics : bool, optional 

284 Disable or enable showing source line and column info in a diagnostic. 

285 Default: False 

286 time : str, optional 

287 Generate a CSV table with the time taken by each compilation phase. 

288 Default: None 

289 split_compile : int, optional 

290 Perform compiler optimizations in parallel. 

291 Default: 1 

292 fdevice_syntax_only : bool, optional 

293 Ends device compilation after front-end syntax checking. 

294 Default: False 

295 minimal : bool, optional 

296 Omit certain language features to reduce compile time for small programs. 

297 Default: False 

298 no_cache : bool, optional 

299 Disable compiler caching. 

300 Default: False 

301 fdevice_time_trace : str, optional 

302 Generate time trace JSON for profiling compilation (NVRTC only). 

303 Default: None 

304 device_float128 : bool, optional 

305 Allow __float128 type in device code (NVRTC only). 

306 Default: False 

307 frandom_seed : str, optional 

308 Set random seed for randomized optimizations (NVRTC only). 

309 Default: None 

310 ofast_compile : str, optional 

311 Fast compilation mode: "0", "min", "mid", or "max" (NVRTC only). 

312 Default: None 

313 pch : bool, optional 

314 Use default precompiled header (NVRTC only, CUDA 12.8+). 

315 Default: False 

316 create_pch : str, optional 

317 Create precompiled header file (NVRTC only, CUDA 12.8+). 

318 Default: None 

319 use_pch : str, optional 

320 Use specific precompiled header file (NVRTC only, CUDA 12.8+). 

321 Default: None 

322 pch_dir : str, optional 

323 PCH directory location (NVRTC only, CUDA 12.8+). 

324 Default: None 

325 pch_verbose : bool, optional 

326 Verbose PCH output (NVRTC only, CUDA 12.8+). 

327 Default: False 

328 pch_messages : bool, optional 

329 Control PCH diagnostic messages (NVRTC only, CUDA 12.8+). 

330 Default: False 

331 instantiate_templates_in_pch : bool, optional 

332 Control template instantiation in PCH (NVRTC only, CUDA 12.8+). 

333 Default: False 

334 extra_sources : list of 2-tuples or tuple of 2-tuples, optional 

335 Additional NVVM IR modules to compile together with the main program, specified as 

336 ``((name1, source1), (name2, source2), ...)``. Each name is a string identifier used 

337 in diagnostic messages. Each source can be a string (textual LLVM IR) or bytes/bytearray 

338 (LLVM bitcode). Only supported for the NVVM backend. 

339 Default: None 

340 use_libdevice : bool, optional 

341 Load NVIDIA's `libdevice <https://docs.nvidia.com/cuda/libdevice-users-guide/>`_ 

342 math builtins library. Only supported for the NVVM backend. 

343 Default: False 

344 """ 

345  

346 name: str | None = "default_program" 

347 arch: str | None = None 

348 relocatable_device_code: bool | None = None 

349 extensible_whole_program: bool | None = None 

350 debug: bool | None = None 

351 lineinfo: bool | None = None 

352 device_code_optimize: bool | None = None 

353 ptxas_options: str | list[str] | tuple[str] | None = None 

354 max_register_count: int | None = None 

355 ftz: bool | None = None 

356 prec_sqrt: bool | None = None 

357 prec_div: bool | None = None 

358 fma: bool | None = None 

359 use_fast_math: bool | None = None 

360 extra_device_vectorization: bool | None = None 

361 link_time_optimization: bool | None = None 

362 gen_opt_lto: bool | None = None 

363 define_macro: str | tuple[str, str] | list[str | tuple[str, str]] | tuple[str | tuple[str, str], ...] | None = None 

364 undefine_macro: str | list[str] | tuple[str] | None = None 

365 include_path: str | list[str] | tuple[str] | None = None 

366 pre_include: str | list[str] | tuple[str] | None = None 

367 no_source_include: bool | None = None 

368 std: str | None = None 

369 builtin_move_forward: bool | None = None 

370 builtin_initializer_list: bool | None = None 

371 disable_warnings: bool | None = None 

372 restrict: bool | None = None 

373 device_as_default_execution_space: bool | None = None 

374 device_int128: bool | None = None 

375 optimization_info: str | None = None 

376 no_display_error_number: bool | None = None 

377 diag_error: int | list[int] | tuple[int] | None = None 

378 diag_suppress: int | list[int] | tuple[int] | None = None 

379 diag_warn: int | list[int] | tuple[int] | None = None 

380 brief_diagnostics: bool | None = None 

381 time: str | None = None 

382 split_compile: int | None = None 

383 fdevice_syntax_only: bool | None = None 

384 minimal: bool | None = None 

385 no_cache: bool | None = None 

386 fdevice_time_trace: str | None = None 

387 device_float128: bool | None = None 

388 frandom_seed: str | None = None 

389 ofast_compile: str | None = None 

390 pch: bool | None = None 

391 create_pch: str | None = None 

392 use_pch: str | None = None 

393 pch_dir: str | None = None 

394 pch_verbose: bool | None = None 

395 pch_messages: bool | None = None 

396 instantiate_templates_in_pch: bool | None = None 

397 extra_sources: list[tuple[str, str | bytes | bytearray]] | tuple[tuple[str, str | bytes | bytearray], ...] | None = None 

398 use_libdevice: bool | None = None # For libdevice execution 

399 numba_debug: bool | None = None # Custom option for Numba debugging 

400  

401 def __post_init__(self): 

402 self._name = self.name.encode() 2:cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b2d+cc f +d'd%d,c)d:d.d(d@dZd1d0d-c

403 # Set arch to default if not provided 

404 if self.arch is None: 2:cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b2d+cc f +d'd%d,c)d:d.d(d@dZd1d0d-c

405 self.arch = f"sm_{Device().arch}" 2:c_cEcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dc/da ~b2d+cc f +d'd%d,c)d:d.d(d-c

406  

407 def _prepare_nvrtc_options(self) -> list[bytes]: 

408 return _prepare_nvrtc_options_impl(self) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

409  

410 def _prepare_nvvm_options(self, as_bytes: bool = True) -> list[bytes] | list[str]: 

411 return _prepare_nvvm_options_impl(self, as_bytes) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

412  

413 def as_bytes(self, backend: str, target_type: str | None = None) -> list[bytes]: 

414 """Convert program options to bytes format for the specified backend. 

415  

416 This method transforms the program options into a format suitable for the 

417 specified compiler backend. Different backends may use different option names 

418 and formats even for the same conceptual options. 

419  

420 Parameters 

421 ---------- 

422 backend : str 

423 The compiler backend to prepare options for. Must be either "nvrtc" or "nvvm". 

424 target_type : str, optional 

425 The compilation target type (e.g., "ptx", "cubin", "ltoir"). Some backends 

426 require additional options based on the target type. 

427  

428 Returns 

429 ------- 

430 list[bytes] 

431 List of option strings encoded as bytes. 

432  

433 Raises 

434 ------ 

435 ValueError 

436 If an unknown backend is specified. 

437 CUDAError 

438 If an option incompatible with the specified backend is set. 

439  

440 Examples 

441 -------- 

442 >>> options = ProgramOptions(arch="sm_80", debug=True) 

443 >>> nvrtc_options = options.as_bytes("nvrtc") 

444 """ 

445 backend = backend.lower() 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f ,c@dZd1d0d-c

446 if backend == "nvrtc": 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f ,c@dZd1d0d-c

447 return self._prepare_nvrtc_options() 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

448 elif backend == "nvvm": 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f @d1d0d

449 options = self._prepare_nvvm_options(as_bytes=True) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

450 if target_type == "ltoir" and b"-gen-lto" not in options: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 0d

451 options.append(b"-gen-lto") 2.c/c=c?c@cCc[cDc]cc

452 return options 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 0d

453 else: 

454 raise ValueError(f"Unknown backend '{backend}'. Must be one of: 'nvrtc', 'nvvm'") 2@d

455  

456 def __repr__(self): 

457 return f"ProgramOptions(name={self.name!r}, arch={self.arch!r})" 

458  

459  

460# ============================================================================= 

461# Private Classes and Helper Functions 

462# ============================================================================= 

463  

464# Module-level state for NVVM lazy loading 

465_nvvm_module = None 

466_nvvm_import_attempted = False 

467  

468  

469def _get_nvvm_module(): 

470 """Get the NVVM module, importing it lazily with availability checks.""" 

471 global _nvvm_module, _nvvm_import_attempted 

472  

473 if _nvvm_import_attempted: 2:c$d;d=d?d.c/c2d[d+c=cUd?cVd@cWdCc#c[c]dXdDc$c]c^dYdc f

474 if _nvvm_module is None: 2:c$d.c/c2d[d+c=cUd?cVd@cWdCc#c[c]dXdDc$c]c^dYdc f

475 raise RuntimeError("NVVM module is not available (previous import attempt failed)") 

476 return _nvvm_module 2:c$d.c/c2d[d+c=cUd?cVd@cWdCc#c[c]dXdDc$c]c^dYdc f

477  

478 _nvvm_import_attempted = True 2:c;d=d?d

479  

480 try: 2:c;d=d?d

481 version = get_binding_version() 2:c;d=d?d

482 if version < (12, 9): 2:c;d=d?d

483 raise RuntimeError( 

484 f"NVVM bindings require cuda-bindings >= 12.9.0, but found {version[0]}.{version[1]}.x. " 

485 "Please update cuda-bindings to use NVVM features." 

486 ) 

487  

488 nvvm = optional_cuda_import( 2:c;d=d?d

489 "cuda.bindings.nvvm", 

490 probe_function=lambda module: module.version(), # probe triggers libnvvm load 2:c;d=d?d

491 ) 

492 if nvvm is None: 2:c;d=d

493 raise RuntimeError( 2;d=d

494 "NVVM support is unavailable: cuda.bindings.nvvm is missing or libnvvm cannot be loaded." 

495 ) 

496  

497 _nvvm_module = nvvm 

498 return _nvvm_module 

499  

500 except RuntimeError: 2;d=d?d

501 _nvvm_module = None 2;d=d

502 raise 2;d=d

503  

504def _find_libdevice_path(): 

505 """Find libdevice*.bc for NVVM compilation using cuda.pathfinder.""" 

506 from cuda.pathfinder import find_bitcode_lib 

507 return find_bitcode_lib("device") 

508  

509  

510  

511  

512cdef inline bint _process_define_macro_inner(list options, object macro) except? -1: 

513 """Process a single define macro, returning True if successful.""" 

514 if isinstance(macro, str): 1Rhde

515 options.append(f"--define-macro={macro}") 1R

516 return True 1R

517 if isinstance(macro, tuple): 1hde

518 if len(macro) != 2 or any(not isinstance(val, str) for val in macro): 1hde

519 raise RuntimeError(f"Expected define_macro tuple[str, str], got {macro}") 

520 options.append(f"--define-macro={macro[0]}={macro[1]}") 1hde

521 return True 1hde

522 return False 1de

523  

524  

525cdef inline void _process_define_macro(list options, object macro) except *: 

526 """Process define_macro option which can be str, tuple, or list thereof.""" 

527 union_type = "Union[str, tuple[str, str]]" 1Rhde

528 if _process_define_macro_inner(options, macro): 1Rhde

529 return 1Rh

530 if is_nested_sequence(macro): 1de

531 for seq_macro in macro: 1de

532 if not _process_define_macro_inner(options, seq_macro): 1de

533 raise RuntimeError(f"Expected define_macro {union_type}, got {seq_macro}") 

534 return 1de

535 raise RuntimeError(f"Expected define_macro {union_type}, list[{union_type}], got {macro}") 

536  

537  

538cpdef bint _can_load_generated_ptx() except? -1: 

539 """Check if the driver can load PTX generated by the current NVRTC version.""" 

540 driver_ver = handle_return(driver.cuDriverGetVersion()) 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c_dO `dP {d|db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

541 nvrtc_major, nvrtc_minor = handle_return(nvrtc.nvrtcVersion()) 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c_dO `dP {d|db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

542 return nvrtc_major * 1000 + nvrtc_minor * 10 <= driver_ver 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9c_dO `dP {d|db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

543  

544  

545cdef inline object _translate_program_options(object options): 

546 """Translate ProgramOptions to LinkerOptions for PTX compilation.""" 

547 return LinkerOptions( 23d4d5d6d7d8d9d!d#d

548 name=options.name, 23d4d5d6d7d8d9d!d#d

549 arch=options.arch, 23d4d5d6d7d8d9d!d#d

550 max_register_count=options.max_register_count, 23d4d5d6d7d8d9d!d#d

551 time=options.time, 23d4d5d6d7d8d9d!d#d

552 link_time_optimization=options.link_time_optimization, 23d4d5d6d7d8d9d!d#d

553 debug=options.debug, 23d4d5d6d7d8d9d!d#d

554 lineinfo=options.lineinfo, 23d4d5d6d7d8d9d!d#d

555 ftz=options.ftz, 23d4d5d6d7d8d9d!d#d

556 prec_div=options.prec_div, 23d4d5d6d7d8d9d!d#d

557 prec_sqrt=options.prec_sqrt, 23d4d5d6d7d8d9d!d#d

558 fma=options.fma, 23d4d5d6d7d8d9d!d#d

559 split_compile=options.split_compile, 23d4d5d6d7d8d9d!d#d

560 ptxas_options=options.ptxas_options, 23d4d5d6d7d8d9d!d#d

561 no_cache=options.no_cache, 23d4d5d6d7d8d9d!d#d

562 ) 

563  

564  

565cdef inline int Program_init(Program self, object code, str code_type, object options) except -1: 

566 """Initialize a Program instance.""" 

567 cdef cynvrtc.nvrtcProgram nvrtc_prog 

568 cdef cynvvm.nvvmProgram nvvm_prog 

569 cdef bytes code_bytes 

570 cdef const char* code_ptr 

571 cdef const char* name_ptr 

572 cdef size_t code_len 

573 cdef bytes module_bytes 

574 cdef const char* module_ptr 

575 cdef size_t module_len 

576  

577 self._options = options = check_or_create_options(ProgramOptions, options, "Program options") 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

578 code_type = code_type.lower() 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

579 self._compile_lock = threading.Lock() 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

580 self._use_libdevice = False 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

581 self._libdevice_added = False 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

582  

583 self._pch_status = None 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

584  

585 if code_type == "c++": 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d:d.d(d3d4d5d-c6d7d8d9d!d#d

586 assert_type(code, str) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d:d(d-c

587 if options.extra_sources is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dc/da ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

588 raise ValueError("extra_sources is not supported by the NVRTC backend (C++ code_type)") 2/d

589  

590 # TODO: support pre-loaded headers & include names 

591 code_bytes = code.encode() 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

592 code_ptr = <const char*>code_bytes 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

593 name_ptr = <const char*>options._name 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

594  

595 with nogil: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

596 HANDLE_RETURN_NVRTC(NULL, cynvrtc.nvrtcCreateProgram( 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

597 &nvrtc_prog, code_ptr, name_ptr, 0, NULL, NULL)) 

598 self._h_nvrtc = create_nvrtc_program_handle(nvrtc_prog) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

599 self._nvrtc_code = code_bytes 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

600 self._backend = "NVRTC" 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

601 self._linker = None 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-db dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+d'd%d,c)d(d-c

602  

603 elif code_type == "ptx": 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f .d3d4d5d6d7d8d9d!d#d

604 assert_type(code, str) 23d4d5d6d7d8d9d!d#d

605 if options.extra_sources is not None: 23d4d5d6d7d8d9d!d#d

606 raise ValueError("extra_sources is not supported by the PTX backend.") 

607 self._linker = Linker( 23d4d5d6d7d8d9d!d#d

608 ObjectCode._init(code.encode(), code_type), options=_translate_program_options(options) 23d4d5d6d7d8d9d!d#d

609 ) 

610 self._backend = self._linker.backend 23d4d5d6d7d8d9d!d#d

611  

612 elif code_type == "nvvm": 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f .d

613 _get_nvvm_module() # Validate NVVM availability 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

614 if isinstance(code, str): 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

615 code = code.encode("utf-8") 2$d2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

616 elif not isinstance(code, (bytes, bytearray)): 2.c/c

617 raise TypeError("NVVM IR code must be provided as str, bytes, or bytearray") 

618  

619 code_ptr = <const char*>(<bytes>code) 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

620 name_ptr = <const char*>options._name 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

621 code_len = len(code) 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

622  

623 with nogil: 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

624 HANDLE_RETURN_NVVM(NULL, cynvvm.nvvmCreateProgram(&nvvm_prog)) 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

625 self._h_nvvm = create_nvvm_program_handle(nvvm_prog) # RAII from here 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

626 with nogil: 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

627 HANDLE_RETURN_NVVM(nvvm_prog, cynvvm.nvvmAddModuleToProgram(nvvm_prog, code_ptr, code_len, name_ptr)) 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

628  

629 # Add extra modules if provided 

630 if options.extra_sources is not None: 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

631 if not is_sequence(options.extra_sources): 1cf

632 raise TypeError( 

633 "extra_sources must be a sequence of 2-tuples: ((name1, source1), (name2, source2), ...)" 

634 ) 

635 for i, module in enumerate(options.extra_sources): 1cf

636 if not isinstance(module, tuple) or len(module) != 2: 1cf

637 raise TypeError( 

638 f"Each extra module must be a 2-tuple (name, source)" 

639 f", got {type(module).__name__} at index {i}" 

640 ) 

641  

642 module_name, module_source = module 1cf

643  

644 if not isinstance(module_name, str): 1cf

645 raise TypeError(f"Module name at index {i} must be a string, got {type(module_name).__name__}") 

646  

647 if isinstance(module_source, str): 1cf

648 # Textual LLVM IR - encode to UTF-8 bytes 

649 module_source = module_source.encode("utf-8") 1cf

650 elif not isinstance(module_source, (bytes, bytearray)): 

651 raise TypeError( 

652 f"Module source at index {i} must be str (textual LLVM IR), bytes (textual LLVM IR or bitcode), " 

653 f"or bytearray, got {type(module_source).__name__}" 

654 ) 

655  

656 if len(module_source) == 0: 1cf

657 raise ValueError(f"Module source for '{module_name}' (index {i}) cannot be empty") 

658  

659 # Add the module using NVVM API 

660 module_bytes = module_source if isinstance(module_source, bytes) else bytes(module_source) 1cf

661 module_ptr = <const char*>module_bytes 1cf

662 module_len = len(module_bytes) 1cf

663 module_name_bytes = module_name.encode() 1cf

664 module_name_ptr = <const char*>module_name_bytes 1cf

665  

666 with nogil: 1cf

667 HANDLE_RETURN_NVVM(nvvm_prog, cynvvm.nvvmAddModuleToProgram( 1cf

668 nvvm_prog, module_ptr, module_len, module_name_ptr)) 

669  

670 # Store use_libdevice flag 

671 if options.use_libdevice: 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

672 self._use_libdevice = True 

673  

674 self._backend = "NVVM" 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

675 self._linker = None 2$d.c/c2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

676  

677 else: 

678 supported_code_types = ("c++", "ptx", "nvvm") 2.d

679 assert code_type not in supported_code_types, f"{code_type=}" 2.d

680 if options.use_libdevice: 2.d

681 raise ValueError("use_libdevice is only supported by the NVVM backend") 

682 raise RuntimeError(f"Unsupported {code_type=} ({supported_code_types=})") 2.d

683  

684 return 0 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFd*d$dGdHdIdJdKdLdMdNdOdPdQdRd,dSdTd-d.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f +d'd%d,c)d(d3d4d5d-c6d7d8d9d!d#d

685  

686  

687cdef object _nvrtc_compile_and_extract( 

688 cynvrtc.nvrtcProgram prog, str target_type, object name_expressions, 

689 object logs, list options_list, str name, 

690): 

691 """Run nvrtcCompileProgram on *prog* and extract the output. 

692  

693 This is the inner compile+extract loop, factored out so the PCH 

694 auto-retry path can call it on a fresh program handle. 

695 """ 

696 cdef size_t output_size = 0 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

697 cdef size_t logsize = 0 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

698 cdef vector[const char*] options_vec 

699 cdef char* data_ptr = NULL 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

700 cdef bytes name_bytes 

701 cdef const char* name_ptr = NULL 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

702 cdef const char* lowered_name = NULL 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

703 cdef dict symbol_mapping = {} 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

704  

705 # Add name expressions before compilation 

706 if name_expressions: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

707 for n in name_expressions: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

708 name_bytes = n.encode() if isinstance(n, str) else n 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

709 name_ptr = <const char*>name_bytes 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

710 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcAddNameExpression(prog, name_ptr)) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

711  

712 # Build options array 

713 options_vec.resize(len(options_list)) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

714 for i in range(len(options_list)): 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

715 options_vec[i] = <const char*>(<bytes>options_list[i]) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

716  

717 # Compile 

718 with nogil: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

719 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcCompileProgram(prog, <int>options_vec.size(), options_vec.data())) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

720  

721 # Get compiled output based on target type 

722 if target_type == "ptx": 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

723 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetPTXSize(prog, &output_size)) 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

724 data = bytearray(output_size) 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

725 data_ptr = <char*>(<bytearray>data) 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

726 with nogil: 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

727 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetPTX(prog, data_ptr)) 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

728 elif target_type == "cubin": 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ;cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd

729 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetCUBINSize(prog, &output_size)) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdGdHdIdJdKdLdMdNdOdPdQdRdSdTd

730 data = bytearray(output_size) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdGdHdIdJdKdLdMdNdOdPdQdRdSdTd

731 data_ptr = <char*>(<bytearray>data) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdGdHdIdJdKdLdMdNdOdPdQdRdSdTd

732 with nogil: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdGdHdIdJdKdLdMdNdOdPdQdRdSdTd

733 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetCUBIN(prog, data_ptr)) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdGdHdIdJdKdLdMdNdOdPdQdRdSdTd

734 else: # ltoir 

735 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetLTOIRSize(prog, &output_size)) 2;cU V Fd

736 data = bytearray(output_size) 2;cU V Fd

737 data_ptr = <char*>(<bytearray>data) 2;cU V Fd

738 with nogil: 2;cU V Fd

739 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetLTOIR(prog, data_ptr)) 2;cU V Fd

740  

741 # Get lowered names after compilation 

742 if name_expressions: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

743 for n in name_expressions: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

744 name_bytes = n.encode() if isinstance(n, str) else n 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

745 name_ptr = <const char*>name_bytes 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

746 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetLoweredName(prog, name_ptr, &lowered_name)) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

747 symbol_mapping[n] = lowered_name if lowered_name != NULL else None 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbi j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N ebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b

748  

749 # Get compilation log if requested 

750 if logs is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

751 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetProgramLogSize(prog, &logsize)) 

752 if logsize > 1: 

753 log = bytearray(logsize) 

754 data_ptr = <char*>(<bytearray>log) 

755 with nogil: 

756 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetProgramLog(prog, data_ptr)) 

757 logs.write(log.decode("utf-8", errors="backslashreplace")) 

758  

759 return ObjectCode._init(bytes(data), target_type, symbol_mapping=symbol_mapping, name=name) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

760  

761  

762cdef int _nvrtc_pch_apis_cached = -1 # -1 = unchecked 

763  

764cdef bint _has_nvrtc_pch_apis(): 

765 global _nvrtc_pch_apis_cached 

766 if _nvrtc_pch_apis_cached < 0: 1bag

767 _nvrtc_pch_apis_cached = hasattr(nvrtc, "nvrtcGetPCHCreateStatus") 1bg

768 return _nvrtc_pch_apis_cached 1bag

769  

770  

771cdef str _PCH_STATUS_CREATED = "created" 

772cdef str _PCH_STATUS_NOT_ATTEMPTED = "not_attempted" 

773cdef str _PCH_STATUS_FAILED = "failed" 

774  

775  

776cdef str _read_pch_status(cynvrtc.nvrtcProgram prog): 

777 """Query nvrtcGetPCHCreateStatus and translate to a high-level string.""" 

778 cdef cynvrtc.nvrtcResult err 

779 with nogil: 1bag

780 err = cynvrtc.nvrtcGetPCHCreateStatus(prog) 1bag

781 if err == cynvrtc.nvrtcResult.NVRTC_SUCCESS: 1bag

782 return _PCH_STATUS_CREATED 1bag

783 if err == cynvrtc.nvrtcResult.NVRTC_ERROR_PCH_CREATE_HEAP_EXHAUSTED: 

784 return None # sentinel: caller should auto-retry 

785 if err == cynvrtc.nvrtcResult.NVRTC_ERROR_NO_PCH_CREATE_ATTEMPTED: 

786 return _PCH_STATUS_NOT_ATTEMPTED 

787 return _PCH_STATUS_FAILED 

788  

789  

790cdef object Program_compile_nvrtc(Program self, str target_type, object name_expressions, object logs): 

791 """Compile using NVRTC backend and return ObjectCode.""" 

792 cdef cynvrtc.nvrtcProgram prog = as_cu(self._h_nvrtc) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

793 cdef list options_list = self._options.as_bytes("nvrtc", target_type) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

794  

795 result = _nvrtc_compile_and_extract( 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

796 prog, target_type, name_expressions, logs, options_list, self._options.name, 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

797 ) 

798  

799 cdef bint pch_creation_possible = self._options.create_pch or self._options.pch 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

800 if not pch_creation_possible or not _has_nvrtc_pch_apis(): 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

801 self._pch_status = None 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTddca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcAcBcmc,c-c

802 return result 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTddca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcAcBcmc,c-c

803  

804 try: 1bag

805 status = _read_pch_status(prog) 1bag

806 except RuntimeError as e: 

807 raise RuntimeError( 

808 "PCH was requested but the runtime libnvrtc does not support " 

809 "PCH APIs. Update to CUDA toolkit 12.8 or newer." 

810 ) from e 

811  

812 if status is not None: 1bag

813 self._pch_status = status 1bag

814 return result 1bag

815  

816 # Heap exhausted — auto-resize and retry with a fresh program 

817 cdef size_t required = 0 

818 with nogil: 

819 HANDLE_RETURN_NVRTC(prog, cynvrtc.nvrtcGetPCHHeapSizeRequired(prog, &required)) 

820 HANDLE_RETURN_NVRTC(NULL, cynvrtc.nvrtcSetPCHHeapSize(required)) 

821  

822 cdef cynvrtc.nvrtcProgram retry_prog 

823 cdef const char* code_ptr = <const char*>self._nvrtc_code 

824 cdef const char* name_ptr = <const char*>self._options._name 

825 with nogil: 

826 HANDLE_RETURN_NVRTC(NULL, cynvrtc.nvrtcCreateProgram( 

827 &retry_prog, code_ptr, name_ptr, 0, NULL, NULL)) 

828 self._h_nvrtc = create_nvrtc_program_handle(retry_prog) 

829  

830 result = _nvrtc_compile_and_extract( 

831 retry_prog, target_type, name_expressions, logs, options_list, self._options.name, 

832 ) 

833  

834 status = _read_pch_status(retry_prog) 

835 self._pch_status = status if status is not None else _PCH_STATUS_FAILED 

836 return result 

837  

838  

839cdef object Program_compile_nvvm(Program self, str target_type, object logs): 

840 """Compile using NVVM backend and return ObjectCode.""" 

841 cdef cynvvm.nvvmProgram prog = as_cu(self._h_nvvm) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

842 cdef size_t output_size = 0 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

843 cdef size_t logsize = 0 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

844 cdef vector[const char*] options_vec 

845 cdef char* data_ptr = NULL 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

846 cdef bytes libdevice_bytes 

847 cdef const char* libdevice_ptr 

848 cdef size_t libdevice_len 

849 # Build options array 

850 options_list = self._options.as_bytes("nvvm", target_type) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

851 options_vec.resize(len(options_list)) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

852 for i in range(len(options_list)): 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

853 options_vec[i] = <const char*>(<bytes>options_list[i]) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

854  

855 # Serialize NVVM program mutation/use per Program instance. 

856 with self._compile_lock: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

857 with nogil: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

858 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmVerifyProgram(prog, <int>options_vec.size(), options_vec.data())) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

859  

860 # Load libdevice if requested - following numba-cuda. 

861 if self._use_libdevice and not self._libdevice_added: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

862 libdevice_path = _find_libdevice_path() 

863 with open(libdevice_path, "rb") as f: 

864 libdevice_bytes = f.read() 

865 libdevice_ptr = <const char*>libdevice_bytes 

866 libdevice_len = len(libdevice_bytes) 

867 with nogil: 

868 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmLazyAddModuleToProgram( 

869 prog, libdevice_ptr, libdevice_len, NULL)) 

870 self._libdevice_added = True 

871  

872 with nogil: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

873 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmCompileProgram(prog, <int>options_vec.size(), options_vec.data())) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

874  

875 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmGetCompiledResultSize(prog, &output_size)) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

876 data = bytearray(output_size) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

877 data_ptr = <char*>(<bytearray>data) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

878 with nogil: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

879 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmGetCompiledResult(prog, data_ptr)) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

880  

881 # Get compilation log if requested 

882 if logs is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

883 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmGetProgramLogSize(prog, &logsize)) 

884 if logsize > 1: 

885 log = bytearray(logsize) 

886 data_ptr = <char*>(<bytearray>log) 

887 with nogil: 

888 HANDLE_RETURN_NVVM(prog, cynvvm.nvvmGetProgramLog(prog, data_ptr)) 

889 logs.write(log.decode("utf-8", errors="backslashreplace")) 

890  

891 return ObjectCode._init(bytes(data), target_type, name=self._options.name) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

892  

893# Supported target types per backend 

894cdef dict SUPPORTED_TARGETS = { 

895 "NVRTC": ("ptx", "cubin", "ltoir"), 

896 "NVVM": ("ptx", "ltoir"), 

897 "nvJitLink": ("cubin", "ptx"), 

898 "driver": ("cubin", "ptx"), 

899} 

900  

901  

902cdef object Program_compile(Program self, str target_type, object name_expressions, object logs): 

903 """Compile the program to the specified target type.""" 

904 # Validate target_type for this backend 

905 supported = SUPPORTED_TARGETS.get(self._backend) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f %d,c3d4d5d-c6d7d8d9d!d#d

906 if supported is None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f %d,c3d4d5d-c6d7d8d9d!d#d

907 raise ValueError(f'Unknown backend="{self._backend}"') 

908 if target_type not in supported: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc2d+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f %d,c3d4d5d-c6d7d8d9d!d#d

909 raise ValueError( 22d%d

910 f'Unsupported target_type="{target_type}" for {self._backend} ' 22d%d

911 f'(supported: {", ".join(repr(t) for t in supported)})' 22d%d

912 ) 

913  

914 if self._backend == "NVRTC": 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTd.c/cb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f ,c3d4d5d-c6d7d8d9d!d#d

915 if target_type == "ptx" and not _can_load_generated_ptx(): 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

916 warn( 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

917 "The CUDA driver version is older than the backend version. " 

918 "The generated ptx will not be loadable by the current driver.", 

919 stacklevel=2, 

920 category=RuntimeWarning, 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cO P b dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

921 ) 

922 return Program_compile_nvrtc(self, target_type, name_expressions, logs) 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,c-c

923  

924 elif self._backend == "NVVM": 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 3d4d5d6d7d8d9d!d#d

925 return Program_compile_nvvm(self, target_type, logs) 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f

926  

927 else: 

928 return self._linker.link(target_type) 23d4d5d6d7d8d9d!d#d

929  

930  

931cdef inline list _prepare_nvrtc_options_impl(object opts): 

932 """Build NVRTC-specific compiler options.""" 

933 options = [f"-arch={opts.arch}"] 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

934 if opts.relocatable_device_code is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

935 options.append(f"--relocatable-device-code={_handle_boolean_option(opts.relocatable_device_code)}") 2EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c9cgc

936 if opts.extensible_whole_program is not None and opts.extensible_whole_program: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

937 options.append("--extensible-whole-program") 2sc

938 if opts.debug is not None and opts.debug: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

939 options.append("--device-debug") 2fcZd

940 if opts.lineinfo is not None and opts.lineinfo: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

941 options.append("--generate-line-info") 2Zd

942 if opts.device_code_optimize is not None and opts.device_code_optimize: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

943 options.append("--dopt=on") 2fc

944 if opts.ptxas_options is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

945 opt_name = "--ptxas-options" 1ST

946 if isinstance(opts.ptxas_options, str): 1ST

947 options.append(f"{opt_name}={opts.ptxas_options}") 

948 elif is_sequence(opts.ptxas_options): 1ST

949 for opt_value in opts.ptxas_options: 1ST

950 options.append(f"{opt_name}={opt_value}") 1ST

951 if opts.max_register_count is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

952 options.append(f"--maxrregcount={opts.max_register_count}") 2gc

953 if opts.ftz is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

954 options.append(f"--ftz={_handle_boolean_option(opts.ftz)}") 2ecZd

955 if opts.prec_sqrt is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

956 options.append(f"--prec-sqrt={_handle_boolean_option(opts.prec_sqrt)}") 2ec

957 if opts.prec_div is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

958 options.append(f"--prec-div={_handle_boolean_option(opts.prec_div)}") 2ec

959 if opts.fma is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

960 options.append(f"--fmad={_handle_boolean_option(opts.fma)}") 2hc

961 if opts.use_fast_math is not None and opts.use_fast_math: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

962 options.append("--use_fast_math") 2hc

963 if opts.extra_device_vectorization is not None and opts.extra_device_vectorization: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

964 options.append("--extra-device-vectorization") 2nc

965 if opts.link_time_optimization is not None and opts.link_time_optimization: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

966 options.append("--dlink-time-opt") 2;cU V oc

967 if opts.gen_opt_lto is not None and opts.gen_opt_lto: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

968 options.append("--gen-opt-lto") 2uc

969 if opts.define_macro is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

970 _process_define_macro(options, opts.define_macro) 1Rhde

971 if opts.undefine_macro is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

972 if isinstance(opts.undefine_macro, str): 2acbc

973 options.append(f"--undefine-macro={opts.undefine_macro}") 2bc

974 elif is_sequence(opts.undefine_macro): 2ac

975 for macro in opts.undefine_macro: 2ac

976 options.append(f"--undefine-macro={macro}") 2ac

977 if opts.include_path is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

978 if isinstance(opts.include_path, str): 2%c'c(c)c*ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N bc

979 options.append(f"--include-path={opts.include_path}") 2bc

980 elif is_sequence(opts.include_path): 2%c'c(c)c*ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N

981 for path in opts.include_path: 2%c'c(c)c*ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N

982 options.append(f"--include-path={path}") 2%c'c(c)c*ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N

983 if opts.pre_include is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

984 if isinstance(opts.pre_include, str): 

985 options.append(f"--pre-include={opts.pre_include}") 

986 elif is_sequence(opts.pre_include): 

987 for header in opts.pre_include: 

988 options.append(f"--pre-include={header}") 

989 if opts.no_source_include is not None and opts.no_source_include: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

990 options.append("--no-source-include") 2wc

991 if opts.std is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

992 options.append(f"--std={opts.std}") 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N S T

993 if opts.builtin_move_forward is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

994 options.append(f"--builtin-move-forward={_handle_boolean_option(opts.builtin_move_forward)}") 2rc

995 if opts.builtin_initializer_list is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

996 options.append(f"--builtin-initializer-list={_handle_boolean_option(opts.builtin_initializer_list)}") 2ic

997 if opts.disable_warnings is not None and opts.disable_warnings: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

998 options.append("--disable-warnings") 2ic

999 if opts.restrict is not None and opts.restrict: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1000 options.append("--restrict") 2jc

1001 if opts.device_as_default_execution_space is not None and opts.device_as_default_execution_space: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1002 options.append("--device-as-default-execution-space") 2jc

1003 if opts.device_int128 is not None and opts.device_int128: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1004 options.append("--device-int128") 2kc

1005 if opts.device_float128 is not None and opts.device_float128: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1006 options.append("--device-float128") 

1007 if opts.optimization_info is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1008 options.append(f"--optimization-info={opts.optimization_info}") 2kc

1009 if opts.no_display_error_number is not None and opts.no_display_error_number: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1010 options.append("--no-display-error-number") 2pc

1011 if opts.diag_error is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1012 if isinstance(opts.diag_error, int): 2ccQ

1013 options.append(f"--diag-error={opts.diag_error}") 2cc

1014 elif is_sequence(opts.diag_error): 1Q

1015 for error in opts.diag_error: 1Q

1016 options.append(f"--diag-error={error}") 1Q

1017 if opts.diag_suppress is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1018 if isinstance(opts.diag_suppress, int): 2ccQ

1019 options.append(f"--diag-suppress={opts.diag_suppress}") 2cc

1020 elif is_sequence(opts.diag_suppress): 1Q

1021 for suppress in opts.diag_suppress: 1Q

1022 options.append(f"--diag-suppress={suppress}") 1Q

1023 if opts.diag_warn is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1024 if isinstance(opts.diag_warn, int): 2lc

1025 options.append(f"--diag-warn={opts.diag_warn}") 2lc

1026 elif is_sequence(opts.diag_warn): 

1027 for w in opts.diag_warn: 

1028 options.append(f"--diag-warn={w}") 

1029 if opts.brief_diagnostics is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1030 options.append(f"--brief-diagnostics={_handle_boolean_option(opts.brief_diagnostics)}") 2qc

1031 if opts.time is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1032 options.append(f"--time={opts.time}") 

1033 if opts.split_compile is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1034 options.append(f"--split-compile={opts.split_compile}") 

1035 if opts.fdevice_syntax_only is not None and opts.fdevice_syntax_only: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1036 options.append("--fdevice-syntax-only") 2tc

1037 if opts.minimal is not None and opts.minimal: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1038 options.append("--minimal") 2vc

1039 if opts.no_cache is not None and opts.no_cache: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1040 options.append("--no-cache") 2xc

1041 if opts.fdevice_time_trace is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1042 options.append(f"--fdevice-time-trace={opts.fdevice_time_trace}") 2~b

1043 if opts.frandom_seed is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1044 options.append(f"--frandom-seed={opts.frandom_seed}") 2yc

1045 if opts.ofast_compile is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1046 options.append(f"--Ofast-compile={opts.ofast_compile}") 2zc

1047 # PCH options (CUDA 12.8+) 

1048 if opts.pch is not None and opts.pch: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1049 options.append("--pch") 1g

1050 if opts.create_pch is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1051 options.append(f"--create-pch={opts.create_pch}") 1ba

1052 if opts.use_pch is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1053 options.append(f"--use-pch={opts.use_pch}") 1a

1054 if opts.pch_dir is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1055 options.append(f"--pch-dir={opts.pch_dir}") 

1056 if opts.pch_verbose is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1057 options.append(f"--pch-verbose={_handle_boolean_option(opts.pch_verbose)}") 2Ac

1058 if opts.pch_messages is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1059 options.append(f"--pch-messages={_handle_boolean_option(opts.pch_messages)}") 2Bc

1060 if opts.instantiate_templates_in_pch is not None: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1061 options.append( 2mc

1062 f"--instantiate-templates-in-pch={_handle_boolean_option(opts.instantiate_templates_in_pch)}" 2mc

1063 ) 

1064 if opts.numba_debug: 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1065 options.append("--numba-debug") 

1066 return [o.encode() for o in options] 2W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdb%c'c(c^c)c*c_ci j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N EcFcGcHcIcJcKcLcMcNcOcPcQcRcScTcUcVcWcXcYcZc0c1c2c3c4c5c6c7c8c;c9cebfbgbhb`cibjbkblbmbnbobpbqbrbsbtbubvbwbU V O P xbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbTbUbVbWbXbYbZb0b1b2b3b4b5b6b7b8b9b!b#b$b%b'b(b)b*b+b,b-b.b/b:b;b=b?b@b[b]b^b_b`b{b|b}b{c|c}c~cadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzdAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdb dca ~b!cfcgcechcncocR h d e acbcicjckcpcccQ lcS T qcrcsctcucvcwcxcyczcg AcBcmc,cZd-c

1067  

1068  

1069cdef inline object _prepare_nvvm_options_impl(object opts, bint as_bytes): 

1070 """Build NVVM-specific compiler options.""" 

1071 options = [] 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1072  

1073 # Options supported by NVVM 

1074 assert opts.arch is not None 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1075 arch = opts.arch 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1076 if arch.startswith("sm_"): 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1077 arch = f"compute_{arch[3:]}" 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1078 options.append(f"-arch={arch}") 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1079 if opts.debug is not None and opts.debug: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1080 options.append("-g") 20d

1081 if opts.device_code_optimize is False: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1082 options.append("-opt=0") 2=cUd?cVd[cXd

1083 elif opts.device_code_optimize is True: 2.c/c+c@cWdCc#cDc$c]cYdc f 1d0d

1084 options.append("-opt=3") 2Cc#cDc$c0d

1085 # NVVM uses 0/1 instead of true/false for boolean options 

1086 if opts.ftz is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1087 options.append(f"-ftz={'1' if opts.ftz else '0'}") 2Cc#cDc$c0d

1088 if opts.prec_sqrt is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1089 options.append(f"-prec-sqrt={'1' if opts.prec_sqrt else '0'}") 2Cc#cDc$c

1090 if opts.prec_div is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1091 options.append(f"-prec-div={'1' if opts.prec_div else '0'}") 2Cc#cDc$c

1092 if opts.fma is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1093 options.append(f"-fma={'1' if opts.fma else '0'}") 2Cc#cDc$c

1094  

1095 # Check for unsupported options and raise error if they are set 

1096 unsupported = [] 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1097 if opts.relocatable_device_code is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1098 unsupported.append("relocatable_device_code") 

1099 if opts.extensible_whole_program is not None and opts.extensible_whole_program: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1100 unsupported.append("extensible_whole_program") 

1101 if opts.lineinfo is not None and opts.lineinfo: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1102 unsupported.append("lineinfo") 21d

1103 if opts.ptxas_options is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1104 unsupported.append("ptxas_options") 

1105 if opts.max_register_count is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1106 unsupported.append("max_register_count") 

1107 if opts.use_fast_math is not None and opts.use_fast_math: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1108 unsupported.append("use_fast_math") 

1109 if opts.extra_device_vectorization is not None and opts.extra_device_vectorization: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1110 unsupported.append("extra_device_vectorization") 

1111 if opts.gen_opt_lto is not None and opts.gen_opt_lto: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1112 unsupported.append("gen_opt_lto") 

1113 if opts.define_macro is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1114 unsupported.append("define_macro") 

1115 if opts.undefine_macro is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1116 unsupported.append("undefine_macro") 

1117 if opts.include_path is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1118 unsupported.append("include_path") 

1119 if opts.pre_include is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1120 unsupported.append("pre_include") 

1121 if opts.no_source_include is not None and opts.no_source_include: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1122 unsupported.append("no_source_include") 

1123 if opts.std is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1124 unsupported.append("std") 

1125 if opts.builtin_move_forward is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1126 unsupported.append("builtin_move_forward") 

1127 if opts.builtin_initializer_list is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1128 unsupported.append("builtin_initializer_list") 

1129 if opts.disable_warnings is not None and opts.disable_warnings: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1130 unsupported.append("disable_warnings") 

1131 if opts.restrict is not None and opts.restrict: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1132 unsupported.append("restrict") 

1133 if opts.device_as_default_execution_space is not None and opts.device_as_default_execution_space: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1134 unsupported.append("device_as_default_execution_space") 

1135 if opts.device_int128 is not None and opts.device_int128: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1136 unsupported.append("device_int128") 

1137 if opts.optimization_info is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1138 unsupported.append("optimization_info") 

1139 if opts.no_display_error_number is not None and opts.no_display_error_number: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1140 unsupported.append("no_display_error_number") 

1141 if opts.diag_error is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1142 unsupported.append("diag_error") 

1143 if opts.diag_suppress is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1144 unsupported.append("diag_suppress") 

1145 if opts.diag_warn is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1146 unsupported.append("diag_warn") 

1147 if opts.brief_diagnostics is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1148 unsupported.append("brief_diagnostics") 

1149 if opts.time is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1150 unsupported.append("time") 

1151 if opts.split_compile is not None: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1152 unsupported.append("split_compile") 

1153 if opts.fdevice_syntax_only is not None and opts.fdevice_syntax_only: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1154 unsupported.append("fdevice_syntax_only") 

1155 if opts.minimal is not None and opts.minimal: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1156 unsupported.append("minimal") 

1157 if opts.numba_debug is not None and opts.numba_debug: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1158 unsupported.append("numba_debug") 

1159 if unsupported: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 1d0d

1160 raise CUDAError(f"The following options are not supported by NVVM backend: {', '.join(unsupported)}") 21d

1161  

1162 if as_bytes: 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 0d

1163 return [o.encode() for o in options] 2.c/c+c=cUd?cVd@cWdCc#c[cXdDc$c]cYdc f 0d

1164 else: 

1165 return options