# SPDX-FileCopyrightText: Copyright (c) 2024-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. # # SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE # # This code was automatically generated across versions from 12.0.1 to 12.9.1. Do not modify it directly. cimport cython # NOQA from ._internal.utils cimport (get_resource_ptr, get_nested_resource_ptr, nested_resource, nullable_unique_ptr, get_buffer_pointer, get_resource_ptrs) from enum import IntEnum as _IntEnum from libcpp.vector cimport vector ############################################################################### # Enum ############################################################################### class Result(_IntEnum): """See `nvJitLinkResult`.""" SUCCESS = NVJITLINK_SUCCESS ERROR_UNRECOGNIZED_OPTION = NVJITLINK_ERROR_UNRECOGNIZED_OPTION ERROR_MISSING_ARCH = NVJITLINK_ERROR_MISSING_ARCH ERROR_INVALID_INPUT = NVJITLINK_ERROR_INVALID_INPUT ERROR_PTX_COMPILE = NVJITLINK_ERROR_PTX_COMPILE ERROR_NVVM_COMPILE = NVJITLINK_ERROR_NVVM_COMPILE ERROR_INTERNAL = NVJITLINK_ERROR_INTERNAL ERROR_THREADPOOL = NVJITLINK_ERROR_THREADPOOL ERROR_UNRECOGNIZED_INPUT = NVJITLINK_ERROR_UNRECOGNIZED_INPUT ERROR_FINALIZE = NVJITLINK_ERROR_FINALIZE ERROR_NULL_INPUT = NVJITLINK_ERROR_NULL_INPUT ERROR_INCOMPATIBLE_OPTIONS = NVJITLINK_ERROR_INCOMPATIBLE_OPTIONS ERROR_INCORRECT_INPUT_TYPE = NVJITLINK_ERROR_INCORRECT_INPUT_TYPE ERROR_ARCH_MISMATCH = NVJITLINK_ERROR_ARCH_MISMATCH ERROR_OUTDATED_LIBRARY = NVJITLINK_ERROR_OUTDATED_LIBRARY ERROR_MISSING_FATBIN = NVJITLINK_ERROR_MISSING_FATBIN ERROR_UNRECOGNIZED_ARCH = NVJITLINK_ERROR_UNRECOGNIZED_ARCH ERROR_UNSUPPORTED_ARCH = NVJITLINK_ERROR_UNSUPPORTED_ARCH ERROR_LTO_NOT_ENABLED = NVJITLINK_ERROR_LTO_NOT_ENABLED class InputType(_IntEnum): """See `nvJitLinkInputType`.""" NONE = NVJITLINK_INPUT_NONE CUBIN = NVJITLINK_INPUT_CUBIN PTX = NVJITLINK_INPUT_PTX LTOIR = NVJITLINK_INPUT_LTOIR FATBIN = NVJITLINK_INPUT_FATBIN OBJECT = NVJITLINK_INPUT_OBJECT LIBRARY = NVJITLINK_INPUT_LIBRARY INDEX = NVJITLINK_INPUT_INDEX ANY = NVJITLINK_INPUT_ANY ############################################################################### # Error handling ############################################################################### class nvJitLinkError(Exception): def __init__(self, status): self.status = status s = Result(status) cdef str err = f"{s.name} ({s.value})" super(nvJitLinkError, self).__init__(err) def __reduce__(self): return (type(self), (self.status,)) @cython.profile(False) cdef int check_status(int status) except 1 nogil: if status != 0: with gil: raise nvJitLinkError(status) return status ############################################################################### # Wrapper functions ############################################################################### cpdef destroy(intptr_t handle): """nvJitLinkDestroy frees the memory associated with the given handle. Args: handle (intptr_t): nvJitLink handle. .. seealso:: `nvJitLinkDestroy` """ cdef Handle h = handle with nogil: status = nvJitLinkDestroy(&h) check_status(status) cpdef intptr_t create(uint32_t num_options, options) except -1: """nvJitLinkCreate creates an instance of nvJitLinkHandle with the given input options, and sets the output parameter ``handle``. Args: num_options (uint32_t): Number of options passed. options (object): Array of size ``num_options`` of option strings. It can be: - an :class:`int` as the pointer address to the nested sequence, or - a Python sequence of :class:`int`\s, each of which is a pointer address to a valid sequence of 'char', or - a nested Python sequence of ``str``. Returns: intptr_t: Address of nvJitLink handle. .. seealso:: `nvJitLinkCreate` """ cdef nested_resource[ char ] _options_ get_nested_resource_ptr[char](_options_, options, NULL) cdef Handle handle with nogil: status = nvJitLinkCreate(&handle, num_options, (_options_.ptrs.data())) check_status(status) return handle cpdef add_data(intptr_t handle, int input_type, data, size_t size, name): """nvJitLinkAddData adds data image to the link. Args: handle (intptr_t): nvJitLink handle. input_type (InputType): kind of input. data (bytes): pointer to data image in memory. size (size_t): size of the data. name (str): name of input object. .. seealso:: `nvJitLinkAddData` """ cdef void* _data_ = get_buffer_pointer(data, size, readonly=True) if not isinstance(name, str): raise TypeError("name must be a Python str") cdef bytes _temp_name_ = (name).encode() cdef char* _name_ = _temp_name_ with nogil: status = nvJitLinkAddData(handle, <_InputType>input_type, _data_, size, _name_) check_status(status) cpdef add_file(intptr_t handle, int input_type, file_name): """nvJitLinkAddFile reads data from file and links it in. Args: handle (intptr_t): nvJitLink handle. input_type (InputType): kind of input. file_name (str): name of file. .. seealso:: `nvJitLinkAddFile` """ if not isinstance(file_name, str): raise TypeError("file_name must be a Python str") cdef bytes _temp_file_name_ = (file_name).encode() cdef char* _file_name_ = _temp_file_name_ with nogil: status = nvJitLinkAddFile(handle, <_InputType>input_type, _file_name_) check_status(status) cpdef complete(intptr_t handle): """nvJitLinkComplete does the actual link. Args: handle (intptr_t): nvJitLink handle. .. seealso:: `nvJitLinkComplete` """ with nogil: status = nvJitLinkComplete(handle) check_status(status) cpdef size_t get_linked_cubin_size(intptr_t handle) except? 0: """nvJitLinkGetLinkedCubinSize gets the size of the linked cubin. Args: handle (intptr_t): nvJitLink handle. Returns: size_t: Size of the linked cubin. .. seealso:: `nvJitLinkGetLinkedCubinSize` """ cdef size_t size with nogil: status = nvJitLinkGetLinkedCubinSize(handle, &size) check_status(status) return size cpdef get_linked_cubin(intptr_t handle, cubin): """nvJitLinkGetLinkedCubin gets the linked cubin. Args: handle (intptr_t): nvJitLink handle. cubin (bytes): The linked cubin. .. seealso:: `nvJitLinkGetLinkedCubin` """ cdef void* _cubin_ = get_buffer_pointer(cubin, -1, readonly=False) with nogil: status = nvJitLinkGetLinkedCubin(handle, _cubin_) check_status(status) cpdef size_t get_linked_ptx_size(intptr_t handle) except? 0: """nvJitLinkGetLinkedPtxSize gets the size of the linked ptx. Args: handle (intptr_t): nvJitLink handle. Returns: size_t: Size of the linked PTX. .. seealso:: `nvJitLinkGetLinkedPtxSize` """ cdef size_t size with nogil: status = nvJitLinkGetLinkedPtxSize(handle, &size) check_status(status) return size cpdef get_linked_ptx(intptr_t handle, ptx): """nvJitLinkGetLinkedPtx gets the linked ptx. Args: handle (intptr_t): nvJitLink handle. ptx (bytes): The linked PTX. .. seealso:: `nvJitLinkGetLinkedPtx` """ cdef void* _ptx_ = get_buffer_pointer(ptx, -1, readonly=False) with nogil: status = nvJitLinkGetLinkedPtx(handle, _ptx_) check_status(status) cpdef size_t get_error_log_size(intptr_t handle) except? 0: """nvJitLinkGetErrorLogSize gets the size of the error log. Args: handle (intptr_t): nvJitLink handle. Returns: size_t: Size of the error log. .. seealso:: `nvJitLinkGetErrorLogSize` """ cdef size_t size with nogil: status = nvJitLinkGetErrorLogSize(handle, &size) check_status(status) return size cpdef get_error_log(intptr_t handle, log): """nvJitLinkGetErrorLog puts any error messages in the log. Args: handle (intptr_t): nvJitLink handle. log (bytes): The error log. .. seealso:: `nvJitLinkGetErrorLog` """ cdef void* _log_ = get_buffer_pointer(log, -1, readonly=False) with nogil: status = nvJitLinkGetErrorLog(handle, _log_) check_status(status) cpdef size_t get_info_log_size(intptr_t handle) except? 0: """nvJitLinkGetInfoLogSize gets the size of the info log. Args: handle (intptr_t): nvJitLink handle. Returns: size_t: Size of the info log. .. seealso:: `nvJitLinkGetInfoLogSize` """ cdef size_t size with nogil: status = nvJitLinkGetInfoLogSize(handle, &size) check_status(status) return size cpdef get_info_log(intptr_t handle, log): """nvJitLinkGetInfoLog puts any info messages in the log. Args: handle (intptr_t): nvJitLink handle. log (bytes): The info log. .. seealso:: `nvJitLinkGetInfoLog` """ cdef void* _log_ = get_buffer_pointer(log, -1, readonly=False) with nogil: status = nvJitLinkGetInfoLog(handle, _log_) check_status(status) cpdef tuple version(): """nvJitLinkVersion returns the current version of nvJitLink. Returns: A 2-tuple containing: - unsigned int: The major version. - unsigned int: The minor version. .. seealso:: `nvJitLinkVersion` """ cdef unsigned int major cdef unsigned int minor with nogil: status = nvJitLinkVersion(&major, &minor) check_status(status) return (major, minor)