blob: 35847efa9e4a0f9e342754f176e22ee701c22c9d [file] [log] [blame]
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Common module for looking up and manipulating C-Extensions."""
# Packaged installs have a top-level _mlir_libs package with symbols:
# load_extension(name): Loads a named extension module
# preload_dependency(public_name): Loads a shared-library/DLL into the
# namespace. TODO: Remove this in favor of a more robust mechanism.
# Conditionally switch based on whether we are in a package context.
try:
import _mlir_libs
except ModuleNotFoundError:
# Assume that we are in-tree.
# The _dlloader takes care of platform specific setup before we try to
# load a shared library.
from ._dlloader import preload_dependency as _preload_dependency
def _load_extension(name):
import importlib
return importlib.import_module(name) # i.e. '_mlir' at the top level
else:
# Packaged distribution.
_load_extension = _mlir_libs.load_extension
_preload_dependency = _mlir_libs.preload_dependency
_preload_dependency("MLIRPublicAPI")
# Expose the corresponding C-Extension module with a well-known name at this
# top-level module. This allows relative imports like the following to
# function:
# from .._cext_loader import _cext
# This reduces coupling, allowing embedding of the python sources into another
# project that can just vary based on this top-level loader module.
_cext = _load_extension("_mlir")
def _reexport_cext(cext_module_name, target_module_name):
"""Re-exports a named sub-module of the C-Extension into another module.
Typically:
from ._cext_loader import _reexport_cext
_reexport_cext("ir", __name__)
del _reexport_cext
"""
import sys
target_module = sys.modules[target_module_name]
source_module = getattr(_cext, cext_module_name)
for attr_name in dir(source_module):
if not attr_name.startswith("__"):
setattr(target_module, attr_name, getattr(source_module, attr_name))
# Add our 'dialects' parent module to the search path for implementations.
_cext.globals.append_dialect_search_prefix("mlir.dialects")