159d8dd79SMed Ismail Bennani //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===// 259d8dd79SMed Ismail Bennani // 359d8dd79SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 459d8dd79SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information. 559d8dd79SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 659d8dd79SMed Ismail Bennani // 759d8dd79SMed Ismail Bennani //===----------------------------------------------------------------------===// 859d8dd79SMed Ismail Bennani 959d8dd79SMed Ismail Bennani #include "lldb/Host/Config.h" 1059d8dd79SMed Ismail Bennani #include "lldb/Utility/Log.h" 1159d8dd79SMed Ismail Bennani #include "lldb/Utility/Logging.h" 1259d8dd79SMed Ismail Bennani #include "lldb/lldb-enumerations.h" 1359d8dd79SMed Ismail Bennani 1459d8dd79SMed Ismail Bennani #if LLDB_ENABLE_PYTHON 1559d8dd79SMed Ismail Bennani 1659d8dd79SMed Ismail Bennani // LLDB Python header must be included first 1759d8dd79SMed Ismail Bennani #include "lldb-python.h" 1859d8dd79SMed Ismail Bennani 1959d8dd79SMed Ismail Bennani #include "SWIGPythonBridge.h" 2059d8dd79SMed Ismail Bennani #include "ScriptInterpreterPythonImpl.h" 2159d8dd79SMed Ismail Bennani #include "ScriptedThreadPythonInterface.h" 2259d8dd79SMed Ismail Bennani 2359d8dd79SMed Ismail Bennani using namespace lldb; 2459d8dd79SMed Ismail Bennani using namespace lldb_private; 2559d8dd79SMed Ismail Bennani using namespace lldb_private::python; 2659d8dd79SMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker; 2759d8dd79SMed Ismail Bennani 2859d8dd79SMed Ismail Bennani ScriptedThreadPythonInterface::ScriptedThreadPythonInterface( 2959d8dd79SMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter) 3059d8dd79SMed Ismail Bennani : ScriptedThreadInterface(), ScriptedPythonInterface(interpreter) {} 3159d8dd79SMed Ismail Bennani 3259d8dd79SMed Ismail Bennani StructuredData::GenericSP ScriptedThreadPythonInterface::CreatePluginObject( 3359d8dd79SMed Ismail Bennani const llvm::StringRef class_name, ExecutionContext &exe_ctx, 3459d8dd79SMed Ismail Bennani StructuredData::DictionarySP args_sp) { 3559d8dd79SMed Ismail Bennani 3659d8dd79SMed Ismail Bennani if (class_name.empty()) 3759d8dd79SMed Ismail Bennani return {}; 3859d8dd79SMed Ismail Bennani 39*738621d0SMed Ismail Bennani ProcessSP process_sp = exe_ctx.GetProcessSP(); 40*738621d0SMed Ismail Bennani StructuredDataImpl *args_impl = nullptr; 41*738621d0SMed Ismail Bennani if (args_sp) { 42*738621d0SMed Ismail Bennani args_impl = new StructuredDataImpl(); 43*738621d0SMed Ismail Bennani args_impl->SetObjectSP(args_sp); 44*738621d0SMed Ismail Bennani } 45*738621d0SMed Ismail Bennani std::string error_string; 46*738621d0SMed Ismail Bennani 4759d8dd79SMed Ismail Bennani Locker py_lock(&m_interpreter, Locker::AcquireLock | Locker::NoSTDIN, 4859d8dd79SMed Ismail Bennani Locker::FreeLock); 4959d8dd79SMed Ismail Bennani 5059d8dd79SMed Ismail Bennani void *ret_val = LLDBSwigPythonCreateScriptedThread( 51*738621d0SMed Ismail Bennani class_name.str().c_str(), m_interpreter.GetDictionaryName(), process_sp, 52*738621d0SMed Ismail Bennani args_impl, error_string); 5359d8dd79SMed Ismail Bennani 5459d8dd79SMed Ismail Bennani if (!ret_val) 5559d8dd79SMed Ismail Bennani return {}; 5659d8dd79SMed Ismail Bennani 5759d8dd79SMed Ismail Bennani m_object_instance_sp = 5859d8dd79SMed Ismail Bennani StructuredData::GenericSP(new StructuredPythonObject(ret_val)); 5959d8dd79SMed Ismail Bennani 6059d8dd79SMed Ismail Bennani return m_object_instance_sp; 6159d8dd79SMed Ismail Bennani } 6259d8dd79SMed Ismail Bennani 6359d8dd79SMed Ismail Bennani lldb::tid_t ScriptedThreadPythonInterface::GetThreadID() { 6459d8dd79SMed Ismail Bennani Status error; 6559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_thread_id", error); 6659d8dd79SMed Ismail Bennani 6788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 6859d8dd79SMed Ismail Bennani return LLDB_INVALID_THREAD_ID; 6959d8dd79SMed Ismail Bennani 7059d8dd79SMed Ismail Bennani return obj->GetIntegerValue(LLDB_INVALID_THREAD_ID); 7159d8dd79SMed Ismail Bennani } 7259d8dd79SMed Ismail Bennani 7359d8dd79SMed Ismail Bennani llvm::Optional<std::string> ScriptedThreadPythonInterface::GetName() { 7459d8dd79SMed Ismail Bennani Status error; 7559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_name", error); 7659d8dd79SMed Ismail Bennani 7788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 7859d8dd79SMed Ismail Bennani return {}; 7959d8dd79SMed Ismail Bennani 8059d8dd79SMed Ismail Bennani return obj->GetStringValue().str(); 8159d8dd79SMed Ismail Bennani } 8259d8dd79SMed Ismail Bennani 8359d8dd79SMed Ismail Bennani lldb::StateType ScriptedThreadPythonInterface::GetState() { 8459d8dd79SMed Ismail Bennani Status error; 8559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_state", error); 8659d8dd79SMed Ismail Bennani 8788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 8859d8dd79SMed Ismail Bennani return eStateInvalid; 8959d8dd79SMed Ismail Bennani 9059d8dd79SMed Ismail Bennani return static_cast<StateType>(obj->GetIntegerValue(eStateInvalid)); 9159d8dd79SMed Ismail Bennani } 9259d8dd79SMed Ismail Bennani 9359d8dd79SMed Ismail Bennani llvm::Optional<std::string> ScriptedThreadPythonInterface::GetQueue() { 9459d8dd79SMed Ismail Bennani Status error; 9559d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_queue", error); 9659d8dd79SMed Ismail Bennani 9788a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 9859d8dd79SMed Ismail Bennani return {}; 9959d8dd79SMed Ismail Bennani 10059d8dd79SMed Ismail Bennani return obj->GetStringValue().str(); 10159d8dd79SMed Ismail Bennani } 10259d8dd79SMed Ismail Bennani 10359d8dd79SMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetStopReason() { 10459d8dd79SMed Ismail Bennani Status error; 10559d8dd79SMed Ismail Bennani StructuredData::DictionarySP dict = 10659d8dd79SMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_stop_reason", error); 10759d8dd79SMed Ismail Bennani 10888a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) 10959d8dd79SMed Ismail Bennani return {}; 11059d8dd79SMed Ismail Bennani 11159d8dd79SMed Ismail Bennani return dict; 11259d8dd79SMed Ismail Bennani } 11359d8dd79SMed Ismail Bennani 11459d8dd79SMed Ismail Bennani StructuredData::ArraySP ScriptedThreadPythonInterface::GetStackFrames() { 11559d8dd79SMed Ismail Bennani return nullptr; 11659d8dd79SMed Ismail Bennani } 11759d8dd79SMed Ismail Bennani 11859d8dd79SMed Ismail Bennani StructuredData::DictionarySP ScriptedThreadPythonInterface::GetRegisterInfo() { 11959d8dd79SMed Ismail Bennani Status error; 12059d8dd79SMed Ismail Bennani StructuredData::DictionarySP dict = 12159d8dd79SMed Ismail Bennani Dispatch<StructuredData::DictionarySP>("get_register_info", error); 12259d8dd79SMed Ismail Bennani 12388a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, error)) 12459d8dd79SMed Ismail Bennani return {}; 12559d8dd79SMed Ismail Bennani 12659d8dd79SMed Ismail Bennani return dict; 12759d8dd79SMed Ismail Bennani } 12859d8dd79SMed Ismail Bennani 12959d8dd79SMed Ismail Bennani llvm::Optional<std::string> 13059d8dd79SMed Ismail Bennani ScriptedThreadPythonInterface::GetRegisterContext() { 13159d8dd79SMed Ismail Bennani Status error; 13259d8dd79SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_register_context", error); 13359d8dd79SMed Ismail Bennani 13488a941baSMed Ismail Bennani if (!CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, error)) 13559d8dd79SMed Ismail Bennani return {}; 13659d8dd79SMed Ismail Bennani 13759d8dd79SMed Ismail Bennani return obj->GetAsString()->GetValue().str(); 13859d8dd79SMed Ismail Bennani } 13959d8dd79SMed Ismail Bennani 14059d8dd79SMed Ismail Bennani #endif 141