135653324SMed Ismail Bennani //===-- ScriptedThreadPythonInterface.cpp ---------------------------------===// 235653324SMed Ismail Bennani // 335653324SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 435653324SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information. 535653324SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 635653324SMed Ismail Bennani // 735653324SMed Ismail Bennani //===----------------------------------------------------------------------===// 835653324SMed Ismail Bennani 935653324SMed Ismail Bennani #include "lldb/Core/PluginManager.h" 1035653324SMed Ismail Bennani #include "lldb/Host/Config.h" 1135653324SMed Ismail Bennani #include "lldb/Target/ExecutionContext.h" 1235653324SMed Ismail Bennani #include "lldb/Utility/Log.h" 1335653324SMed Ismail Bennani #include "lldb/lldb-enumerations.h" 1435653324SMed Ismail Bennani 1535653324SMed Ismail Bennani #if LLDB_ENABLE_PYTHON 1635653324SMed Ismail Bennani 1735653324SMed Ismail Bennani // clang-format off 1835653324SMed Ismail Bennani // LLDB Python header must be included first 1935653324SMed Ismail Bennani #include "../lldb-python.h" 2035653324SMed Ismail Bennani //clang-format on 2135653324SMed Ismail Bennani 2235653324SMed Ismail Bennani #include "../SWIGPythonBridge.h" 2335653324SMed Ismail Bennani #include "../ScriptInterpreterPythonImpl.h" 2435653324SMed Ismail Bennani #include "OperatingSystemPythonInterface.h" 2535653324SMed Ismail Bennani 2635653324SMed Ismail Bennani using namespace lldb; 2735653324SMed Ismail Bennani using namespace lldb_private; 2835653324SMed Ismail Bennani using namespace lldb_private::python; 2935653324SMed Ismail Bennani using Locker = ScriptInterpreterPythonImpl::Locker; 3035653324SMed Ismail Bennani 3135653324SMed Ismail Bennani OperatingSystemPythonInterface::OperatingSystemPythonInterface( 3235653324SMed Ismail Bennani ScriptInterpreterPythonImpl &interpreter) 3335653324SMed Ismail Bennani : OperatingSystemInterface(), ScriptedThreadPythonInterface(interpreter) {} 3435653324SMed Ismail Bennani 3535653324SMed Ismail Bennani llvm::Expected<StructuredData::GenericSP> 3635653324SMed Ismail Bennani OperatingSystemPythonInterface::CreatePluginObject( 3735653324SMed Ismail Bennani llvm::StringRef class_name, ExecutionContext &exe_ctx, 3835653324SMed Ismail Bennani StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj) { 3935653324SMed Ismail Bennani return ScriptedPythonInterface::CreatePluginObject(class_name, nullptr, 4035653324SMed Ismail Bennani exe_ctx.GetProcessSP()); 4135653324SMed Ismail Bennani } 4235653324SMed Ismail Bennani 4335653324SMed Ismail Bennani StructuredData::DictionarySP 4435653324SMed Ismail Bennani OperatingSystemPythonInterface::CreateThread(lldb::tid_t tid, 4535653324SMed Ismail Bennani lldb::addr_t context) { 4635653324SMed Ismail Bennani Status error; 4735653324SMed Ismail Bennani StructuredData::DictionarySP dict = Dispatch<StructuredData::DictionarySP>( 4835653324SMed Ismail Bennani "create_thread", error, tid, context); 4935653324SMed Ismail Bennani 5035653324SMed Ismail Bennani if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, dict, 5135653324SMed Ismail Bennani error)) 5235653324SMed Ismail Bennani return {}; 5335653324SMed Ismail Bennani 5435653324SMed Ismail Bennani return dict; 5535653324SMed Ismail Bennani } 5635653324SMed Ismail Bennani 5735653324SMed Ismail Bennani StructuredData::ArraySP OperatingSystemPythonInterface::GetThreadInfo() { 5835653324SMed Ismail Bennani Status error; 5935653324SMed Ismail Bennani StructuredData::ArraySP arr = 6035653324SMed Ismail Bennani Dispatch<StructuredData::ArraySP>("get_thread_info", error); 6135653324SMed Ismail Bennani 6235653324SMed Ismail Bennani if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, arr, 6335653324SMed Ismail Bennani error)) 6435653324SMed Ismail Bennani return {}; 6535653324SMed Ismail Bennani 6635653324SMed Ismail Bennani return arr; 6735653324SMed Ismail Bennani } 6835653324SMed Ismail Bennani 6935653324SMed Ismail Bennani StructuredData::DictionarySP OperatingSystemPythonInterface::GetRegisterInfo() { 7035653324SMed Ismail Bennani return ScriptedThreadPythonInterface::GetRegisterInfo(); 7135653324SMed Ismail Bennani } 7235653324SMed Ismail Bennani 7335653324SMed Ismail Bennani std::optional<std::string> 7435653324SMed Ismail Bennani OperatingSystemPythonInterface::GetRegisterContextForTID(lldb::tid_t tid) { 7535653324SMed Ismail Bennani Status error; 7635653324SMed Ismail Bennani StructuredData::ObjectSP obj = Dispatch("get_register_data", error, tid); 7735653324SMed Ismail Bennani 7835653324SMed Ismail Bennani if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 7935653324SMed Ismail Bennani error)) 8035653324SMed Ismail Bennani return {}; 8135653324SMed Ismail Bennani 8235653324SMed Ismail Bennani return obj->GetAsString()->GetValue().str(); 8335653324SMed Ismail Bennani } 8435653324SMed Ismail Bennani 85*cb82771cSFelipe de Azevedo Piovezan std::optional<bool> OperatingSystemPythonInterface::DoesPluginReportAllThreads() { 86*cb82771cSFelipe de Azevedo Piovezan Status error; 87*cb82771cSFelipe de Azevedo Piovezan StructuredData::ObjectSP obj = Dispatch("does_plugin_report_all_threads", error); 88*cb82771cSFelipe de Azevedo Piovezan if (!ScriptedInterface::CheckStructuredDataObject(LLVM_PRETTY_FUNCTION, obj, 89*cb82771cSFelipe de Azevedo Piovezan error)) 90*cb82771cSFelipe de Azevedo Piovezan return {}; 91*cb82771cSFelipe de Azevedo Piovezan 92*cb82771cSFelipe de Azevedo Piovezan return obj->GetAsBoolean()->GetValue(); 93*cb82771cSFelipe de Azevedo Piovezan } 94*cb82771cSFelipe de Azevedo Piovezan 9535653324SMed Ismail Bennani void OperatingSystemPythonInterface::Initialize() { 9635653324SMed Ismail Bennani const std::vector<llvm::StringRef> ci_usages = { 9735653324SMed Ismail Bennani "settings set target.process.python-os-plugin-path <script-path>", 9835653324SMed Ismail Bennani "settings set process.experimental.os-plugin-reports-all-threads [0/1]"}; 9935653324SMed Ismail Bennani const std::vector<llvm::StringRef> api_usages = {}; 10035653324SMed Ismail Bennani PluginManager::RegisterPlugin( 10135653324SMed Ismail Bennani GetPluginNameStatic(), llvm::StringRef("Mock thread state"), 10235653324SMed Ismail Bennani CreateInstance, eScriptLanguagePython, {ci_usages, api_usages}); 10335653324SMed Ismail Bennani } 10435653324SMed Ismail Bennani 10535653324SMed Ismail Bennani void OperatingSystemPythonInterface::Terminate() { 10635653324SMed Ismail Bennani PluginManager::UnregisterPlugin(CreateInstance); 10735653324SMed Ismail Bennani } 10835653324SMed Ismail Bennani 10935653324SMed Ismail Bennani #endif 110