https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/114346
>From 2d4b486202194166471ccafd97ff63c399b2e822 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere <jo...@devlieghere.com> Date: Wed, 30 Oct 2024 20:34:04 -0700 Subject: [PATCH 1/2] [lldb] Use PY_VERSION_HEX to simplify conditional compilation (NFC) Use PY_VERSION_HEX to simplify conditional compilation depending on the Python version. This also adds a static_assert to lldb-python to error out with a meaningful diagnostic when you try building LLDB with an older Python version in preparation for [1]. [1] https://discourse.llvm.org/t/rfc-lets-document-and-enforce-a-minimum-python-version-for-lldb/82731/15 --- .../Python/PythonDataObjects.cpp | 12 ++++++------ .../Python/ScriptInterpreterPython.cpp | 17 ++++++++--------- .../ScriptInterpreter/Python/lldb-python.h | 4 ++++ .../Python/PythonDataObjectsTests.cpp | 2 +- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp index 90ccd1055199a0..a0f8cf954f8040 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp @@ -71,12 +71,12 @@ Expected<std::string> python::As<std::string>(Expected<PythonObject> &&obj) { } static bool python_is_finalizing() { -#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 13) || (PY_MAJOR_VERSION > 3) +#if PY_VERSION_HEX >= 0x030d0000 return Py_IsFinalizing(); -#elif PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 7 - return _Py_Finalizing != nullptr; -#else +#elif PY_VERSION_HEX >= 0x03070000 return _Py_IsFinalizing(); +#else + return _Py_Finalizing != nullptr; #endif } @@ -810,7 +810,7 @@ bool PythonCallable::Check(PyObject *py_obj) { return PyCallable_Check(py_obj); } -#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 +#if PY_VERSION_HEX >= 0x03030000 static const char get_arg_info_script[] = R"( from inspect import signature, Parameter, ismethod from collections import namedtuple @@ -839,7 +839,7 @@ Expected<PythonCallable::ArgInfo> PythonCallable::GetArgInfo() const { if (!IsValid()) return nullDeref(); -#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 +#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); diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp index 7c2b6517468ff4..ef3c53ca5698db 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp +++ b/lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp @@ -71,8 +71,7 @@ extern "C" PyObject *PyInit__lldb(void); #define LLDB_USE_PYTHON_SET_INTERRUPT 0 #else // PyErr_SetInterrupt was introduced in 3.2. -#define LLDB_USE_PYTHON_SET_INTERRUPT \ - (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 2) || (PY_MAJOR_VERSION > 3) +#define LLDB_USE_PYTHON_SET_INTERRUPT PY_VERSION_HEX >= 0x03020000 #endif static ScriptInterpreterPythonImpl *GetPythonInterpreter(Debugger &debugger) { @@ -92,7 +91,7 @@ namespace { struct InitializePythonRAII { public: InitializePythonRAII() { -#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8) || (PY_MAJOR_VERSION > 3) +#if PY_VERSION_HEX >= 0x03080000 PyConfig config; PyConfig_InitPythonConfig(&config); #endif @@ -109,7 +108,7 @@ struct InitializePythonRAII { return spec.GetPath(); }(); if (!g_python_home.empty()) { -#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8) || (PY_MAJOR_VERSION > 3) +#if PY_VERSION_HEX >= 0x03080000 PyConfig_SetBytesString(&config, &config.home, g_python_home.c_str()); #else size_t size = 0; @@ -143,7 +142,7 @@ struct InitializePythonRAII { PyImport_AppendInittab("_lldb", LLDBSwigPyInit); } -#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8) || (PY_MAJOR_VERSION > 3) +#if PY_VERSION_HEX >= 0x03080000 config.install_signal_handlers = 0; Py_InitializeFromConfig(&config); PyConfig_Clear(&config); @@ -152,7 +151,7 @@ struct InitializePythonRAII { // 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_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 2) +#if PY_VERSION_HEX >= 0x03020000 Py_InitializeEx(0); InitializeThreadsPrivate(); #else @@ -182,7 +181,7 @@ 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_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 7) || (PY_MAJOR_VERSION > 3) +#if PY_VERSION_HEX >= 0x03070000 // The only case we should go further and acquire the GIL: it is unlocked. if (PyGILState_Check()) return; @@ -190,7 +189,7 @@ struct InitializePythonRAII { // `PyEval_ThreadsInitialized` was deprecated in Python 3.9 and removed in // Python 3.13. It has been returning `true` always since Python 3.7. -#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 9) || (PY_MAJOR_VERSION < 3) +#if PY_VERSION_HEX < 0x03090000 if (PyEval_ThreadsInitialized()) { #else if (true) { @@ -204,7 +203,7 @@ struct InitializePythonRAII { // `PyEval_InitThreads` was deprecated in Python 3.9 and removed in // Python 3.13. -#if (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 9) || (PY_MAJOR_VERSION < 3) +#if PY_VERSION_HEX < 0x03090000 return; } diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h index 378b9fa2a59865..2d9281f368a336 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h @@ -47,6 +47,10 @@ static llvm::Expected<bool> *g_fcxx_modules_workaround [[maybe_unused]]; // Include python for non windows machines #include <Python.h> + +// 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 Python 3.0"); #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 b90fbb7830995f..365ebc8e52c246 100644 --- a/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp +++ b/lldb/unittests/ScriptInterpreter/Python/PythonDataObjectsTests.cpp @@ -760,7 +760,7 @@ class NewStyle(object): EXPECT_EQ(arginfo.get().max_positional_args, 3u); } -#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 +#if PY_VERSION_HEX >= 0x03030000 // the old implementation of GetArgInfo just doesn't work on builtins. >From 0849d533ff1f84bc79cfa9cd99689e77410a2b1b Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere <jo...@devlieghere.com> Date: Thu, 31 Oct 2024 08:13:14 -0700 Subject: [PATCH 2/2] "at least Python 3.0" --- lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h index 2d9281f368a336..b68598b9d59d90 100644 --- a/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h +++ b/lldb/source/Plugins/ScriptInterpreter/Python/lldb-python.h @@ -50,7 +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 Python 3.0"); +static_assert(PY_VERSION_HEX >= 0x03000000, + "LLDB requires at least Python 3.0"); #endif #endif // LLDB_PLUGINS_SCRIPTINTERPRETER_PYTHON_LLDB_PYTHON_H _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits