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