[Lldb-commits] [lldb] 18b5e2a - [lldb] Push down the SWIG module to avoid an import cycle (#166265)
via lldb-commits
lldb-commits at lists.llvm.org
Mon Nov 17 10:56:33 PST 2025
Author: Jonas Devlieghere
Date: 2025-11-17T10:56:28-08:00
New Revision: 18b5e2a7266bfe8f211be7ae1198e6bed4ab0c06
URL: https://github.com/llvm/llvm-project/commit/18b5e2a7266bfe8f211be7ae1198e6bed4ab0c06
DIFF: https://github.com/llvm/llvm-project/commit/18b5e2a7266bfe8f211be7ae1198e6bed4ab0c06.diff
LOG: [lldb] Push down the SWIG module to avoid an import cycle (#166265)
This is a reland of #129135 (by dingxiangfei2009) with Vladislav
(dzhidzhoev) fix on top.
Fixes #92603
Added:
Modified:
lldb/bindings/python/CMakeLists.txt
lldb/bindings/python/python.swig
lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
Removed:
################################################################################
diff --git a/lldb/bindings/python/CMakeLists.txt b/lldb/bindings/python/CMakeLists.txt
index 28a8af8f06319..2ebcf5a8e7aca 100644
--- a/lldb/bindings/python/CMakeLists.txt
+++ b/lldb/bindings/python/CMakeLists.txt
@@ -60,8 +60,10 @@ endfunction()
function(finish_swig_python swig_target lldb_python_bindings_dir lldb_python_target_dir)
# Add a Post-Build Event to copy over Python files and create the symlink to
# liblldb.so for the Python API(hardlink on Windows).
+ # Note that Swig-generated code is located one level deeper in the `native`
+ # module, in order to avoid cyclic importing.
add_custom_target(${swig_target} ALL VERBATIM
- COMMAND ${CMAKE_COMMAND} -E make_directory ${lldb_python_target_dir}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${lldb_python_target_dir}/native/
DEPENDS ${lldb_python_bindings_dir}/lldb.py
COMMENT "Python script sym-linking LLDB Python API")
@@ -75,6 +77,8 @@ function(finish_swig_python swig_target lldb_python_bindings_dir lldb_python_tar
"${LLDB_SOURCE_DIR}/source/Interpreter/embedded_interpreter.py"
"${lldb_python_target_dir}")
+ create_python_package(${swig_target} ${lldb_python_target_dir} "native" FILES)
+
# Distribute the examples as python packages.
create_python_package(
${swig_target}
@@ -143,7 +147,7 @@ function(finish_swig_python swig_target lldb_python_bindings_dir lldb_python_tar
endif()
set(LIBLLDB_SYMLINK_OUTPUT_FILE "_lldb${LLDB_PYTHON_EXT_SUFFIX}")
create_relative_symlink(${swig_target} ${LIBLLDB_SYMLINK_DEST}
- ${lldb_python_target_dir} ${LIBLLDB_SYMLINK_OUTPUT_FILE})
+ ${lldb_python_target_dir}/native/ ${LIBLLDB_SYMLINK_OUTPUT_FILE})
if (NOT WIN32)
diff --git a/lldb/bindings/python/python.swig b/lldb/bindings/python/python.swig
index b2823f98acac8..3d2caa65f1658 100644
--- a/lldb/bindings/python/python.swig
+++ b/lldb/bindings/python/python.swig
@@ -50,7 +50,12 @@ Older swig versions will simply ignore this setting.
import $module
except ImportError:
# Relative import should work if we are being loaded by Python.
- from . import $module"
+ # The cpython module built by swig is pushed one level down into
+ # the native submodule, because at this point the interpreter
+ # is still constructing the lldb module itself.
+ # Simply importing anything using `from . import` constitutes
+ # a cyclic importing.
+ from .native import $module"
%enddef
// The name of the module to be created.
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
index 3493fa9fef635..35a772c1454df 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -272,6 +272,7 @@ void ScriptInterpreterPython::SharedLibraryDirectoryHelper(
// does.
if (this_file.GetFileNameExtension() == ".pyd") {
this_file.RemoveLastPathComponent(); // _lldb.pyd or _lldb_d.pyd
+ this_file.RemoveLastPathComponent(); // native
this_file.RemoveLastPathComponent(); // lldb
llvm::StringRef libdir = LLDB_PYTHON_RELATIVE_LIBDIR;
for (auto it = llvm::sys::path::begin(libdir),
More information about the lldb-commits
mailing list