159d8dd79SMed Ismail Bennani //===-- ScriptedThread.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 "ScriptedThread.h"
1059d8dd79SMed Ismail Bennani
1159d8dd79SMed Ismail Bennani #include "Plugins/Process/Utility/RegisterContextThreadMemory.h"
1259d8dd79SMed Ismail Bennani #include "lldb/Target/OperatingSystem.h"
1359d8dd79SMed Ismail Bennani #include "lldb/Target/Process.h"
1459d8dd79SMed Ismail Bennani #include "lldb/Target/RegisterContext.h"
1559d8dd79SMed Ismail Bennani #include "lldb/Target/StopInfo.h"
1659d8dd79SMed Ismail Bennani #include "lldb/Target/Unwind.h"
1759d8dd79SMed Ismail Bennani #include "lldb/Utility/DataBufferHeap.h"
18c34698a8SPavel Labath #include "lldb/Utility/LLDBLog.h"
1959d8dd79SMed Ismail Bennani #include <memory>
2059d8dd79SMed Ismail Bennani
2159d8dd79SMed Ismail Bennani using namespace lldb;
2259d8dd79SMed Ismail Bennani using namespace lldb_private;
2359d8dd79SMed Ismail Bennani
CheckInterpreterAndScriptObject() const2459d8dd79SMed Ismail Bennani void ScriptedThread::CheckInterpreterAndScriptObject() const {
2559d8dd79SMed Ismail Bennani lldbassert(m_script_object_sp && "Invalid Script Object.");
2659d8dd79SMed Ismail Bennani lldbassert(GetInterface() && "Invalid Scripted Thread Interface.");
2759d8dd79SMed Ismail Bennani }
2859d8dd79SMed Ismail Bennani
2945148bfeSMed Ismail Bennani llvm::Expected<std::shared_ptr<ScriptedThread>>
Create(ScriptedProcess & process,StructuredData::Generic * script_object)3045148bfeSMed Ismail Bennani ScriptedThread::Create(ScriptedProcess &process,
3145148bfeSMed Ismail Bennani StructuredData::Generic *script_object) {
3245148bfeSMed Ismail Bennani if (!process.IsValid())
3345148bfeSMed Ismail Bennani return llvm::createStringError(llvm::inconvertibleErrorCode(),
3445148bfeSMed Ismail Bennani "Invalid scripted process.");
3559d8dd79SMed Ismail Bennani
3659d8dd79SMed Ismail Bennani process.CheckInterpreterAndScriptObject();
3759d8dd79SMed Ismail Bennani
3845148bfeSMed Ismail Bennani auto scripted_thread_interface =
3945148bfeSMed Ismail Bennani process.GetInterface().CreateScriptedThreadInterface();
4045148bfeSMed Ismail Bennani if (!scripted_thread_interface)
4145148bfeSMed Ismail Bennani return llvm::createStringError(
4245148bfeSMed Ismail Bennani llvm::inconvertibleErrorCode(),
4345148bfeSMed Ismail Bennani "Failed to create scripted thread interface.");
4459d8dd79SMed Ismail Bennani
4545148bfeSMed Ismail Bennani llvm::StringRef thread_class_name;
4645148bfeSMed Ismail Bennani if (!script_object) {
4759d8dd79SMed Ismail Bennani llvm::Optional<std::string> class_name =
4859d8dd79SMed Ismail Bennani process.GetInterface().GetScriptedThreadPluginName();
4945148bfeSMed Ismail Bennani if (!class_name || class_name->empty())
5045148bfeSMed Ismail Bennani return llvm::createStringError(
5145148bfeSMed Ismail Bennani llvm::inconvertibleErrorCode(),
5245148bfeSMed Ismail Bennani "Failed to get scripted thread class name.");
5345148bfeSMed Ismail Bennani thread_class_name = *class_name;
5459d8dd79SMed Ismail Bennani }
5559d8dd79SMed Ismail Bennani
5659d8dd79SMed Ismail Bennani ExecutionContext exe_ctx(process);
5745148bfeSMed Ismail Bennani StructuredData::GenericSP owned_script_object_sp =
5845148bfeSMed Ismail Bennani scripted_thread_interface->CreatePluginObject(
5945148bfeSMed Ismail Bennani thread_class_name, exe_ctx,
6045148bfeSMed Ismail Bennani process.m_scripted_process_info.GetArgsSP(), script_object);
6159d8dd79SMed Ismail Bennani
6245148bfeSMed Ismail Bennani if (!owned_script_object_sp)
6345148bfeSMed Ismail Bennani return llvm::createStringError(llvm::inconvertibleErrorCode(),
6445148bfeSMed Ismail Bennani "Failed to create script object.");
6545148bfeSMed Ismail Bennani if (!owned_script_object_sp->IsValid())
6645148bfeSMed Ismail Bennani return llvm::createStringError(llvm::inconvertibleErrorCode(),
6745148bfeSMed Ismail Bennani "Created script object is invalid.");
6859d8dd79SMed Ismail Bennani
69d3e0f7e1SMed Ismail Bennani lldb::tid_t tid = scripted_thread_interface->GetThreadID();
7045148bfeSMed Ismail Bennani
7145148bfeSMed Ismail Bennani return std::make_shared<ScriptedThread>(process, scripted_thread_interface,
7245148bfeSMed Ismail Bennani tid, owned_script_object_sp);
7359d8dd79SMed Ismail Bennani }
7459d8dd79SMed Ismail Bennani
ScriptedThread(ScriptedProcess & process,ScriptedThreadInterfaceSP interface_sp,lldb::tid_t tid,StructuredData::GenericSP script_object_sp)7545148bfeSMed Ismail Bennani ScriptedThread::ScriptedThread(ScriptedProcess &process,
7645148bfeSMed Ismail Bennani ScriptedThreadInterfaceSP interface_sp,
7745148bfeSMed Ismail Bennani lldb::tid_t tid,
7845148bfeSMed Ismail Bennani StructuredData::GenericSP script_object_sp)
7945148bfeSMed Ismail Bennani : Thread(process, tid), m_scripted_process(process),
8045148bfeSMed Ismail Bennani m_scripted_thread_interface_sp(interface_sp),
8145148bfeSMed Ismail Bennani m_script_object_sp(script_object_sp) {}
8245148bfeSMed Ismail Bennani
~ScriptedThread()8359d8dd79SMed Ismail Bennani ScriptedThread::~ScriptedThread() { DestroyThread(); }
8459d8dd79SMed Ismail Bennani
GetName()8559d8dd79SMed Ismail Bennani const char *ScriptedThread::GetName() {
8659d8dd79SMed Ismail Bennani CheckInterpreterAndScriptObject();
8759d8dd79SMed Ismail Bennani llvm::Optional<std::string> thread_name = GetInterface()->GetName();
8859d8dd79SMed Ismail Bennani if (!thread_name)
8959d8dd79SMed Ismail Bennani return nullptr;
9059d8dd79SMed Ismail Bennani return ConstString(thread_name->c_str()).AsCString();
9159d8dd79SMed Ismail Bennani }
9259d8dd79SMed Ismail Bennani
GetQueueName()9359d8dd79SMed Ismail Bennani const char *ScriptedThread::GetQueueName() {
9459d8dd79SMed Ismail Bennani CheckInterpreterAndScriptObject();
9559d8dd79SMed Ismail Bennani llvm::Optional<std::string> queue_name = GetInterface()->GetQueue();
9659d8dd79SMed Ismail Bennani if (!queue_name)
9759d8dd79SMed Ismail Bennani return nullptr;
9859d8dd79SMed Ismail Bennani return ConstString(queue_name->c_str()).AsCString();
9959d8dd79SMed Ismail Bennani }
10059d8dd79SMed Ismail Bennani
WillResume(StateType resume_state)10159d8dd79SMed Ismail Bennani void ScriptedThread::WillResume(StateType resume_state) {}
10259d8dd79SMed Ismail Bennani
ClearStackFrames()10359d8dd79SMed Ismail Bennani void ScriptedThread::ClearStackFrames() { Thread::ClearStackFrames(); }
10459d8dd79SMed Ismail Bennani
GetRegisterContext()10559d8dd79SMed Ismail Bennani RegisterContextSP ScriptedThread::GetRegisterContext() {
106676576b6SMed Ismail Bennani if (!m_reg_context_sp)
107676576b6SMed Ismail Bennani m_reg_context_sp = CreateRegisterContextForFrame(nullptr);
10859d8dd79SMed Ismail Bennani return m_reg_context_sp;
10959d8dd79SMed Ismail Bennani }
11059d8dd79SMed Ismail Bennani
11159d8dd79SMed Ismail Bennani RegisterContextSP
CreateRegisterContextForFrame(StackFrame * frame)11259d8dd79SMed Ismail Bennani ScriptedThread::CreateRegisterContextForFrame(StackFrame *frame) {
113676576b6SMed Ismail Bennani const uint32_t concrete_frame_idx =
114676576b6SMed Ismail Bennani frame ? frame->GetConcreteFrameIndex() : 0;
11559d8dd79SMed Ismail Bennani
116676576b6SMed Ismail Bennani if (concrete_frame_idx)
11759d8dd79SMed Ismail Bennani return GetUnwinder().CreateRegisterContextForFrame(frame);
118676576b6SMed Ismail Bennani
119676576b6SMed Ismail Bennani lldb::RegisterContextSP reg_ctx_sp;
120676576b6SMed Ismail Bennani Status error;
121676576b6SMed Ismail Bennani
122676576b6SMed Ismail Bennani llvm::Optional<std::string> reg_data = GetInterface()->GetRegisterContext();
123676576b6SMed Ismail Bennani if (!reg_data)
124*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<lldb::RegisterContextSP>(
125676576b6SMed Ismail Bennani LLVM_PRETTY_FUNCTION, "Failed to get scripted thread registers data.",
126a007a6d8SPavel Labath error, LLDBLog::Thread);
127676576b6SMed Ismail Bennani
128676576b6SMed Ismail Bennani DataBufferSP data_sp(
129676576b6SMed Ismail Bennani std::make_shared<DataBufferHeap>(reg_data->c_str(), reg_data->size()));
130676576b6SMed Ismail Bennani
131676576b6SMed Ismail Bennani if (!data_sp->GetByteSize())
132*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<lldb::RegisterContextSP>(
133676576b6SMed Ismail Bennani LLVM_PRETTY_FUNCTION, "Failed to copy raw registers data.", error,
134a007a6d8SPavel Labath LLDBLog::Thread);
135676576b6SMed Ismail Bennani
136676576b6SMed Ismail Bennani std::shared_ptr<RegisterContextMemory> reg_ctx_memory =
137676576b6SMed Ismail Bennani std::make_shared<RegisterContextMemory>(
138676576b6SMed Ismail Bennani *this, 0, *GetDynamicRegisterInfo(), LLDB_INVALID_ADDRESS);
139676576b6SMed Ismail Bennani if (!reg_ctx_memory)
140*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<lldb::RegisterContextSP>(
141676576b6SMed Ismail Bennani LLVM_PRETTY_FUNCTION, "Failed to create a register context.", error,
142a007a6d8SPavel Labath LLDBLog::Thread);
143676576b6SMed Ismail Bennani
144676576b6SMed Ismail Bennani reg_ctx_memory->SetAllRegisterData(data_sp);
145676576b6SMed Ismail Bennani m_reg_context_sp = reg_ctx_memory;
146676576b6SMed Ismail Bennani
147676576b6SMed Ismail Bennani return m_reg_context_sp;
14859d8dd79SMed Ismail Bennani }
14959d8dd79SMed Ismail Bennani
LoadArtificialStackFrames()15070665844SMed Ismail Bennani bool ScriptedThread::LoadArtificialStackFrames() {
15170665844SMed Ismail Bennani StructuredData::ArraySP arr_sp = GetInterface()->GetStackFrames();
15270665844SMed Ismail Bennani
15370665844SMed Ismail Bennani Status error;
15470665844SMed Ismail Bennani if (!arr_sp)
155*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
15670665844SMed Ismail Bennani LLVM_PRETTY_FUNCTION, "Failed to get scripted thread stackframes.",
15770665844SMed Ismail Bennani error, LLDBLog::Thread);
15870665844SMed Ismail Bennani
15970665844SMed Ismail Bennani size_t arr_size = arr_sp->GetSize();
16070665844SMed Ismail Bennani if (arr_size > std::numeric_limits<uint32_t>::max())
161*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
16270665844SMed Ismail Bennani LLVM_PRETTY_FUNCTION,
16370665844SMed Ismail Bennani llvm::Twine(
16470665844SMed Ismail Bennani "StackFrame array size (" + llvm::Twine(arr_size) +
16570665844SMed Ismail Bennani llvm::Twine(
16670665844SMed Ismail Bennani ") is greater than maximum autorized for a StackFrameList."))
16770665844SMed Ismail Bennani .str(),
16870665844SMed Ismail Bennani error, LLDBLog::Thread);
16970665844SMed Ismail Bennani
17070665844SMed Ismail Bennani StackFrameListSP frames = GetStackFrameList();
17170665844SMed Ismail Bennani
17270665844SMed Ismail Bennani for (size_t idx = 0; idx < arr_size; idx++) {
17370665844SMed Ismail Bennani
17470665844SMed Ismail Bennani StructuredData::Dictionary *dict;
17570665844SMed Ismail Bennani
17670665844SMed Ismail Bennani if (!arr_sp->GetItemAtIndexAsDictionary(idx, dict) || !dict)
177*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
17870665844SMed Ismail Bennani LLVM_PRETTY_FUNCTION,
17970665844SMed Ismail Bennani llvm::Twine(
18070665844SMed Ismail Bennani "Couldn't get artificial stackframe dictionary at index (" +
18170665844SMed Ismail Bennani llvm::Twine(idx) + llvm::Twine(") from stackframe array."))
18270665844SMed Ismail Bennani .str(),
18370665844SMed Ismail Bennani error, LLDBLog::Thread);
18470665844SMed Ismail Bennani
18570665844SMed Ismail Bennani lldb::addr_t pc;
18670665844SMed Ismail Bennani if (!dict->GetValueForKeyAsInteger("pc", pc))
18770665844SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
18870665844SMed Ismail Bennani LLVM_PRETTY_FUNCTION,
18970665844SMed Ismail Bennani "Couldn't find value for key 'pc' in stackframe dictionary.", error,
19070665844SMed Ismail Bennani LLDBLog::Thread);
19170665844SMed Ismail Bennani
19270665844SMed Ismail Bennani Address symbol_addr;
19370665844SMed Ismail Bennani symbol_addr.SetLoadAddress(pc, &this->GetProcess()->GetTarget());
19470665844SMed Ismail Bennani
19570665844SMed Ismail Bennani lldb::addr_t cfa = LLDB_INVALID_ADDRESS;
19670665844SMed Ismail Bennani bool cfa_is_valid = false;
19770665844SMed Ismail Bennani const bool behaves_like_zeroth_frame = false;
19870665844SMed Ismail Bennani SymbolContext sc;
19970665844SMed Ismail Bennani symbol_addr.CalculateSymbolContext(&sc);
20070665844SMed Ismail Bennani
20170665844SMed Ismail Bennani StackFrameSP synth_frame_sp = std::make_shared<StackFrame>(
20270665844SMed Ismail Bennani this->shared_from_this(), idx, idx, cfa, cfa_is_valid, pc,
20370665844SMed Ismail Bennani StackFrame::Kind::Artificial, behaves_like_zeroth_frame, &sc);
20470665844SMed Ismail Bennani
20570665844SMed Ismail Bennani if (!frames->SetFrameAtIndex(static_cast<uint32_t>(idx), synth_frame_sp))
206*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
20770665844SMed Ismail Bennani LLVM_PRETTY_FUNCTION,
20870665844SMed Ismail Bennani llvm::Twine("Couldn't add frame (" + llvm::Twine(idx) +
20970665844SMed Ismail Bennani llvm::Twine(") to ScriptedThread StackFrameList."))
21070665844SMed Ismail Bennani .str(),
21170665844SMed Ismail Bennani error, LLDBLog::Thread);
21270665844SMed Ismail Bennani }
21370665844SMed Ismail Bennani
21470665844SMed Ismail Bennani return true;
21570665844SMed Ismail Bennani }
21670665844SMed Ismail Bennani
CalculateStopInfo()21759d8dd79SMed Ismail Bennani bool ScriptedThread::CalculateStopInfo() {
21859d8dd79SMed Ismail Bennani StructuredData::DictionarySP dict_sp = GetInterface()->GetStopReason();
21959d8dd79SMed Ismail Bennani
22059d8dd79SMed Ismail Bennani Status error;
221cfa55bfeSMed Ismail Bennani if (!dict_sp)
222*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
223cfa55bfeSMed Ismail Bennani LLVM_PRETTY_FUNCTION, "Failed to get scripted thread stop info.", error,
224a007a6d8SPavel Labath LLDBLog::Thread);
225cfa55bfeSMed Ismail Bennani
22659d8dd79SMed Ismail Bennani lldb::StopInfoSP stop_info_sp;
22759d8dd79SMed Ismail Bennani lldb::StopReason stop_reason_type;
22859d8dd79SMed Ismail Bennani
22959d8dd79SMed Ismail Bennani if (!dict_sp->GetValueForKeyAsInteger("type", stop_reason_type))
230*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
23188a941baSMed Ismail Bennani LLVM_PRETTY_FUNCTION,
232676576b6SMed Ismail Bennani "Couldn't find value for key 'type' in stop reason dictionary.", error,
233a007a6d8SPavel Labath LLDBLog::Thread);
23459d8dd79SMed Ismail Bennani
23559d8dd79SMed Ismail Bennani StructuredData::Dictionary *data_dict;
23659d8dd79SMed Ismail Bennani if (!dict_sp->GetValueForKeyAsDictionary("data", data_dict))
237*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
23888a941baSMed Ismail Bennani LLVM_PRETTY_FUNCTION,
239cfa55bfeSMed Ismail Bennani "Couldn't find value for key 'data' in stop reason dictionary.", error,
240a007a6d8SPavel Labath LLDBLog::Thread);
24159d8dd79SMed Ismail Bennani
24259d8dd79SMed Ismail Bennani switch (stop_reason_type) {
24359d8dd79SMed Ismail Bennani case lldb::eStopReasonNone:
244cfa55bfeSMed Ismail Bennani return true;
24559d8dd79SMed Ismail Bennani case lldb::eStopReasonBreakpoint: {
24659d8dd79SMed Ismail Bennani lldb::break_id_t break_id;
24759d8dd79SMed Ismail Bennani data_dict->GetValueForKeyAsInteger("break_id", break_id,
24859d8dd79SMed Ismail Bennani LLDB_INVALID_BREAK_ID);
24959d8dd79SMed Ismail Bennani stop_info_sp =
25059d8dd79SMed Ismail Bennani StopInfo::CreateStopReasonWithBreakpointSiteID(*this, break_id);
25159d8dd79SMed Ismail Bennani } break;
25259d8dd79SMed Ismail Bennani case lldb::eStopReasonSignal: {
25359d8dd79SMed Ismail Bennani int signal;
25459d8dd79SMed Ismail Bennani llvm::StringRef description;
25559d8dd79SMed Ismail Bennani data_dict->GetValueForKeyAsInteger("signal", signal,
25659d8dd79SMed Ismail Bennani LLDB_INVALID_SIGNAL_NUMBER);
25759d8dd79SMed Ismail Bennani data_dict->GetValueForKeyAsString("desc", description);
25859d8dd79SMed Ismail Bennani stop_info_sp =
25959d8dd79SMed Ismail Bennani StopInfo::CreateStopReasonWithSignal(*this, signal, description.data());
26059d8dd79SMed Ismail Bennani } break;
261cfa55bfeSMed Ismail Bennani case lldb::eStopReasonException: {
262cfa55bfeSMed Ismail Bennani llvm::StringRef description;
263cfa55bfeSMed Ismail Bennani data_dict->GetValueForKeyAsString("desc", description);
264cfa55bfeSMed Ismail Bennani
265cfa55bfeSMed Ismail Bennani stop_info_sp =
266cfa55bfeSMed Ismail Bennani StopInfo::CreateStopReasonWithException(*this, description.data());
267cfa55bfeSMed Ismail Bennani } break;
26859d8dd79SMed Ismail Bennani default:
269*6eddd987SMed Ismail Bennani return ScriptedInterface::ErrorWithMessage<bool>(
27088a941baSMed Ismail Bennani LLVM_PRETTY_FUNCTION,
27159d8dd79SMed Ismail Bennani llvm::Twine("Unsupported stop reason type (" +
27259d8dd79SMed Ismail Bennani llvm::Twine(stop_reason_type) + llvm::Twine(")."))
27359d8dd79SMed Ismail Bennani .str(),
274a007a6d8SPavel Labath error, LLDBLog::Thread);
27559d8dd79SMed Ismail Bennani }
27659d8dd79SMed Ismail Bennani
277cfa55bfeSMed Ismail Bennani if (!stop_info_sp)
278cfa55bfeSMed Ismail Bennani return false;
279cfa55bfeSMed Ismail Bennani
28059d8dd79SMed Ismail Bennani SetStopInfo(stop_info_sp);
28159d8dd79SMed Ismail Bennani return true;
28259d8dd79SMed Ismail Bennani }
28359d8dd79SMed Ismail Bennani
RefreshStateAfterStop()28459d8dd79SMed Ismail Bennani void ScriptedThread::RefreshStateAfterStop() {
285676576b6SMed Ismail Bennani GetRegisterContext()->InvalidateIfNeeded(/*force=*/false);
28670665844SMed Ismail Bennani LoadArtificialStackFrames();
28759d8dd79SMed Ismail Bennani }
28859d8dd79SMed Ismail Bennani
GetInterface() const28959d8dd79SMed Ismail Bennani lldb::ScriptedThreadInterfaceSP ScriptedThread::GetInterface() const {
2901b86344fSMed Ismail Bennani return m_scripted_thread_interface_sp;
29159d8dd79SMed Ismail Bennani }
29259d8dd79SMed Ismail Bennani
GetDynamicRegisterInfo()29359d8dd79SMed Ismail Bennani std::shared_ptr<DynamicRegisterInfo> ScriptedThread::GetDynamicRegisterInfo() {
29459d8dd79SMed Ismail Bennani CheckInterpreterAndScriptObject();
29559d8dd79SMed Ismail Bennani
29659d8dd79SMed Ismail Bennani if (!m_register_info_sp) {
29759d8dd79SMed Ismail Bennani StructuredData::DictionarySP reg_info = GetInterface()->GetRegisterInfo();
298caea440aSMed Ismail Bennani
299caea440aSMed Ismail Bennani Status error;
30059d8dd79SMed Ismail Bennani if (!reg_info)
301caea440aSMed Ismail Bennani return GetInterface()
302caea440aSMed Ismail Bennani ->ErrorWithMessage<std::shared_ptr<DynamicRegisterInfo>>(
303caea440aSMed Ismail Bennani LLVM_PRETTY_FUNCTION,
304caea440aSMed Ismail Bennani "Failed to get scripted thread registers info.", error,
305a007a6d8SPavel Labath LLDBLog::Thread);
30659d8dd79SMed Ismail Bennani
30759d8dd79SMed Ismail Bennani m_register_info_sp = std::make_shared<DynamicRegisterInfo>(
30859d8dd79SMed Ismail Bennani *reg_info, m_scripted_process.GetTarget().GetArchitecture());
30959d8dd79SMed Ismail Bennani }
31059d8dd79SMed Ismail Bennani
31159d8dd79SMed Ismail Bennani return m_register_info_sp;
31259d8dd79SMed Ismail Bennani }
313