[llvm] 9ea64dd - [lldb] Make Python >= 3.8 required for LLDB 21 (#124735)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 29 01:56:46 PST 2025
Author: David Spickett
Date: 2025-01-29T09:56:41Z
New Revision: 9ea64dd8781328d831d7c69a586f0c84dece1c11
URL: https://github.com/llvm/llvm-project/commit/9ea64dd8781328d831d7c69a586f0c84dece1c11
DIFF: https://github.com/llvm/llvm-project/commit/9ea64dd8781328d831d7c69a586f0c84dece1c11.diff
LOG: [lldb] Make Python >= 3.8 required for LLDB 21 (#124735)
As decided on
https://discourse.llvm.org/t/rfc-lets-document-and-enforce-a-minimum-python-version-for-lldb/82731.
LLDB 20 recommended `>= 3.8` but did not remove support for anything
earlier. Now we are in what will become LLDB 21, so I'm removing that
support and making
`>= 3.8` required.
See https://docs.python.org/3/c-api/apiabiversion.html#c.PY_VERSION_HEX
for the format of PY_VERSION_HEX.
Added:
Modified:
lldb/docs/resources/build.rst
lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
llvm/docs/ReleaseNotes.md
Removed:
################################################################################
diff --git a/lldb/docs/resources/build.rst b/lldb/docs/resources/build.rst
index c0d3c580d631c1..214c5f63f2c73b 100644
--- a/lldb/docs/resources/build.rst
+++ b/lldb/docs/resources/build.rst
@@ -62,7 +62,7 @@ CMake configuration error.
+-------------------+--------------------------------------------------------------+--------------------------+
| Libxml2 | XML | ``LLDB_ENABLE_LIBXML2`` |
+-------------------+--------------------------------------------------------------+--------------------------+
-| Python | Python scripting. >= 3.0 is required, >= 3.8 is recommended. | ``LLDB_ENABLE_PYTHON`` |
+| Python | Python scripting. >= 3.8 is required. | ``LLDB_ENABLE_PYTHON`` |
+-------------------+--------------------------------------------------------------+--------------------------+
| Lua | Lua scripting. Lua 5.3 and 5.4 are supported. | ``LLDB_ENABLE_LUA`` |
+-------------------+--------------------------------------------------------------+--------------------------+
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
index a0f8cf954f8040..1340425aade438 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
@@ -73,10 +73,8 @@ Expected<std::string> python::As<std::string>(Expected<PythonObject> &&obj) {
static bool python_is_finalizing() {
#if PY_VERSION_HEX >= 0x030d0000
return Py_IsFinalizing();
-#elif PY_VERSION_HEX >= 0x03070000
- return _Py_IsFinalizing();
#else
- return _Py_Finalizing != nullptr;
+ return _Py_IsFinalizing();
#endif
}
@@ -810,7 +808,6 @@ bool PythonCallable::Check(PyObject *py_obj) {
return PyCallable_Check(py_obj);
}
-#if PY_VERSION_HEX >= 0x03030000
static const char get_arg_info_script[] = R"(
from inspect import signature, Parameter, ismethod
from collections import namedtuple
@@ -832,15 +829,12 @@ def main(f):
raise Exception(f'unknown parameter kind: {kind}')
return ArgInfo(count, varargs)
)";
-#endif
Expected<PythonCallable::ArgInfo> PythonCallable::GetArgInfo() const {
ArgInfo result = {};
if (!IsValid())
return nullDeref();
-#if PY_VERSION_HEX >= 0x03030000
-
// no need to synchronize access to this global, we already have the GIL
static PythonScript get_arg_info(get_arg_info_script);
Expected<PythonObject> pyarginfo = get_arg_info(*this);
@@ -852,57 +846,6 @@ Expected<PythonCallable::ArgInfo> PythonCallable::GetArgInfo() const {
cantFail(As<bool>(pyarginfo.get().GetAttribute("has_varargs")));
result.max_positional_args = has_varargs ? ArgInfo::UNBOUNDED : count;
-#else
- PyObject *py_func_obj;
- bool is_bound_method = false;
- bool is_class = false;
-
- if (PyType_Check(m_py_obj) || PyClass_Check(m_py_obj)) {
- auto init = GetAttribute("__init__");
- if (!init)
- return init.takeError();
- py_func_obj = init.get().get();
- is_class = true;
- } else {
- py_func_obj = m_py_obj;
- }
-
- if (PyMethod_Check(py_func_obj)) {
- py_func_obj = PyMethod_GET_FUNCTION(py_func_obj);
- PythonObject im_self = GetAttributeValue("im_self");
- if (im_self.IsValid() && !im_self.IsNone())
- is_bound_method = true;
- } else {
- // see if this is a callable object with an __call__ method
- if (!PyFunction_Check(py_func_obj)) {
- PythonObject __call__ = GetAttributeValue("__call__");
- if (__call__.IsValid()) {
- auto __callable__ = __call__.AsType<PythonCallable>();
- if (__callable__.IsValid()) {
- py_func_obj = PyMethod_GET_FUNCTION(__callable__.get());
- PythonObject im_self = __callable__.GetAttributeValue("im_self");
- if (im_self.IsValid() && !im_self.IsNone())
- is_bound_method = true;
- }
- }
- }
- }
-
- if (!py_func_obj)
- return result;
-
- PyCodeObject *code = (PyCodeObject *)PyFunction_GET_CODE(py_func_obj);
- if (!code)
- return result;
-
- auto count = code->co_argcount;
- bool has_varargs = !!(code->co_flags & CO_VARARGS);
- result.max_positional_args =
- has_varargs ? ArgInfo::UNBOUNDED
- : (count - (int)is_bound_method) - (int)is_class;
-
-#endif
-
return result;
}
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
index ef3c53ca5698db..e78e6068debb4f 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
@@ -70,8 +70,7 @@ extern "C" PyObject *PyInit__lldb(void);
// Don't mess with the signal handlers on Windows.
#define LLDB_USE_PYTHON_SET_INTERRUPT 0
#else
-// PyErr_SetInterrupt was introduced in 3.2.
-#define LLDB_USE_PYTHON_SET_INTERRUPT PY_VERSION_HEX >= 0x03020000
+#define LLDB_USE_PYTHON_SET_INTERRUPT 1
#endif
static ScriptInterpreterPythonImpl *GetPythonInterpreter(Debugger &debugger) {
@@ -91,10 +90,8 @@ namespace {
struct InitializePythonRAII {
public:
InitializePythonRAII() {
-#if PY_VERSION_HEX >= 0x03080000
PyConfig config;
PyConfig_InitPythonConfig(&config);
-#endif
#if LLDB_EMBED_PYTHON_HOME
static std::string g_python_home = []() -> std::string {
@@ -108,14 +105,7 @@ struct InitializePythonRAII {
return spec.GetPath();
}();
if (!g_python_home.empty()) {
-#if PY_VERSION_HEX >= 0x03080000
PyConfig_SetBytesString(&config, &config.home, g_python_home.c_str());
-#else
- size_t size = 0;
- wchar_t *python_home_w = Py_DecodeLocale(g_python_home.c_str(), &size);
- Py_SetPythonHome(python_home_w);
- PyMem_RawFree(python_home_w);
-#endif
}
#endif
@@ -142,23 +132,10 @@ struct InitializePythonRAII {
PyImport_AppendInittab("_lldb", LLDBSwigPyInit);
}
-#if PY_VERSION_HEX >= 0x03080000
config.install_signal_handlers = 0;
Py_InitializeFromConfig(&config);
PyConfig_Clear(&config);
InitializeThreadsPrivate();
-#else
-// Python < 3.2 and Python >= 3.2 reversed the ordering requirements for
-// calling `Py_Initialize` and `PyEval_InitThreads`. < 3.2 requires that you
-// call `PyEval_InitThreads` first, and >= 3.2 requires that you call it last.
-#if PY_VERSION_HEX >= 0x03020000
- Py_InitializeEx(0);
- InitializeThreadsPrivate();
-#else
- InitializeThreadsPrivate();
- Py_InitializeEx(0);
-#endif
-#endif
}
~InitializePythonRAII() {
@@ -181,11 +158,9 @@ struct InitializePythonRAII {
// would always return `true` and `PyGILState_Ensure/Release` flow would be
// executed instead of unlocking GIL with `PyEval_SaveThread`. When
// an another thread calls `PyGILState_Ensure` it would get stuck in deadlock.
-#if PY_VERSION_HEX >= 0x03070000
// The only case we should go further and acquire the GIL: it is unlocked.
if (PyGILState_Check())
return;
-#endif
// `PyEval_ThreadsInitialized` was deprecated in Python 3.9 and removed in
// Python 3.13. It has been returning `true` always since Python 3.7.
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
index b68598b9d59d90..4a6c11dba02e8e 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
@@ -50,8 +50,8 @@ static llvm::Expected<bool> *g_fcxx_modules_workaround [[maybe_unused]];
// Provide a meaningful diagnostic error if someone tries to compile this file
// with a version of Python we don't support.
-static_assert(PY_VERSION_HEX >= 0x03000000,
- "LLDB requires at least Python 3.0");
+static_assert(PY_VERSION_HEX >= 0x03080000,
+ "LLDB requires at least Python 3.8");
#endif
#endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_LLDB_PYTHON_H
diff --git a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
index 365ebc8e52c246..2dd92fc00fea17 100644
--- a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
+++ b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp
@@ -760,10 +760,6 @@ class NewStyle(object):
EXPECT_EQ(arginfo.get().max_positional_args, 3u);
}
-#if PY_VERSION_HEX >= 0x03030000
-
- // the old implementation of GetArgInfo just doesn't work on builtins.
-
{
auto builtins = PythonModule::BuiltinsModule();
auto hex = As<PythonCallable>(builtins.GetAttribute("hex"));
@@ -772,8 +768,6 @@ class NewStyle(object):
ASSERT_THAT_EXPECTED(arginfo, llvm::Succeeded());
EXPECT_EQ(arginfo.get().max_positional_args, 1u);
}
-
-#endif
}
TEST_F(PythonDataObjectsTest, TestScript) {
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 48d2ef1b4d1c5b..ab89073105e1f7 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -131,6 +131,9 @@ Changes to the LLVM tools
Changes to LLDB
---------------------------------
+* When building LLDB with Python support, the minimum version of Python is now
+ 3.8.
+
Changes to BOLT
---------------------------------
More information about the llvm-commits
mailing list