Skip to content

[lldb] Make Python >= 3.8 required for LLDB 21 #124735

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lldb/docs/resources/build.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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`` |
+-------------------+--------------------------------------------------------------+--------------------------+
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand All @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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 {
Expand All @@ -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

Expand All @@ -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() {
Expand All @@ -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.
Expand Down
4 changes: 2 additions & 2 deletions lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand All @@ -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) {
Expand Down
3 changes: 3 additions & 0 deletions llvm/docs/ReleaseNotes.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
---------------------------------

Expand Down
Loading