177374d3bSMed Ismail Bennani //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===// 277374d3bSMed Ismail Bennani // 377374d3bSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 477374d3bSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information. 577374d3bSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 677374d3bSMed Ismail Bennani // 777374d3bSMed Ismail Bennani //===----------------------------------------------------------------------===// 877374d3bSMed Ismail Bennani 977374d3bSMed Ismail Bennani #include "lldb/Host/Config.h" 1077374d3bSMed Ismail Bennani #include "lldb/Utility/Log.h" 1177374d3bSMed Ismail Bennani #include "lldb/lldb-enumerations.h" 1277374d3bSMed Ismail Bennani 1377374d3bSMed Ismail Bennani #if LLDB_ENABLE_PYTHON 1477374d3bSMed Ismail Bennani 1577374d3bSMed Ismail Bennani // LLDB Python header must be included first 1677374d3bSMed Ismail Bennani #include "../lldb-python.h" 1777374d3bSMed Ismail Bennani 1877374d3bSMed Ismail Bennani #include "../SWIGPythonBridge.h" 1977374d3bSMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h" 2077374d3bSMed Ismail Bennani #include "ScriptedThreadPythonInterface.h" 2177374d3bSMed Ismail Bennani #include <optional> 2277374d3bSMed Ismail Bennani 2377374d3bSMed Ismail Bennani using namespace lldb; 2477374d3bSMed Ismail Bennani using namespace lldb_private; 2577374d3bSMed Ismail Bennani using namespace lldb_private::python; 2677374d3bSMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker; 2777374d3bSMed Ismail Bennani 2877374d3bSMed Ismail Bennani ScriptedThreadPythonInterface::ScriptedThreadPythonInterface( 2977374d3bSMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter) 3077374d3bSMed Ismail Bennani : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {} 3177374d3bSMed Ismail Bennani 32*f22d82ceSMed Ismail Bennani llvm::Expected<StructuredData::GenericSP> 33*f22d82ceSMed Ismail Bennani ScriptedThreadPythonInterface::CreatePluginObject( 3477374d3bSMed Ismail Bennani const llvm::StringRef class_name, ExecutionContext &exe_ctx, 3577374d3bSMed Ismail Bennani StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 36*f22d82ceSMed Ismail Bennani ExecutionContextRefSP exe_ctx_ref_sp = 3777374d3bSMed Ismail Bennani std::make_shared<ExecutionContextRef>(exe_ctx); 38*f22d82ceSMed Ismail Bennani StructuredDataImpl sd_impl(args_sp); 39*f22d82ceSMed Ismail Bennani return ScriptedPythonInterface::CreatePluginObject(class_name, script_obj, 40*f22d82ceSMed Ismail Bennani exe_ctx_ref_sp, sd_impl); 4177374d3bSMed Ismail Bennani } 4277374d3bSMed Ismail Bennani 4377374d3bSMed Ismail Bennani lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() { 4477374d3bSMed Ismail Bennani Status error; 4577374d3bSMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_thread_id", error); 4677374d3bSMed Ismail Bennani 4777374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 4877374d3bSMed Ismail Bennani return LLDB_INVALID_THREAD_ID; 4977374d3bSMed Ismail Bennani 5077374d3bSMed Ismail Bennani return obj->GetUnsignedIntegerValue(LLDB_INVALID_THREAD_ID); 5177374d3bSMed Ismail Bennani } 5277374d3bSMed Ismail Bennani 5377374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetName() { 5477374d3bSMed Ismail Bennani Status error; 5577374d3bSMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_name", error); 5677374d3bSMed Ismail Bennani 5777374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 5877374d3bSMed Ismail Bennani return {}; 5977374d3bSMed Ismail Bennani 6077374d3bSMed Ismail Bennani return obj->GetStringValue().str(); 6177374d3bSMed Ismail Bennani } 6277374d3bSMed Ismail Bennani 6377374d3bSMed Ismail Bennani lldb::StateType ScriptedThreadPythonInterface::GetState() { 6477374d3bSMed Ismail Bennani Status error; 6577374d3bSMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_state", error); 6677374d3bSMed Ismail Bennani 6777374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 6877374d3bSMed Ismail Bennani return eStateInvalid; 6977374d3bSMed Ismail Bennani 7077374d3bSMed Ismail Bennani return static_cast<StateType>(obj->GetUnsignedIntegerValue(eStateInvalid)); 7177374d3bSMed Ismail Bennani } 7277374d3bSMed Ismail Bennani 7377374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetQueue() { 7477374d3bSMed Ismail Bennani Status error; 7577374d3bSMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_queue", error); 7677374d3bSMed Ismail Bennani 7777374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 7877374d3bSMed Ismail Bennani return {}; 7977374d3bSMed Ismail Bennani 8077374d3bSMed Ismail Bennani return obj->GetStringValue().str(); 8177374d3bSMed Ismail Bennani } 8277374d3bSMed Ismail Bennani 8377374d3bSMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() { 8477374d3bSMed Ismail Bennani Status error; 8577374d3bSMed Ismail Bennani StructuredData::DictionarySP dict = 8677374d3bSMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_stop_reason", error); 8777374d3bSMed Ismail Bennani 8877374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) 8977374d3bSMed Ismail Bennani return {}; 9077374d3bSMed Ismail Bennani 9177374d3bSMed Ismail Bennani return dict; 9277374d3bSMed Ismail Bennani } 9377374d3bSMed Ismail Bennani 9477374d3bSMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() { 9577374d3bSMed Ismail Bennani Status error; 9677374d3bSMed Ismail Bennani StructuredData::ArraySP arr = 9777374d3bSMed Ismail Bennani Dispatch<StructuredData::ArraySP>("get_stackframes", error); 9877374d3bSMed Ismail Bennani 9977374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error)) 10077374d3bSMed Ismail Bennani return {}; 10177374d3bSMed Ismail Bennani 10277374d3bSMed Ismail Bennani return arr; 10377374d3bSMed Ismail Bennani } 10477374d3bSMed Ismail Bennani 10577374d3bSMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() { 10677374d3bSMed Ismail Bennani Status error; 10777374d3bSMed Ismail Bennani StructuredData::DictionarySP dict = 10877374d3bSMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_register_info", error); 10977374d3bSMed Ismail Bennani 11077374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) 11177374d3bSMed Ismail Bennani return {}; 11277374d3bSMed Ismail Bennani 11377374d3bSMed Ismail Bennani return dict; 11477374d3bSMed Ismail Bennani } 11577374d3bSMed Ismail Bennani 11677374d3bSMed Ismail Bennani std::optional<std::string> ScriptedThreadPythonInterface::GetRegisterContext() { 11777374d3bSMed Ismail Bennani Status error; 11877374d3bSMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_register_context", error); 11977374d3bSMed Ismail Bennani 12077374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 12177374d3bSMed Ismail Bennani return {}; 12277374d3bSMed Ismail Bennani 12377374d3bSMed Ismail Bennani return obj->GetAsString()->GetValue().str(); 12477374d3bSMed Ismail Bennani } 12577374d3bSMed Ismail Bennani 12677374d3bSMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetExtendedInfo() { 12777374d3bSMed Ismail Bennani Status error; 12877374d3bSMed Ismail Bennani StructuredData::ArraySP arr = 12977374d3bSMed Ismail Bennani Dispatch<StructuredData::ArraySP>("get_extended_info", error); 13077374d3bSMed Ismail Bennani 13177374d3bSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, error)) 13277374d3bSMed Ismail Bennani return {}; 13377374d3bSMed Ismail Bennani 13477374d3bSMed Ismail Bennani return arr; 13577374d3bSMed Ismail Bennani } 13677374d3bSMed Ismail Bennani 13777374d3bSMed Ismail Bennani #endif 138