LLDB mainline
ScriptedProcess.cpp
Go to the documentation of this file.
1//===-- ScriptedProcess.cpp -----------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "ScriptedProcess.h"
10
11#include "lldb/Core/Debugger.h"
12#include "lldb/Core/Module.h"
14
22#include "lldb/Target/Queue.h"
26#include "lldb/Utility/State.h"
27
28#include <mutex>
29
31
32using namespace lldb;
33using namespace lldb_private;
34
36 return "Scripted Process plug-in.";
37}
38
40 ScriptLanguage::eScriptLanguagePython,
41};
42
44 llvm::ArrayRef<lldb::ScriptLanguage> supported_languages =
45 llvm::ArrayRef(g_supported_script_languages);
46
47 return llvm::is_contained(supported_languages, language);
48}
49
51 lldb::ListenerSP listener_sp,
52 const FileSpec *file,
53 bool can_connect) {
54 if (!target_sp ||
55 !IsScriptLanguageSupported(target_sp->GetDebugger().GetScriptLanguage()))
56 return nullptr;
57
58 ScriptedMetadata scripted_metadata(target_sp->GetProcessLaunchInfo());
59
61 auto process_sp = std::shared_ptr<ScriptedProcess>(
62 new ScriptedProcess(target_sp, listener_sp, scripted_metadata, error));
63
64 if (error.Fail() || !process_sp || !process_sp->m_interface_up) {
65 LLDB_LOGF(GetLog(LLDBLog::Process), "%s", error.AsCString());
66 return nullptr;
67 }
68
69 return process_sp;
70}
71
73 bool plugin_specified_by_name) {
74 return true;
75}
76
78 lldb::ListenerSP listener_sp,
79 const ScriptedMetadata &scripted_metadata,
81 : Process(target_sp, listener_sp), m_scripted_metadata(scripted_metadata) {
82
83 if (!target_sp) {
84 error.SetErrorStringWithFormat("ScriptedProcess::%s () - ERROR: %s",
85 __FUNCTION__, "Invalid target");
86 return;
87 }
88
89 ScriptInterpreter *interpreter =
90 target_sp->GetDebugger().GetScriptInterpreter();
91
92 if (!interpreter) {
93 error.SetErrorStringWithFormat("ScriptedProcess::%s () - ERROR: %s",
94 __FUNCTION__,
95 "Debugger has no Script Interpreter");
96 return;
97 }
98
99 // Create process instance interface
101 if (!m_interface_up) {
102 error.SetErrorStringWithFormat(
103 "ScriptedProcess::%s () - ERROR: %s", __FUNCTION__,
104 "Script interpreter couldn't create Scripted Process Interface");
105 return;
106 }
107
108 ExecutionContext exe_ctx(target_sp, /*get_process=*/false);
109
110 // Create process script object
114
115 if (!object_sp || !object_sp->IsValid()) {
116 error.SetErrorStringWithFormat("ScriptedProcess::%s () - ERROR: %s",
117 __FUNCTION__,
118 "Failed to create valid script object");
119 return;
120 }
121}
122
124 Clear();
125 // We need to call finalize on the process before destroying ourselves to
126 // make sure all of the broadcaster cleanup goes as planned. If we destruct
127 // this class, then Process::~Process() might have problems trying to fully
128 // destroy the broadcaster.
129 Finalize();
130}
131
133 static llvm::once_flag g_once_flag;
134
135 llvm::call_once(g_once_flag, []() {
138 });
139}
140
143}
144
147
148 return DoLaunch(nullptr, launch_info);
149}
150
152 ProcessLaunchInfo &launch_info) {
153 LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s launching process", __FUNCTION__);
154
155 /* MARK: This doesn't reflect how lldb actually launches a process.
156 In reality, it attaches to debugserver, then resume the process.
157 That's not true in all cases. If debugserver is remote, lldb
158 asks debugserver to launch the process for it. */
161 return error;
162}
163
165
167 // Update the PID again, in case the user provided a placeholder pid at launch
169}
170
172 LLDB_LOGF(GetLog(LLDBLog::Process), "ScriptedProcess::%s resuming process", __FUNCTION__);
173
174 return GetInterface().Resume();
175}
176
178 Status error = GetInterface().Attach(attach_info);
181 if (error.Fail())
182 return error;
183 // NOTE: We need to set the PID before finishing to attach otherwise we will
184 // hit an assert when calling the attach completion handler.
185 DidLaunch();
186
187 return {};
188}
189
190Status
192 const ProcessAttachInfo &attach_info) {
193 return DoAttach(attach_info);
194}
195
197 const char *process_name, const ProcessAttachInfo &attach_info) {
198 return DoAttach(attach_info);
199}
200
202 process_arch = GetArchitecture();
203}
204
206
208
209size_t ScriptedProcess::DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
210 Status &error) {
211 lldb::DataExtractorSP data_extractor_sp =
213
214 if (!data_extractor_sp || !data_extractor_sp->GetByteSize() || error.Fail())
215 return 0;
216
217 offset_t bytes_copied = data_extractor_sp->CopyByteOrderedData(
218 0, data_extractor_sp->GetByteSize(), buf, size, GetByteOrder());
219
220 if (!bytes_copied || bytes_copied == LLDB_INVALID_OFFSET)
221 return ScriptedInterface::ErrorWithMessage<size_t>(
222 LLVM_PRETTY_FUNCTION, "Failed to copy read memory to buffer.", error);
223
224 // FIXME: We should use the diagnostic system to report a warning if the
225 // `bytes_copied` is different from `size`.
226
227 return bytes_copied;
228}
229
230size_t ScriptedProcess::DoWriteMemory(lldb::addr_t vm_addr, const void *buf,
231 size_t size, Status &error) {
232 lldb::DataExtractorSP data_extractor_sp = std::make_shared<DataExtractor>(
233 buf, size, GetByteOrder(), GetAddressByteSize());
234
235 if (!data_extractor_sp || !data_extractor_sp->GetByteSize())
236 return 0;
237
238 lldb::offset_t bytes_written =
239 GetInterface().WriteMemoryAtAddress(vm_addr, data_extractor_sp, error);
240
241 if (!bytes_written || bytes_written == LLDB_INVALID_OFFSET)
242 return ScriptedInterface::ErrorWithMessage<size_t>(
243 LLVM_PRETTY_FUNCTION, "Failed to copy write buffer to memory.", error);
244
245 // FIXME: We should use the diagnostic system to report a warning if the
246 // `bytes_written` is different from `size`.
247
248 return bytes_written;
249}
250
252 assert(bp_site != nullptr);
253
254 if (bp_site->IsEnabled()) {
255 return {};
256 }
257
258 if (bp_site->HardwareRequired()) {
259 return Status("Scripted Processes don't support hardware breakpoints");
260 }
261
264
265 return error;
266}
267
269 return GetTarget().GetArchitecture();
270}
271
273 MemoryRegionInfo &region) {
275 if (auto region_or_err =
276 GetInterface().GetMemoryRegionContainingAddress(load_addr, error))
277 region = *region_or_err;
278
279 return error;
280}
281
284 lldb::addr_t address = 0;
285
286 while (auto region_or_err =
287 GetInterface().GetMemoryRegionContainingAddress(address, error)) {
288 if (error.Fail())
289 break;
290
291 MemoryRegionInfo &mem_region = *region_or_err;
292 auto range = mem_region.GetRange();
293 address += range.GetRangeBase() + range.GetByteSize();
294 region_list.push_back(mem_region);
295 }
296
297 return error;
298}
299
301
303 ThreadList &new_thread_list) {
304 // TODO: Implement
305 // This is supposed to get the current set of threads, if any of them are in
306 // old_thread_list then they get copied to new_thread_list, and then any
307 // actually new threads will get added to new_thread_list.
309
312
313 if (!thread_info_sp)
314 return ScriptedInterface::ErrorWithMessage<bool>(
315 LLVM_PRETTY_FUNCTION,
316 "Couldn't fetch thread list from Scripted Process.", error);
317
318 // Because `StructuredData::Dictionary` uses a `std::map<ConstString,
319 // ObjectSP>` for storage, each item is sorted based on the key alphabetical
320 // order. Since `GetThreadsInfo` provides thread indices as the key element,
321 // thread info comes ordered alphabetically, instead of numerically, so we
322 // need to sort the thread indices before creating thread.
323
324 StructuredData::ArraySP keys = thread_info_sp->GetKeys();
325
326 std::map<size_t, StructuredData::ObjectSP> sorted_threads;
327 auto sort_keys = [&sorted_threads,
328 &thread_info_sp](StructuredData::Object *item) -> bool {
329 if (!item)
330 return false;
331
332 llvm::StringRef key = item->GetStringValue();
333 size_t idx = 0;
334
335 // Make sure the provided index is actually an integer
336 if (!llvm::to_integer(key, idx))
337 return false;
338
339 sorted_threads[idx] = thread_info_sp->GetValueForKey(key);
340 return true;
341 };
342
343 size_t thread_count = thread_info_sp->GetSize();
344
345 if (!keys->ForEach(sort_keys) || sorted_threads.size() != thread_count)
346 // Might be worth showing the unsorted thread list instead of return early.
347 return ScriptedInterface::ErrorWithMessage<bool>(
348 LLVM_PRETTY_FUNCTION, "Couldn't sort thread list.", error);
349
350 auto create_scripted_thread =
351 [this, &error, &new_thread_list](
352 const std::pair<size_t, StructuredData::ObjectSP> pair) -> bool {
353 size_t idx = pair.first;
354 StructuredData::ObjectSP object_sp = pair.second;
355
356 if (!object_sp)
357 return ScriptedInterface::ErrorWithMessage<bool>(
358 LLVM_PRETTY_FUNCTION, "Invalid thread info object", error);
359
360 auto thread_or_error =
361 ScriptedThread::Create(*this, object_sp->GetAsGeneric());
362
363 if (!thread_or_error)
364 return ScriptedInterface::ErrorWithMessage<bool>(
365 LLVM_PRETTY_FUNCTION, toString(thread_or_error.takeError()), error);
366
367 ThreadSP thread_sp = thread_or_error.get();
368 lldbassert(thread_sp && "Couldn't initialize scripted thread.");
369
370 RegisterContextSP reg_ctx_sp = thread_sp->GetRegisterContext();
371 if (!reg_ctx_sp)
372 return ScriptedInterface::ErrorWithMessage<bool>(
373 LLVM_PRETTY_FUNCTION,
374 llvm::Twine("Invalid Register Context for thread " + llvm::Twine(idx))
375 .str(),
376 error);
377
378 new_thread_list.AddThread(thread_sp);
379
380 return true;
381 };
382
383 llvm::for_each(sorted_threads, create_scripted_thread);
384
385 return new_thread_list.GetSize(false) > 0;
386}
387
389 // Let all threads recover from stopping and do any clean up based on the
390 // previous thread state (if any).
392}
393
395 info.Clear();
396 info.SetProcessID(GetID());
399 if (module_sp) {
400 const bool add_exe_file_as_first_arg = false;
401 info.SetExecutableFile(GetTarget().GetExecutableModule()->GetFileSpec(),
402 add_exe_file_as_first_arg);
403 }
404 return true;
405}
406
410 auto error_with_message = [&error](llvm::StringRef message) {
411 return ScriptedInterface::ErrorWithMessage<bool>(LLVM_PRETTY_FUNCTION,
412 message.data(), error);
413 };
414
416
417 if (!loaded_images_sp || !loaded_images_sp->GetSize())
418 return ScriptedInterface::ErrorWithMessage<StructuredData::ObjectSP>(
419 LLVM_PRETTY_FUNCTION, "No loaded images.", error);
420
421 ModuleList module_list;
422 Target &target = GetTarget();
423
424 auto reload_image = [&target, &module_list, &error_with_message](
425 StructuredData::Object *obj) -> bool {
427
428 if (!dict)
429 return error_with_message("Couldn't cast image object into dictionary.");
430
431 ModuleSpec module_spec;
432 llvm::StringRef value;
433
434 bool has_path = dict->HasKey("path");
435 bool has_uuid = dict->HasKey("uuid");
436 if (!has_path && !has_uuid)
437 return error_with_message("Dictionary should have key 'path' or 'uuid'");
438 if (!dict->HasKey("load_addr"))
439 return error_with_message("Dictionary is missing key 'load_addr'");
440
441 if (has_path) {
442 dict->GetValueForKeyAsString("path", value);
443 module_spec.GetFileSpec().SetPath(value);
444 }
445
446 if (has_uuid) {
447 dict->GetValueForKeyAsString("uuid", value);
448 module_spec.GetUUID().SetFromStringRef(value);
449 }
450 module_spec.GetArchitecture() = target.GetArchitecture();
451
452 ModuleSP module_sp =
453 target.GetOrCreateModule(module_spec, true /* notify */);
454
455 if (!module_sp)
456 return error_with_message("Couldn't create or get module.");
457
460 dict->GetValueForKeyAsInteger("load_addr", load_addr);
461 dict->GetValueForKeyAsInteger("slide", slide);
462 if (load_addr == LLDB_INVALID_ADDRESS)
463 return error_with_message(
464 "Couldn't get valid load address or slide offset.");
465
466 if (slide != LLDB_INVALID_OFFSET)
467 load_addr += slide;
468
469 bool changed = false;
470 module_sp->SetLoadAddress(target, load_addr, false /*=value_is_offset*/,
471 changed);
472
473 if (!changed && !module_sp->GetObjectFile())
474 return error_with_message("Couldn't set the load address for module.");
475
476 dict->GetValueForKeyAsString("path", value);
477 FileSpec objfile(value);
478 module_sp->SetFileSpecAndObjectName(objfile, objfile.GetFilename());
479
480 return module_list.AppendIfNeeded(module_sp);
481 };
482
483 if (!loaded_images_sp->ForEach(reload_image))
484 return ScriptedInterface::ErrorWithMessage<StructuredData::ObjectSP>(
485 LLVM_PRETTY_FUNCTION, "Couldn't reload all images.", error);
486
487 target.ModulesDidLoad(module_list);
488
489 return loaded_images_sp;
490}
491
494
496 if (!metadata_sp || !metadata_sp->GetSize())
497 return ScriptedInterface::ErrorWithMessage<StructuredData::DictionarySP>(
498 LLVM_PRETTY_FUNCTION, "No metadata.", error);
499
500 return metadata_sp;
501}
502
505 for (ThreadSP thread_sp : Threads()) {
506 if (const char *queue_name = thread_sp->GetQueueName()) {
507 QueueSP queue_sp = std::make_shared<Queue>(
508 m_process->shared_from_this(), thread_sp->GetQueueID(), queue_name);
509 m_queue_list.AddQueue(queue_sp);
510 }
511 }
512}
513
516 return *m_interface_up;
517}
518
520 StructuredData::GenericSP object_instance_sp =
522 if (object_instance_sp &&
523 object_instance_sp->GetType() == eStructuredDataTypeGeneric)
524 return object_instance_sp->GetAsGeneric()->GetValue();
525 return nullptr;
526}
static llvm::raw_ostream & error(Stream &strm)
#define lldbassert(x)
Definition: LLDBAssert.h:15
#define LLDB_LOGF(log,...)
Definition: Log.h:349
#define LLDB_PLUGIN_DEFINE(PluginName)
Definition: PluginManager.h:31
static constexpr lldb::ScriptLanguage g_supported_script_languages[]
An architecture specification class.
Definition: ArchSpec.h:31
Class that manages the actual breakpoint that will be inserted into the running program.
bool IsEnabled() const
Tells whether the current breakpoint site is enabled or not.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A file utility class.
Definition: FileSpec.h:56
const ConstString & GetFilename() const
Filename string const get accessor.
Definition: FileSpec.h:240
void SetPath(llvm::StringRef p)
Temporary helper for FileSystem change.
Definition: FileSpec.h:279
A collection class for Module objects.
Definition: ModuleList.h:82
bool AppendIfNeeded(const lldb::ModuleSP &new_module, bool notify=true)
Append a module to the module list, if it is not already there.
Definition: ModuleList.cpp:253
FileSpec & GetFileSpec()
Definition: ModuleSpec.h:53
ArchSpec & GetArchitecture()
Definition: ModuleSpec.h:89
A class that describes an executable image and its associated object and symbol files.
Definition: Module.h:88
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
void SetExecutableFile(const FileSpec &exe_file, bool add_exe_file_as_first_arg)
Definition: ProcessInfo.cpp:65
void SetArchitecture(const ArchSpec &arch)
Definition: ProcessInfo.h:65
void SetProcessID(lldb::pid_t pid)
Definition: ProcessInfo.h:69
A plug-in interface definition class for debugging a process.
Definition: Process.h:336
virtual void Finalize()
This object is about to be destroyed, do any necessary cleanup.
Definition: Process.cpp:521
lldb::pid_t GetID() const
Returns the pid of the process or LLDB_INVALID_PROCESS_ID if there is no known pid.
Definition: Process.h:535
QueueList m_queue_list
The list of libdispatch queues at a given stop point.
Definition: Process.h:2989
lldb::ByteOrder GetByteOrder() const
Definition: Process.cpp:3399
ThreadList::ThreadIterable Threads()
Definition: Process.h:2163
ThreadPlanStackMap m_thread_plans
This is the list of thread plans for threads in m_thread_list, as well as threads we knew existed,...
Definition: Process.h:2980
uint32_t GetAddressByteSize() const
Definition: Process.cpp:3403
void SetPrivateState(lldb::StateType state)
Definition: Process.cpp:1416
ThreadList m_thread_list
The threads for this process as the user will see them.
Definition: Process.h:2976
lldb::pid_t m_pid
Definition: Process.h:2946
Target & GetTarget()
Get the target object pointer for this module.
Definition: Process.h:1242
void AddQueue(lldb::QueueSP queue)
Add a Queue to the QueueList.
Definition: QueueList.cpp:40
virtual lldb::ScriptedProcessInterfaceUP CreateScriptedProcessInterface()
StructuredData::GenericSP GetScriptObjectInstance()
llvm::StringRef GetClassName() const
StructuredData::DictionarySP GetArgsSP() const
virtual lldb::DataExtractorSP ReadMemoryAtAddress(lldb::addr_t address, size_t size, Status &error)
virtual StructuredData::DictionarySP GetThreadsInfo()
virtual Status Attach(const ProcessAttachInfo &attach_info)
virtual bool CreateBreakpoint(lldb::addr_t addr, Status &error)
virtual StructuredData::DictionarySP GetMetadata()
virtual StructuredData::ArraySP GetLoadedImages()
virtual lldb::offset_t WriteMemoryAtAddress(lldb::addr_t addr, lldb::DataExtractorSP data_sp, Status &error)
StructuredData::GenericSP CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx, StructuredData::DictionarySP args_sp, StructuredData::Generic *script_obj=nullptr) override
Status DoResume() override
Resumes all of a process's threads as configured using the Thread run control functions.
Status DoAttachToProcessWithID(lldb::pid_t pid, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a process ID.
bool CanDebug(lldb::TargetSP target_sp, bool plugin_specified_by_name) override
Check if a plug-in instance can debug the file in module.
bool DoUpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) override
Update the thread list following process plug-in's specific logic.
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, Status &error) override
Actually do the reading of memory from a process.
lldb_private::StructuredData::ObjectSP GetLoadedDynamicLibrariesInfos() override
const ScriptedMetadata m_scripted_metadata
void DidAttach(ArchSpec &process_arch) override
Called after attaching a process.
static llvm::StringRef GetPluginNameStatic()
Status GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list) override
Obtain all the mapped memory regions within this process.
static bool IsScriptLanguageSupported(lldb::ScriptLanguage language)
bool IsAlive() override
Check if a process is still alive.
Status DoAttach(const ProcessAttachInfo &attach_info)
bool GetProcessInfo(ProcessInstanceInfo &info) override
void DidResume() override
Called after resuming a process.
Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override
Launch a new process.
size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, Status &error) override
Actually do the writing of memory to a process.
ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const ScriptedMetadata &scripted_metadata, Status &error)
lldb::ScriptedProcessInterfaceUP m_interface_up
Status EnableBreakpointSite(BreakpointSite *bp_site) override
lldb_private::StructuredData::DictionarySP GetMetadata() override
Fetch process defined metadata.
Status DoAttachToProcessWithName(const char *process_name, const ProcessAttachInfo &attach_info) override
Attach to an existing process using a partial process name.
void RefreshStateAfterStop() override
Currently called as part of ShouldStop.
static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, const FileSpec *crash_file_path, bool can_connect)
static llvm::StringRef GetPluginDescriptionStatic()
ScriptedProcessInterface & GetInterface() const
void DidLaunch() override
Called after launching a process.
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, MemoryRegionInfo &range_info) override
DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has removed non address bits from loa...
static llvm::Expected< std::shared_ptr< ScriptedThread > > Create(ScriptedProcess &process, StructuredData::Generic *script_object=nullptr)
An error handling class.
Definition: Status.h:44
virtual lldb::addr_t GetLoadAddress() const
Definition: StoppointSite.h:27
bool GetValueForKeyAsInteger(llvm::StringRef key, IntType &result) const
bool GetValueForKeyAsString(llvm::StringRef key, llvm::StringRef &result) const
bool HasKey(llvm::StringRef key) const
std::shared_ptr< Generic > GenericSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
std::shared_ptr< Array > ArraySP
const ProcessLaunchInfo & GetProcessLaunchInfo() const
Definition: Target.cpp:4739
void ModulesDidLoad(ModuleList &module_list)
Definition: Target.cpp:1649
lldb::ModuleSP GetOrCreateModule(const ModuleSpec &module_spec, bool notify, Status *error_ptr=nullptr)
Find a binary on the system and return its Module, or return an existing Module that is already in th...
Definition: Target.cpp:2114
lldb::ModuleSP GetExecutableModule()
Gets the module for the main executable.
Definition: Target.cpp:1375
const ArchSpec & GetArchitecture() const
Definition: Target.h:1009
void AddThread(const lldb::ThreadSP &thread_sp)
uint32_t GetSize(bool can_update=true)
Definition: ThreadList.cpp:83
void ClearThreadCache()
Clear the Thread* cache that each ThreadPlan contains.
bool SetFromStringRef(llvm::StringRef str)
Definition: UUID.cpp:97
#define LLDB_INVALID_ADDRESS
Definition: lldb-defines.h:76
#define LLDB_INVALID_OFFSET
Definition: lldb-defines.h:87
A class that represents a running process on the host machine.
Definition: SBAttachInfo.h:14
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition: Log.h:314
const char * toString(AppleArm64ExceptionClass EC)
Definition: SBAddress.h:15
ScriptLanguage
Script interpreter types.
std::shared_ptr< lldb_private::Queue > QueueSP
Definition: lldb-forward.h:377
std::shared_ptr< lldb_private::Thread > ThreadSP
Definition: lldb-forward.h:425
uint64_t offset_t
Definition: lldb-types.h:83
@ eStateStopped
Process or thread is stopped and can be examined.
@ eStateRunning
Process or thread is running and can't be examined.
std::shared_ptr< lldb_private::Process > ProcessSP
Definition: lldb-forward.h:368
uint64_t pid_t
Definition: lldb-types.h:81
std::shared_ptr< lldb_private::Listener > ListenerSP
Definition: lldb-forward.h:349
uint64_t addr_t
Definition: lldb-types.h:79
std::shared_ptr< lldb_private::Target > TargetSP
Definition: lldb-forward.h:423
@ eStructuredDataTypeGeneric
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
Definition: lldb-forward.h:373
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
Definition: lldb-forward.h:320
std::shared_ptr< lldb_private::Module > ModuleSP
Definition: lldb-forward.h:354
BaseType GetRangeBase() const
Definition: RangeMap.h:45