Give `frame recognizer add -l` a formal ScriptedStackFrameRecognizerInterface, matching the architecture already used by ScriptedProcess, ScriptedBreakpoint, etc.: a C++ interface header, a Python-backed implementation built on ScriptedPythonInterface's CreatePluginObject/Dispatch machinery, PluginManager registration, and a generatable Python ABC template (scripted_stackframe_recognizer.py). get_recognized_arguments' documented contract returns a plain list of lldb.SBValue (not an lldb.SBValueList), so it bypasses the generic Dispatch<ValueObjectListSP>() extractor and calls the SWIG bridge directly, matching the legacy behavior exactly. ScriptedStackFrameRecognizer now holds a single interface object created once in its constructor and reused across every RecognizeFrame() call, same lifecycle as before. Signed-off-by: Med Ismail Bennani <ismail@bennani.ma> (cherry picked from commit a07b91d8243b8a8051dbbe5739eacc7942269c61)
131 lines
4.6 KiB
CMake
131 lines
4.6 KiB
CMake
if (APPLE AND LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY)
|
|
# Work around an issue with the Python headers, which have a modular include
|
|
# inside an extern "C" block.
|
|
remove_module_flags()
|
|
endif()
|
|
|
|
if(NOT LLDB_PYTHON_RELATIVE_PATH)
|
|
message(FATAL_ERROR "LLDB_PYTHON_RELATIVE_PATH is not set.")
|
|
endif()
|
|
add_definitions(-DLLDB_PYTHON_RELATIVE_LIBDIR="${LLDB_PYTHON_RELATIVE_PATH}")
|
|
|
|
if(NOT LLDB_PYTHON_EXE_RELATIVE_PATH)
|
|
message(FATAL_ERROR "LLDB_PYTHON_EXE_RELATIVE_PATH is not set.")
|
|
endif()
|
|
add_definitions(-DLLDB_PYTHON_EXE_RELATIVE_PATH="${LLDB_PYTHON_EXE_RELATIVE_PATH}")
|
|
|
|
if (LLDB_ENABLE_LIBEDIT)
|
|
list(APPEND LLDB_LIBEDIT_LIBS LibEdit::LibEdit)
|
|
endif()
|
|
|
|
set(python_plugin_sources
|
|
PythonDataObjects.cpp
|
|
PythonReadline.cpp
|
|
ScriptInterpreterPython.cpp
|
|
|
|
Interfaces/OperatingSystemPythonInterface.cpp
|
|
Interfaces/ScriptInterpreterPythonInterfaces.cpp
|
|
Interfaces/ScriptedFramePythonInterface.cpp
|
|
Interfaces/ScriptedFrameProviderPythonInterface.cpp
|
|
Interfaces/ScriptedPlatformPythonInterface.cpp
|
|
Interfaces/ScriptedProcessPythonInterface.cpp
|
|
Interfaces/ScriptedPythonInterface.cpp
|
|
Interfaces/ScriptedHookPythonInterface.cpp
|
|
Interfaces/ScriptedBreakpointPythonInterface.cpp
|
|
Interfaces/ScriptedStackFrameRecognizerPythonInterface.cpp
|
|
Interfaces/ScriptedThreadPlanPythonInterface.cpp
|
|
Interfaces/ScriptedThreadPythonInterface.cpp
|
|
)
|
|
|
|
if (WIN32)
|
|
# Add the library directories to allow Python to use #pragma comment(lib, "python3.lib").
|
|
# FIXME: We should use Python3_SABI_LIBRARY_DIRS here, but this requires CMake 3.26.
|
|
set(PYTHON_SABI_LIBRARY_DIRS ${Python3_LIBRARY_DIRS})
|
|
endif()
|
|
|
|
if (LLDB_ENABLE_DYNAMIC_SCRIPTINTERPRETERS)
|
|
# Shared library loaded at runtime by PluginManager. Private lldb symbols are
|
|
# resolved via liblldb's re-exports, so lldb_private libs aren't linked here.
|
|
# Python is dlopen'd at runtime by ScriptInterpreterRuntimeLoader, so the
|
|
# plugin is built with allow-undefined-symbol semantics on POSIX.
|
|
add_lldb_library(lldbPluginScriptInterpreterPython SHARED
|
|
${python_plugin_sources}
|
|
LINK_LIBS
|
|
liblldb
|
|
${LLDB_LIBEDIT_LIBS}
|
|
)
|
|
add_python_wrapper(lldbPluginScriptInterpreterPython)
|
|
if (APPLE)
|
|
target_link_options(lldbPluginScriptInterpreterPython PRIVATE
|
|
"LINKER:-undefined,dynamic_lookup")
|
|
elseif (UNIX)
|
|
target_link_options(lldbPluginScriptInterpreterPython PRIVATE
|
|
"LINKER:--unresolved-symbols=ignore-all")
|
|
else()
|
|
# For the limited API, rely on #pragma comment(lib, "python3.lib")
|
|
# emitted by SWIG. For the full API, link the version-specific import lib.
|
|
if (NOT LLDB_ENABLE_PYTHON_LIMITED_API)
|
|
target_link_libraries(lldbPluginScriptInterpreterPython PRIVATE
|
|
${Python3_LIBRARIES})
|
|
endif()
|
|
target_link_directories(lldbPluginScriptInterpreterPython PRIVATE
|
|
${PYTHON_SABI_LIBRARY_DIRS})
|
|
endif()
|
|
|
|
if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
|
|
lldb_record_dynamic_script_interpreter_exports(
|
|
lldbPluginScriptInterpreterPython)
|
|
endif()
|
|
|
|
lldb_add_scriptinterpreter_plugin_to_framework(lldbPluginScriptInterpreterPython)
|
|
|
|
# Static variant linked directly by unit tests. Separate compilation is
|
|
# required so llvm::Error RTTI (ErrorInfoBase::ID) has a single address
|
|
# shared between the test binary and the plugin code.
|
|
add_lldb_library(lldbStaticScriptInterpreterPython
|
|
${python_plugin_sources}
|
|
LINK_COMPONENTS
|
|
Support
|
|
LINK_LIBS
|
|
lldbBreakpoint
|
|
lldbCore
|
|
lldbDataFormatters
|
|
lldbHost
|
|
lldbInterpreter
|
|
lldbTarget
|
|
lldbValueObject
|
|
${Python3_LIBRARIES}
|
|
${LLDB_LIBEDIT_LIBS}
|
|
)
|
|
target_include_directories(lldbStaticScriptInterpreterPython
|
|
PUBLIC ${Python3_INCLUDE_DIRS})
|
|
target_link_directories(lldbStaticScriptInterpreterPython
|
|
PUBLIC ${PYTHON_SABI_LIBRARY_DIRS})
|
|
else()
|
|
# On Windows with the limited API, the Python import library is selected via
|
|
# #pragma comment(lib, ...) in pyconfig.h based on Py_LIMITED_API.
|
|
# On all other platforms, always link Python3_LIBRARIES explicitly.
|
|
if (NOT (WIN32 AND LLDB_ENABLE_PYTHON_LIMITED_API))
|
|
set(python_link_libs ${Python3_LIBRARIES})
|
|
endif()
|
|
add_lldb_library(lldbPluginScriptInterpreterPython PLUGIN
|
|
${python_plugin_sources}
|
|
LINK_COMPONENTS
|
|
Support
|
|
LINK_LIBS
|
|
lldbBreakpoint
|
|
lldbCore
|
|
lldbDataFormatters
|
|
lldbHost
|
|
lldbInterpreter
|
|
lldbTarget
|
|
lldbValueObject
|
|
${python_link_libs}
|
|
${LLDB_LIBEDIT_LIBS}
|
|
)
|
|
target_link_directories(lldbPluginScriptInterpreterPython PUBLIC ${PYTHON_SABI_LIBRARY_DIRS})
|
|
endif()
|
|
|
|
target_include_directories(lldbPluginScriptInterpreterPython
|
|
PUBLIC ${Python3_INCLUDE_DIRS})
|