diff options
Diffstat (limited to 'lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp | 97 |
1 files changed, 62 insertions, 35 deletions
diff --git a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp index 09e9375b6f66..15d3d43d9993 100644 --- a/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp +++ b/lldb/source/Plugins/Process/scripted/ScriptedProcess.cpp @@ -20,9 +20,6 @@ #include "lldb/Interpreter/ScriptInterpreter.h" #include "lldb/Target/MemoryRegionInfo.h" #include "lldb/Target/RegisterContext.h" - -#include "lldb/Utility/Log.h" -#include "lldb/Utility/Logging.h" #include "lldb/Utility/State.h" #include <mutex> @@ -32,12 +29,7 @@ LLDB_PLUGIN_DEFINE(ScriptedProcess) using namespace lldb; using namespace lldb_private; -ConstString ScriptedProcess::GetPluginNameStatic() { - static ConstString g_name("ScriptedProcess"); - return g_name; -} - -const char *ScriptedProcess::GetPluginDescriptionStatic() { +llvm::StringRef ScriptedProcess::GetPluginDescriptionStatic() { return "Scripted Process plug-in."; } @@ -109,9 +101,11 @@ ScriptedProcess::ScriptedProcess( return; } - StructuredData::ObjectSP object_sp = GetInterface().CreatePluginObject( - m_scripted_process_info.GetClassName().c_str(), target_sp, - m_scripted_process_info.GetDictionarySP()); + ExecutionContext exe_ctx(target_sp, /*get_process=*/false); + + StructuredData::GenericSP object_sp = GetInterface().CreatePluginObject( + m_scripted_process_info.GetClassName().c_str(), exe_ctx, + m_scripted_process_info.GetArgsSP()); if (!object_sp || !object_sp->IsValid()) { error.SetErrorStringWithFormat("ScriptedProcess::%s () - ERROR: %s", @@ -145,10 +139,6 @@ void ScriptedProcess::Terminate() { PluginManager::UnregisterPlugin(ScriptedProcess::CreateInstance); } -ConstString ScriptedProcess::GetPluginName() { return GetPluginNameStatic(); } - -uint32_t ScriptedProcess::GetPluginVersion() { return 1; } - Status ScriptedProcess::DoLoadCore() { ProcessLaunchInfo launch_info = GetTarget().GetProcessLaunchInfo(); @@ -234,26 +224,22 @@ bool ScriptedProcess::IsAlive() { size_t ScriptedProcess::DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) { - - auto error_with_message = [&error](llvm::StringRef message) { - error.SetErrorString(message); - return 0; - }; - if (!m_interpreter) - return error_with_message("No interpreter."); + return GetInterface().ErrorWithMessage<size_t>(LLVM_PRETTY_FUNCTION, + "No interpreter.", error); lldb::DataExtractorSP data_extractor_sp = GetInterface().ReadMemoryAtAddress(addr, size, error); - if (!data_extractor_sp || error.Fail()) + if (!data_extractor_sp || !data_extractor_sp->GetByteSize() || error.Fail()) return 0; offset_t bytes_copied = data_extractor_sp->CopyByteOrderedData( 0, data_extractor_sp->GetByteSize(), buf, size, GetByteOrder()); if (!bytes_copied || bytes_copied == LLDB_INVALID_OFFSET) - return error_with_message("Failed to copy read memory to buffer."); + return GetInterface().ErrorWithMessage<size_t>( + LLVM_PRETTY_FUNCTION, "Failed to copy read memory to buffer.", error); return size; } @@ -262,26 +248,36 @@ ArchSpec ScriptedProcess::GetArchitecture() { return GetTarget().GetArchitecture(); } -Status ScriptedProcess::GetMemoryRegionInfo(lldb::addr_t load_addr, - MemoryRegionInfo ®ion) { - // TODO: Implement - return Status(); +Status ScriptedProcess::DoGetMemoryRegionInfo(lldb::addr_t load_addr, + MemoryRegionInfo ®ion) { + CheckInterpreterAndScriptObject(); + + Status error; + if (auto region_or_err = + GetInterface().GetMemoryRegionContainingAddress(load_addr, error)) + region = *region_or_err; + + return error; } Status ScriptedProcess::GetMemoryRegions(MemoryRegionInfos ®ion_list) { CheckInterpreterAndScriptObject(); + Status error; lldb::addr_t address = 0; - lldb::MemoryRegionInfoSP mem_region_sp = nullptr; - while ((mem_region_sp = - GetInterface().GetMemoryRegionContainingAddress(address))) { - auto range = mem_region_sp->GetRange(); + while (auto region_or_err = + GetInterface().GetMemoryRegionContainingAddress(address, error)) { + if (error.Fail()) + break; + + MemoryRegionInfo &mem_region = *region_or_err; + auto range = mem_region.GetRange(); address += range.GetRangeBase() + range.GetByteSize(); - region_list.push_back(*mem_region_sp.get()); + region_list.push_back(mem_region); } - return {}; + return error; } void ScriptedProcess::Clear() { Process::m_thread_list.Clear(); } @@ -292,9 +288,40 @@ bool ScriptedProcess::DoUpdateThreadList(ThreadList &old_thread_list, // This is supposed to get the current set of threads, if any of them are in // old_thread_list then they get copied to new_thread_list, and then any // actually new threads will get added to new_thread_list. + + CheckInterpreterAndScriptObject(); + m_thread_plans.ClearThreadCache(); + + Status error; + ScriptLanguage language = m_interpreter->GetLanguage(); + + if (language != eScriptLanguagePython) + return GetInterface().ErrorWithMessage<bool>( + LLVM_PRETTY_FUNCTION, + llvm::Twine("ScriptInterpreter language (" + + llvm::Twine(m_interpreter->LanguageToString(language)) + + llvm::Twine(") not supported.")) + .str(), + error); + + lldb::ThreadSP thread_sp; + thread_sp = std::make_shared<ScriptedThread>(*this, error); + + if (!thread_sp || error.Fail()) + return GetInterface().ErrorWithMessage<bool>(LLVM_PRETTY_FUNCTION, + error.AsCString(), error); + + new_thread_list.AddThread(thread_sp); + return new_thread_list.GetSize(false) > 0; } +void ScriptedProcess::RefreshStateAfterStop() { + // Let all threads recover from stopping and do any clean up based on the + // previous thread state (if any). + m_thread_list.RefreshStateAfterStop(); +} + bool ScriptedProcess::GetProcessInfo(ProcessInstanceInfo &info) { info.Clear(); info.SetProcessID(GetID()); |