numba-cuda 0.22.0__cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of numba-cuda might be problematic. Click here for more details.
- _numba_cuda_redirector.pth +4 -0
- _numba_cuda_redirector.py +89 -0
- numba_cuda/VERSION +1 -0
- numba_cuda/__init__.py +6 -0
- numba_cuda/_version.py +11 -0
- numba_cuda/numba/cuda/__init__.py +70 -0
- numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
- numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
- numba_cuda/numba/cuda/api.py +580 -0
- numba_cuda/numba/cuda/api_util.py +76 -0
- numba_cuda/numba/cuda/args.py +72 -0
- numba_cuda/numba/cuda/bf16.py +397 -0
- numba_cuda/numba/cuda/cache_hints.py +287 -0
- numba_cuda/numba/cuda/cext/__init__.py +2 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
- numba_cuda/numba/cuda/cext/_devicearray.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
- numba_cuda/numba/cuda/cext/_dispatcher.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
- numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
- numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
- numba_cuda/numba/cuda/cext/_helperlib.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
- numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
- numba_cuda/numba/cuda/cext/_typeconv.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
- numba_cuda/numba/cuda/cext/_typeof.h +19 -0
- numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
- numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
- numba_cuda/numba/cuda/cext/mviewbuf.cpython-312-aarch64-linux-gnu.so +0 -0
- numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
- numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
- numba_cuda/numba/cuda/cg.py +67 -0
- numba_cuda/numba/cuda/cgutils.py +1294 -0
- numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
- numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
- numba_cuda/numba/cuda/codegen.py +541 -0
- numba_cuda/numba/cuda/compiler.py +1396 -0
- numba_cuda/numba/cuda/core/analysis.py +758 -0
- numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
- numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
- numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
- numba_cuda/numba/cuda/core/base.py +1332 -0
- numba_cuda/numba/cuda/core/boxing.py +1411 -0
- numba_cuda/numba/cuda/core/bytecode.py +728 -0
- numba_cuda/numba/cuda/core/byteflow.py +2346 -0
- numba_cuda/numba/cuda/core/caching.py +744 -0
- numba_cuda/numba/cuda/core/callconv.py +392 -0
- numba_cuda/numba/cuda/core/codegen.py +171 -0
- numba_cuda/numba/cuda/core/compiler.py +199 -0
- numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
- numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
- numba_cuda/numba/cuda/core/config.py +650 -0
- numba_cuda/numba/cuda/core/consts.py +124 -0
- numba_cuda/numba/cuda/core/controlflow.py +989 -0
- numba_cuda/numba/cuda/core/entrypoints.py +57 -0
- numba_cuda/numba/cuda/core/environment.py +66 -0
- numba_cuda/numba/cuda/core/errors.py +917 -0
- numba_cuda/numba/cuda/core/event.py +511 -0
- numba_cuda/numba/cuda/core/funcdesc.py +330 -0
- numba_cuda/numba/cuda/core/generators.py +387 -0
- numba_cuda/numba/cuda/core/imputils.py +509 -0
- numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
- numba_cuda/numba/cuda/core/interpreter.py +3617 -0
- numba_cuda/numba/cuda/core/ir.py +1812 -0
- numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
- numba_cuda/numba/cuda/core/optional.py +129 -0
- numba_cuda/numba/cuda/core/options.py +262 -0
- numba_cuda/numba/cuda/core/postproc.py +249 -0
- numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
- numba_cuda/numba/cuda/core/registry.py +46 -0
- numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
- numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
- numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
- numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
- numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
- numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
- numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
- numba_cuda/numba/cuda/core/sigutils.py +68 -0
- numba_cuda/numba/cuda/core/ssa.py +498 -0
- numba_cuda/numba/cuda/core/targetconfig.py +330 -0
- numba_cuda/numba/cuda/core/tracing.py +231 -0
- numba_cuda/numba/cuda/core/transforms.py +956 -0
- numba_cuda/numba/cuda/core/typed_passes.py +867 -0
- numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
- numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
- numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
- numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
- numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
- numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
- numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
- numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
- numba_cuda/numba/cuda/cpython/iterators.py +167 -0
- numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
- numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
- numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
- numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
- numba_cuda/numba/cuda/cpython/slicing.py +322 -0
- numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
- numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
- numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
- numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
- numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
- numba_cuda/numba/cuda/cuda_paths.py +691 -0
- numba_cuda/numba/cuda/cudadecl.py +543 -0
- numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
- numba_cuda/numba/cuda/cudadrv/devicearray.py +954 -0
- numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
- numba_cuda/numba/cuda/cudadrv/driver.py +3238 -0
- numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
- numba_cuda/numba/cuda/cudadrv/dummyarray.py +562 -0
- numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
- numba_cuda/numba/cuda/cudadrv/error.py +48 -0
- numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
- numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
- numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
- numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
- numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
- numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
- numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
- numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
- numba_cuda/numba/cuda/cudaimpl.py +983 -0
- numba_cuda/numba/cuda/cudamath.py +149 -0
- numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
- numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
- numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
- numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
- numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
- numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
- numba_cuda/numba/cuda/datamodel/manager.py +11 -0
- numba_cuda/numba/cuda/datamodel/models.py +9 -0
- numba_cuda/numba/cuda/datamodel/packer.py +9 -0
- numba_cuda/numba/cuda/datamodel/registry.py +11 -0
- numba_cuda/numba/cuda/datamodel/testing.py +11 -0
- numba_cuda/numba/cuda/debuginfo.py +997 -0
- numba_cuda/numba/cuda/decorators.py +294 -0
- numba_cuda/numba/cuda/descriptor.py +35 -0
- numba_cuda/numba/cuda/device_init.py +155 -0
- numba_cuda/numba/cuda/deviceufunc.py +1021 -0
- numba_cuda/numba/cuda/dispatcher.py +2463 -0
- numba_cuda/numba/cuda/errors.py +72 -0
- numba_cuda/numba/cuda/extending.py +697 -0
- numba_cuda/numba/cuda/flags.py +178 -0
- numba_cuda/numba/cuda/fp16.py +357 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
- numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
- numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
- numba_cuda/numba/cuda/initialize.py +24 -0
- numba_cuda/numba/cuda/intrinsics.py +531 -0
- numba_cuda/numba/cuda/itanium_mangler.py +214 -0
- numba_cuda/numba/cuda/kernels/__init__.py +2 -0
- numba_cuda/numba/cuda/kernels/reduction.py +265 -0
- numba_cuda/numba/cuda/kernels/transpose.py +65 -0
- numba_cuda/numba/cuda/libdevice.py +3386 -0
- numba_cuda/numba/cuda/libdevicedecl.py +20 -0
- numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
- numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
- numba_cuda/numba/cuda/locks.py +19 -0
- numba_cuda/numba/cuda/lowering.py +1980 -0
- numba_cuda/numba/cuda/mathimpl.py +374 -0
- numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
- numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
- numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
- numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
- numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
- numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
- numba_cuda/numba/cuda/misc/appdirs.py +594 -0
- numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
- numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
- numba_cuda/numba/cuda/misc/dump_style.py +41 -0
- numba_cuda/numba/cuda/misc/findlib.py +75 -0
- numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
- numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
- numba_cuda/numba/cuda/misc/literal.py +28 -0
- numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
- numba_cuda/numba/cuda/misc/special.py +94 -0
- numba_cuda/numba/cuda/models.py +56 -0
- numba_cuda/numba/cuda/np/arraymath.py +5130 -0
- numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
- numba_cuda/numba/cuda/np/extensions.py +11 -0
- numba_cuda/numba/cuda/np/linalg.py +3087 -0
- numba_cuda/numba/cuda/np/math/__init__.py +0 -0
- numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
- numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
- numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
- numba_cuda/numba/cuda/np/npdatetime.py +969 -0
- numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
- numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
- numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
- numba_cuda/numba/cuda/np/numpy_support.py +798 -0
- numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
- numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
- numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
- numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
- numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
- numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
- numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
- numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
- numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
- numba_cuda/numba/cuda/nvvmutils.py +254 -0
- numba_cuda/numba/cuda/printimpl.py +126 -0
- numba_cuda/numba/cuda/random.py +308 -0
- numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
- numba_cuda/numba/cuda/serialize.py +267 -0
- numba_cuda/numba/cuda/simulator/__init__.py +63 -0
- numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
- numba_cuda/numba/cuda/simulator/api.py +179 -0
- numba_cuda/numba/cuda/simulator/bf16.py +4 -0
- numba_cuda/numba/cuda/simulator/compiler.py +38 -0
- numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
- numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
- numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
- numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
- numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
- numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
- numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
- numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
- numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
- numba_cuda/numba/cuda/simulator/kernel.py +320 -0
- numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
- numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
- numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
- numba_cuda/numba/cuda/simulator/reduction.py +19 -0
- numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
- numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
- numba_cuda/numba/cuda/simulator_init.py +18 -0
- numba_cuda/numba/cuda/stubs.py +624 -0
- numba_cuda/numba/cuda/target.py +505 -0
- numba_cuda/numba/cuda/testing.py +347 -0
- numba_cuda/numba/cuda/tests/__init__.py +62 -0
- numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
- numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
- numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
- numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
- numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
- numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
- numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +191 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +200 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
- numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
- numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
- numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
- numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
- numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
- numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
- numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
- numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
- numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
- numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
- numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
- numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
- numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
- numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
- numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
- numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
- numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
- numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
- numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
- numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
- numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +978 -0
- numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
- numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
- numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
- numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
- numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
- numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
- numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
- numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
- numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
- numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
- numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
- numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
- numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
- numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
- numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
- numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
- numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
- numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
- numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
- numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
- numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
- numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
- numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
- numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
- numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
- numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
- numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
- numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
- numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
- numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
- numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
- numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
- numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
- numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
- numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
- numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
- numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
- numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
- numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
- numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
- numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
- numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
- numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
- numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
- numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
- numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
- numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
- numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
- numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
- numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
- numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +446 -0
- numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
- numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
- numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
- numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
- numba_cuda/numba/cuda/tests/data/error.cu +12 -0
- numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
- numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
- numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
- numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
- numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
- numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
- numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
- numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +452 -0
- numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
- numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
- numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
- numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
- numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
- numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
- numba_cuda/numba/cuda/tests/support.py +900 -0
- numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
- numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
- numba_cuda/numba/cuda/typeconv/rules.py +63 -0
- numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
- numba_cuda/numba/cuda/types/__init__.py +233 -0
- numba_cuda/numba/cuda/types/__init__.pyi +167 -0
- numba_cuda/numba/cuda/types/abstract.py +9 -0
- numba_cuda/numba/cuda/types/common.py +9 -0
- numba_cuda/numba/cuda/types/containers.py +9 -0
- numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
- numba_cuda/numba/cuda/types/cuda_common.py +110 -0
- numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
- numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
- numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
- numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
- numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
- numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
- numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
- numba_cuda/numba/cuda/types/ext_types.py +101 -0
- numba_cuda/numba/cuda/types/function_type.py +11 -0
- numba_cuda/numba/cuda/types/functions.py +9 -0
- numba_cuda/numba/cuda/types/iterators.py +9 -0
- numba_cuda/numba/cuda/types/misc.py +9 -0
- numba_cuda/numba/cuda/types/npytypes.py +9 -0
- numba_cuda/numba/cuda/types/scalars.py +9 -0
- numba_cuda/numba/cuda/typing/__init__.py +19 -0
- numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
- numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
- numba_cuda/numba/cuda/typing/bufproto.py +70 -0
- numba_cuda/numba/cuda/typing/builtins.py +1209 -0
- numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
- numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
- numba_cuda/numba/cuda/typing/collections.py +138 -0
- numba_cuda/numba/cuda/typing/context.py +782 -0
- numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
- numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
- numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
- numba_cuda/numba/cuda/typing/listdecl.py +147 -0
- numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
- numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
- numba_cuda/numba/cuda/typing/npydecl.py +749 -0
- numba_cuda/numba/cuda/typing/setdecl.py +115 -0
- numba_cuda/numba/cuda/typing/templates.py +1446 -0
- numba_cuda/numba/cuda/typing/typeof.py +301 -0
- numba_cuda/numba/cuda/ufuncs.py +746 -0
- numba_cuda/numba/cuda/utils.py +724 -0
- numba_cuda/numba/cuda/vector_types.py +214 -0
- numba_cuda/numba/cuda/vectorizers.py +260 -0
- numba_cuda-0.22.0.dist-info/METADATA +109 -0
- numba_cuda-0.22.0.dist-info/RECORD +487 -0
- numba_cuda-0.22.0.dist-info/WHEEL +6 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE +26 -0
- numba_cuda-0.22.0.dist-info/licenses/LICENSE.numba +24 -0
- numba_cuda-0.22.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: BSD-2-Clause
|
|
3
|
+
|
|
4
|
+
import functools
|
|
5
|
+
from collections import namedtuple
|
|
6
|
+
|
|
7
|
+
from llvmlite import ir
|
|
8
|
+
from numba.cuda import types
|
|
9
|
+
from numba.cuda.core import errors
|
|
10
|
+
from numba.cuda import cgutils, config
|
|
11
|
+
from numba.cuda.utils import PYVERSION
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
_NRT_Meminfo_Functions = namedtuple(
|
|
15
|
+
"_NRT_Meminfo_Functions", ("alloc", "alloc_dtor", "alloc_aligned")
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
_NRT_MEMINFO_SAFE_API = _NRT_Meminfo_Functions(
|
|
20
|
+
"NRT_MemInfo_alloc_safe",
|
|
21
|
+
"NRT_MemInfo_alloc_dtor_safe",
|
|
22
|
+
"NRT_MemInfo_alloc_safe_aligned",
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
_NRT_MEMINFO_DEFAULT_API = _NRT_Meminfo_Functions(
|
|
27
|
+
"NRT_MemInfo_alloc", "NRT_MemInfo_alloc_dtor", "NRT_MemInfo_alloc_aligned"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
_pointer_type = ir.PointerType(ir.IntType(8))
|
|
31
|
+
incref_decref_ty = ir.FunctionType(ir.VoidType(), [_pointer_type])
|
|
32
|
+
meminfo_data_ty = ir.FunctionType(_pointer_type, [_pointer_type])
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class NRTContext(object):
|
|
36
|
+
"""
|
|
37
|
+
An object providing access to NRT APIs in the lowering pass.
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, context, enabled):
|
|
41
|
+
self._context = context
|
|
42
|
+
self._enabled = enabled
|
|
43
|
+
# If DEBUG_NRT is set, use the safe function variants which use memset
|
|
44
|
+
# to inject a few known bytes into the start of allocated regions.
|
|
45
|
+
if config.DEBUG_NRT:
|
|
46
|
+
self._meminfo_api = _NRT_MEMINFO_SAFE_API
|
|
47
|
+
else:
|
|
48
|
+
self._meminfo_api = _NRT_MEMINFO_DEFAULT_API
|
|
49
|
+
|
|
50
|
+
def _require_nrt(self):
|
|
51
|
+
if not self._enabled:
|
|
52
|
+
raise errors.NumbaRuntimeError("NRT required but not enabled")
|
|
53
|
+
|
|
54
|
+
def _check_null_result(func):
|
|
55
|
+
@functools.wraps(func)
|
|
56
|
+
def wrap(self, builder, *args, **kwargs):
|
|
57
|
+
memptr = func(self, builder, *args, **kwargs)
|
|
58
|
+
msg = "Allocation failed (probably too large)."
|
|
59
|
+
cgutils.guard_memory_error(self._context, builder, memptr, msg=msg)
|
|
60
|
+
return memptr
|
|
61
|
+
|
|
62
|
+
return wrap
|
|
63
|
+
|
|
64
|
+
@_check_null_result
|
|
65
|
+
def allocate(self, builder, size):
|
|
66
|
+
"""
|
|
67
|
+
Low-level allocate a new memory area of `size` bytes. The result of the
|
|
68
|
+
call is checked and if it is NULL, i.e. allocation failed, then a
|
|
69
|
+
MemoryError is raised.
|
|
70
|
+
"""
|
|
71
|
+
return self.allocate_unchecked(builder, size)
|
|
72
|
+
|
|
73
|
+
def allocate_unchecked(self, builder, size):
|
|
74
|
+
"""
|
|
75
|
+
Low-level allocate a new memory area of `size` bytes. Returns NULL to
|
|
76
|
+
indicate error/failure to allocate.
|
|
77
|
+
"""
|
|
78
|
+
self._require_nrt()
|
|
79
|
+
|
|
80
|
+
mod = builder.module
|
|
81
|
+
fnty = ir.FunctionType(cgutils.voidptr_t, [cgutils.intp_t])
|
|
82
|
+
fn = cgutils.get_or_insert_function(mod, fnty, "NRT_Allocate")
|
|
83
|
+
fn.return_value.add_attribute("noalias")
|
|
84
|
+
return builder.call(fn, [size])
|
|
85
|
+
|
|
86
|
+
def free(self, builder, ptr):
|
|
87
|
+
"""
|
|
88
|
+
Low-level free a memory area allocated with allocate().
|
|
89
|
+
"""
|
|
90
|
+
self._require_nrt()
|
|
91
|
+
|
|
92
|
+
mod = builder.module
|
|
93
|
+
fnty = ir.FunctionType(ir.VoidType(), [cgutils.voidptr_t])
|
|
94
|
+
fn = cgutils.get_or_insert_function(mod, fnty, "NRT_Free")
|
|
95
|
+
return builder.call(fn, [ptr])
|
|
96
|
+
|
|
97
|
+
@_check_null_result
|
|
98
|
+
def meminfo_alloc(self, builder, size):
|
|
99
|
+
"""
|
|
100
|
+
Allocate a new MemInfo with a data payload of `size` bytes.
|
|
101
|
+
|
|
102
|
+
A pointer to the MemInfo is returned.
|
|
103
|
+
|
|
104
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
105
|
+
failed, then a MemoryError is raised.
|
|
106
|
+
"""
|
|
107
|
+
return self.meminfo_alloc_unchecked(builder, size)
|
|
108
|
+
|
|
109
|
+
def meminfo_alloc_unchecked(self, builder, size):
|
|
110
|
+
"""
|
|
111
|
+
Allocate a new MemInfo with a data payload of `size` bytes.
|
|
112
|
+
|
|
113
|
+
A pointer to the MemInfo is returned.
|
|
114
|
+
|
|
115
|
+
Returns NULL to indicate error/failure to allocate.
|
|
116
|
+
"""
|
|
117
|
+
self._require_nrt()
|
|
118
|
+
|
|
119
|
+
mod = builder.module
|
|
120
|
+
fnty = ir.FunctionType(cgutils.voidptr_t, [cgutils.intp_t])
|
|
121
|
+
fn = cgutils.get_or_insert_function(mod, fnty, self._meminfo_api.alloc)
|
|
122
|
+
fn.return_value.add_attribute("noalias")
|
|
123
|
+
return builder.call(fn, [size])
|
|
124
|
+
|
|
125
|
+
@_check_null_result
|
|
126
|
+
def meminfo_alloc_dtor(self, builder, size, dtor):
|
|
127
|
+
"""
|
|
128
|
+
Allocate a new MemInfo with a data payload of `size` bytes and a
|
|
129
|
+
destructor `dtor`.
|
|
130
|
+
|
|
131
|
+
A pointer to the MemInfo is returned.
|
|
132
|
+
|
|
133
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
134
|
+
failed, then a MemoryError is raised.
|
|
135
|
+
"""
|
|
136
|
+
return self.meminfo_alloc_dtor_unchecked(builder, size, dtor)
|
|
137
|
+
|
|
138
|
+
def meminfo_alloc_dtor_unchecked(self, builder, size, dtor):
|
|
139
|
+
"""
|
|
140
|
+
Allocate a new MemInfo with a data payload of `size` bytes and a
|
|
141
|
+
destructor `dtor`.
|
|
142
|
+
|
|
143
|
+
A pointer to the MemInfo is returned.
|
|
144
|
+
|
|
145
|
+
Returns NULL to indicate error/failure to allocate.
|
|
146
|
+
"""
|
|
147
|
+
self._require_nrt()
|
|
148
|
+
|
|
149
|
+
mod = builder.module
|
|
150
|
+
fnty = ir.FunctionType(
|
|
151
|
+
cgutils.voidptr_t, [cgutils.intp_t, cgutils.voidptr_t]
|
|
152
|
+
)
|
|
153
|
+
fn = cgutils.get_or_insert_function(
|
|
154
|
+
mod, fnty, self._meminfo_api.alloc_dtor
|
|
155
|
+
)
|
|
156
|
+
fn.return_value.add_attribute("noalias")
|
|
157
|
+
return builder.call(
|
|
158
|
+
fn, [size, builder.bitcast(dtor, cgutils.voidptr_t)]
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
@_check_null_result
|
|
162
|
+
def meminfo_alloc_aligned(self, builder, size, align):
|
|
163
|
+
"""
|
|
164
|
+
Allocate a new MemInfo with an aligned data payload of `size` bytes.
|
|
165
|
+
The data pointer is aligned to `align` bytes. `align` can be either
|
|
166
|
+
a Python int or a LLVM uint32 value.
|
|
167
|
+
|
|
168
|
+
A pointer to the MemInfo is returned.
|
|
169
|
+
|
|
170
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
171
|
+
failed, then a MemoryError is raised.
|
|
172
|
+
"""
|
|
173
|
+
return self.meminfo_alloc_aligned_unchecked(builder, size, align)
|
|
174
|
+
|
|
175
|
+
def meminfo_alloc_aligned_unchecked(self, builder, size, align):
|
|
176
|
+
"""
|
|
177
|
+
Allocate a new MemInfo with an aligned data payload of `size` bytes.
|
|
178
|
+
The data pointer is aligned to `align` bytes. `align` can be either
|
|
179
|
+
a Python int or a LLVM uint32 value.
|
|
180
|
+
|
|
181
|
+
A pointer to the MemInfo is returned.
|
|
182
|
+
|
|
183
|
+
Returns NULL to indicate error/failure to allocate.
|
|
184
|
+
"""
|
|
185
|
+
self._require_nrt()
|
|
186
|
+
|
|
187
|
+
mod = builder.module
|
|
188
|
+
u32 = ir.IntType(32)
|
|
189
|
+
fnty = ir.FunctionType(cgutils.voidptr_t, [cgutils.intp_t, u32])
|
|
190
|
+
fn = cgutils.get_or_insert_function(
|
|
191
|
+
mod, fnty, self._meminfo_api.alloc_aligned
|
|
192
|
+
)
|
|
193
|
+
fn.return_value.add_attribute("noalias")
|
|
194
|
+
if isinstance(align, int):
|
|
195
|
+
align = self._context.get_constant(types.uint32, align)
|
|
196
|
+
else:
|
|
197
|
+
assert align.type == u32, "align must be a uint32"
|
|
198
|
+
return builder.call(fn, [size, align])
|
|
199
|
+
|
|
200
|
+
@_check_null_result
|
|
201
|
+
def meminfo_new_varsize(self, builder, size):
|
|
202
|
+
"""
|
|
203
|
+
Allocate a MemInfo pointing to a variable-sized data area. The area
|
|
204
|
+
is separately allocated (i.e. two allocations are made) so that
|
|
205
|
+
re-allocating it doesn't change the MemInfo's address.
|
|
206
|
+
|
|
207
|
+
A pointer to the MemInfo is returned.
|
|
208
|
+
|
|
209
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
210
|
+
failed, then a MemoryError is raised.
|
|
211
|
+
"""
|
|
212
|
+
return self.meminfo_new_varsize_unchecked(builder, size)
|
|
213
|
+
|
|
214
|
+
def meminfo_new_varsize_unchecked(self, builder, size):
|
|
215
|
+
"""
|
|
216
|
+
Allocate a MemInfo pointing to a variable-sized data area. The area
|
|
217
|
+
is separately allocated (i.e. two allocations are made) so that
|
|
218
|
+
re-allocating it doesn't change the MemInfo's address.
|
|
219
|
+
|
|
220
|
+
A pointer to the MemInfo is returned.
|
|
221
|
+
|
|
222
|
+
Returns NULL to indicate error/failure to allocate.
|
|
223
|
+
"""
|
|
224
|
+
self._require_nrt()
|
|
225
|
+
|
|
226
|
+
mod = builder.module
|
|
227
|
+
fnty = ir.FunctionType(cgutils.voidptr_t, [cgutils.intp_t])
|
|
228
|
+
fn = cgutils.get_or_insert_function(
|
|
229
|
+
mod, fnty, "NRT_MemInfo_new_varsize"
|
|
230
|
+
)
|
|
231
|
+
fn.return_value.add_attribute("noalias")
|
|
232
|
+
return builder.call(fn, [size])
|
|
233
|
+
|
|
234
|
+
@_check_null_result
|
|
235
|
+
def meminfo_new_varsize_dtor(self, builder, size, dtor):
|
|
236
|
+
"""
|
|
237
|
+
Like meminfo_new_varsize() but also set the destructor for
|
|
238
|
+
cleaning up references to objects inside the allocation.
|
|
239
|
+
|
|
240
|
+
A pointer to the MemInfo is returned.
|
|
241
|
+
|
|
242
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
243
|
+
failed, then a MemoryError is raised.
|
|
244
|
+
"""
|
|
245
|
+
return self.meminfo_new_varsize_dtor_unchecked(builder, size, dtor)
|
|
246
|
+
|
|
247
|
+
def meminfo_new_varsize_dtor_unchecked(self, builder, size, dtor):
|
|
248
|
+
"""
|
|
249
|
+
Like meminfo_new_varsize() but also set the destructor for
|
|
250
|
+
cleaning up references to objects inside the allocation.
|
|
251
|
+
|
|
252
|
+
A pointer to the MemInfo is returned.
|
|
253
|
+
|
|
254
|
+
Returns NULL to indicate error/failure to allocate.
|
|
255
|
+
"""
|
|
256
|
+
self._require_nrt()
|
|
257
|
+
|
|
258
|
+
mod = builder.module
|
|
259
|
+
fnty = ir.FunctionType(
|
|
260
|
+
cgutils.voidptr_t, [cgutils.intp_t, cgutils.voidptr_t]
|
|
261
|
+
)
|
|
262
|
+
fn = cgutils.get_or_insert_function(
|
|
263
|
+
mod, fnty, "NRT_MemInfo_new_varsize_dtor"
|
|
264
|
+
)
|
|
265
|
+
return builder.call(fn, [size, dtor])
|
|
266
|
+
|
|
267
|
+
@_check_null_result
|
|
268
|
+
def meminfo_varsize_alloc(self, builder, meminfo, size):
|
|
269
|
+
"""
|
|
270
|
+
Allocate a new data area for a MemInfo created by meminfo_new_varsize().
|
|
271
|
+
The new data pointer is returned, for convenience.
|
|
272
|
+
|
|
273
|
+
Contrary to realloc(), this always allocates a new area and doesn't
|
|
274
|
+
copy the old data. This is useful if resizing a container needs
|
|
275
|
+
more than simply copying the data area (e.g. for hash tables).
|
|
276
|
+
|
|
277
|
+
The old pointer will have to be freed with meminfo_varsize_free().
|
|
278
|
+
|
|
279
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
280
|
+
failed, then a MemoryError is raised.
|
|
281
|
+
"""
|
|
282
|
+
return self.meminfo_varsize_alloc_unchecked(builder, meminfo, size)
|
|
283
|
+
|
|
284
|
+
def meminfo_varsize_alloc_unchecked(self, builder, meminfo, size):
|
|
285
|
+
"""
|
|
286
|
+
Allocate a new data area for a MemInfo created by meminfo_new_varsize().
|
|
287
|
+
The new data pointer is returned, for convenience.
|
|
288
|
+
|
|
289
|
+
Contrary to realloc(), this always allocates a new area and doesn't
|
|
290
|
+
copy the old data. This is useful if resizing a container needs
|
|
291
|
+
more than simply copying the data area (e.g. for hash tables).
|
|
292
|
+
|
|
293
|
+
The old pointer will have to be freed with meminfo_varsize_free().
|
|
294
|
+
|
|
295
|
+
Returns NULL to indicate error/failure to allocate.
|
|
296
|
+
"""
|
|
297
|
+
return self._call_varsize_alloc(
|
|
298
|
+
builder, meminfo, size, "NRT_MemInfo_varsize_alloc"
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
@_check_null_result
|
|
302
|
+
def meminfo_varsize_realloc(self, builder, meminfo, size):
|
|
303
|
+
"""
|
|
304
|
+
Reallocate a data area allocated by meminfo_new_varsize().
|
|
305
|
+
The new data pointer is returned, for convenience.
|
|
306
|
+
|
|
307
|
+
The result of the call is checked and if it is NULL, i.e. allocation
|
|
308
|
+
failed, then a MemoryError is raised.
|
|
309
|
+
"""
|
|
310
|
+
return self.meminfo_varsize_realloc_unchecked(builder, meminfo, size)
|
|
311
|
+
|
|
312
|
+
def meminfo_varsize_realloc_unchecked(self, builder, meminfo, size):
|
|
313
|
+
"""
|
|
314
|
+
Reallocate a data area allocated by meminfo_new_varsize().
|
|
315
|
+
The new data pointer is returned, for convenience.
|
|
316
|
+
|
|
317
|
+
Returns NULL to indicate error/failure to allocate.
|
|
318
|
+
"""
|
|
319
|
+
return self._call_varsize_alloc(
|
|
320
|
+
builder, meminfo, size, "NRT_MemInfo_varsize_realloc"
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
def meminfo_varsize_free(self, builder, meminfo, ptr):
|
|
324
|
+
"""
|
|
325
|
+
Free a memory area allocated for a NRT varsize object.
|
|
326
|
+
Note this does *not* free the NRT object itself!
|
|
327
|
+
"""
|
|
328
|
+
self._require_nrt()
|
|
329
|
+
|
|
330
|
+
mod = builder.module
|
|
331
|
+
fnty = ir.FunctionType(
|
|
332
|
+
ir.VoidType(), [cgutils.voidptr_t, cgutils.voidptr_t]
|
|
333
|
+
)
|
|
334
|
+
fn = cgutils.get_or_insert_function(
|
|
335
|
+
mod, fnty, "NRT_MemInfo_varsize_free"
|
|
336
|
+
)
|
|
337
|
+
return builder.call(fn, (meminfo, ptr))
|
|
338
|
+
|
|
339
|
+
def _call_varsize_alloc(self, builder, meminfo, size, funcname):
|
|
340
|
+
self._require_nrt()
|
|
341
|
+
|
|
342
|
+
mod = builder.module
|
|
343
|
+
fnty = ir.FunctionType(
|
|
344
|
+
cgutils.voidptr_t, [cgutils.voidptr_t, cgutils.intp_t]
|
|
345
|
+
)
|
|
346
|
+
fn = cgutils.get_or_insert_function(mod, fnty, funcname)
|
|
347
|
+
fn.return_value.add_attribute("noalias")
|
|
348
|
+
return builder.call(fn, [meminfo, size])
|
|
349
|
+
|
|
350
|
+
def meminfo_data(self, builder, meminfo):
|
|
351
|
+
"""
|
|
352
|
+
Given a MemInfo pointer, return a pointer to the allocated data
|
|
353
|
+
managed by it. This works for MemInfos allocated with all the
|
|
354
|
+
above methods.
|
|
355
|
+
"""
|
|
356
|
+
self._require_nrt()
|
|
357
|
+
|
|
358
|
+
mod = builder.module
|
|
359
|
+
fn = cgutils.get_or_insert_function(
|
|
360
|
+
mod, meminfo_data_ty, "NRT_MemInfo_data_fast"
|
|
361
|
+
)
|
|
362
|
+
return builder.call(fn, [meminfo])
|
|
363
|
+
|
|
364
|
+
def get_meminfos(self, builder, ty, val):
|
|
365
|
+
"""Return a list of *(type, meminfo)* inside the given value."""
|
|
366
|
+
datamodel = self._context.data_model_manager[ty]
|
|
367
|
+
members = datamodel.traverse(builder)
|
|
368
|
+
|
|
369
|
+
meminfos = []
|
|
370
|
+
if datamodel.has_nrt_meminfo():
|
|
371
|
+
mi = datamodel.get_nrt_meminfo(builder, val)
|
|
372
|
+
meminfos.append((ty, mi))
|
|
373
|
+
|
|
374
|
+
for mtyp, getter in members:
|
|
375
|
+
field = getter(val)
|
|
376
|
+
inner_meminfos = self.get_meminfos(builder, mtyp, field)
|
|
377
|
+
meminfos.extend(inner_meminfos)
|
|
378
|
+
return meminfos
|
|
379
|
+
|
|
380
|
+
def _call_incref_decref(self, builder, typ, value, funcname):
|
|
381
|
+
"""Call function of *funcname* on every meminfo found in *value*."""
|
|
382
|
+
self._require_nrt()
|
|
383
|
+
|
|
384
|
+
meminfos = self.get_meminfos(builder, typ, value)
|
|
385
|
+
for _, mi in meminfos:
|
|
386
|
+
mod = builder.module
|
|
387
|
+
fn = cgutils.get_or_insert_function(mod, incref_decref_ty, funcname)
|
|
388
|
+
# XXX "nonnull" causes a crash in test_dyn_array: can this
|
|
389
|
+
# function be called with a NULL pointer?
|
|
390
|
+
fn.args[0].add_attribute("noalias")
|
|
391
|
+
fn.args[0].add_attribute("nocapture")
|
|
392
|
+
builder.call(fn, [mi])
|
|
393
|
+
|
|
394
|
+
def incref(self, builder, typ, value):
|
|
395
|
+
"""
|
|
396
|
+
Recursively incref the given *value* and its members.
|
|
397
|
+
"""
|
|
398
|
+
self._call_incref_decref(builder, typ, value, "NRT_incref")
|
|
399
|
+
|
|
400
|
+
def decref(self, builder, typ, value):
|
|
401
|
+
"""
|
|
402
|
+
Recursively decref the given *value* and its members.
|
|
403
|
+
"""
|
|
404
|
+
self._call_incref_decref(builder, typ, value, "NRT_decref")
|
|
405
|
+
|
|
406
|
+
def get_nrt_api(self, builder):
|
|
407
|
+
"""Calls NRT_get_api(), which returns the NRT API function table."""
|
|
408
|
+
self._require_nrt()
|
|
409
|
+
|
|
410
|
+
fnty = ir.FunctionType(cgutils.voidptr_t, ())
|
|
411
|
+
mod = builder.module
|
|
412
|
+
fn = cgutils.get_or_insert_function(mod, fnty, "NRT_get_api")
|
|
413
|
+
return builder.call(fn, ())
|
|
414
|
+
|
|
415
|
+
def eh_check(self, builder):
|
|
416
|
+
"""Check if an exception is raised"""
|
|
417
|
+
ctx = self._context
|
|
418
|
+
cc = ctx.call_conv
|
|
419
|
+
# Inspect the excinfo argument on the function
|
|
420
|
+
trystatus = cc.check_try_status(builder)
|
|
421
|
+
excinfo = trystatus.excinfo
|
|
422
|
+
has_raised = builder.not_(cgutils.is_null(builder, excinfo))
|
|
423
|
+
if PYVERSION < (3, 11):
|
|
424
|
+
with builder.if_then(has_raised):
|
|
425
|
+
self.eh_end_try(builder)
|
|
426
|
+
return has_raised
|
|
427
|
+
|
|
428
|
+
def eh_try(self, builder):
|
|
429
|
+
"""Begin a try-block."""
|
|
430
|
+
ctx = self._context
|
|
431
|
+
cc = ctx.call_conv
|
|
432
|
+
cc.set_try_status(builder)
|
|
433
|
+
|
|
434
|
+
def eh_end_try(self, builder):
|
|
435
|
+
"""End a try-block"""
|
|
436
|
+
ctx = self._context
|
|
437
|
+
cc = ctx.call_conv
|
|
438
|
+
cc.unset_try_status(builder)
|