Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/API/SBProcess.cpp
39587 views
1
//===-- SBProcess.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 "lldb/API/SBProcess.h"
10
#include "lldb/Utility/Instrumentation.h"
11
12
#include <cinttypes>
13
14
#include "lldb/lldb-defines.h"
15
#include "lldb/lldb-types.h"
16
17
#include "lldb/Core/AddressRangeListImpl.h"
18
#include "lldb/Core/Debugger.h"
19
#include "lldb/Core/Module.h"
20
#include "lldb/Core/PluginManager.h"
21
#include "lldb/Core/StructuredDataImpl.h"
22
#include "lldb/Host/StreamFile.h"
23
#include "lldb/Target/MemoryRegionInfo.h"
24
#include "lldb/Target/Process.h"
25
#include "lldb/Target/RegisterContext.h"
26
#include "lldb/Target/SystemRuntime.h"
27
#include "lldb/Target/Target.h"
28
#include "lldb/Target/Thread.h"
29
#include "lldb/Utility/Args.h"
30
#include "lldb/Utility/LLDBLog.h"
31
#include "lldb/Utility/ProcessInfo.h"
32
#include "lldb/Utility/State.h"
33
#include "lldb/Utility/Stream.h"
34
35
#include "lldb/API/SBBroadcaster.h"
36
#include "lldb/API/SBCommandReturnObject.h"
37
#include "lldb/API/SBDebugger.h"
38
#include "lldb/API/SBEvent.h"
39
#include "lldb/API/SBFile.h"
40
#include "lldb/API/SBFileSpec.h"
41
#include "lldb/API/SBMemoryRegionInfo.h"
42
#include "lldb/API/SBMemoryRegionInfoList.h"
43
#include "lldb/API/SBSaveCoreOptions.h"
44
#include "lldb/API/SBScriptObject.h"
45
#include "lldb/API/SBStream.h"
46
#include "lldb/API/SBStringList.h"
47
#include "lldb/API/SBStructuredData.h"
48
#include "lldb/API/SBThread.h"
49
#include "lldb/API/SBThreadCollection.h"
50
#include "lldb/API/SBTrace.h"
51
#include "lldb/API/SBUnixSignals.h"
52
53
using namespace lldb;
54
using namespace lldb_private;
55
56
SBProcess::SBProcess() { LLDB_INSTRUMENT_VA(this); }
57
58
// SBProcess constructor
59
60
SBProcess::SBProcess(const SBProcess &rhs) : m_opaque_wp(rhs.m_opaque_wp) {
61
LLDB_INSTRUMENT_VA(this, rhs);
62
}
63
64
SBProcess::SBProcess(const lldb::ProcessSP &process_sp)
65
: m_opaque_wp(process_sp) {
66
LLDB_INSTRUMENT_VA(this, process_sp);
67
}
68
69
const SBProcess &SBProcess::operator=(const SBProcess &rhs) {
70
LLDB_INSTRUMENT_VA(this, rhs);
71
72
if (this != &rhs)
73
m_opaque_wp = rhs.m_opaque_wp;
74
return *this;
75
}
76
77
// Destructor
78
SBProcess::~SBProcess() = default;
79
80
const char *SBProcess::GetBroadcasterClassName() {
81
LLDB_INSTRUMENT();
82
83
return ConstString(Process::GetStaticBroadcasterClass()).AsCString();
84
}
85
86
const char *SBProcess::GetPluginName() {
87
LLDB_INSTRUMENT_VA(this);
88
89
ProcessSP process_sp(GetSP());
90
if (process_sp) {
91
return ConstString(process_sp->GetPluginName()).GetCString();
92
}
93
return "<Unknown>";
94
}
95
96
const char *SBProcess::GetShortPluginName() {
97
LLDB_INSTRUMENT_VA(this);
98
99
ProcessSP process_sp(GetSP());
100
if (process_sp) {
101
return ConstString(process_sp->GetPluginName()).GetCString();
102
}
103
return "<Unknown>";
104
}
105
106
lldb::ProcessSP SBProcess::GetSP() const { return m_opaque_wp.lock(); }
107
108
void SBProcess::SetSP(const ProcessSP &process_sp) { m_opaque_wp = process_sp; }
109
110
void SBProcess::Clear() {
111
LLDB_INSTRUMENT_VA(this);
112
113
m_opaque_wp.reset();
114
}
115
116
bool SBProcess::IsValid() const {
117
LLDB_INSTRUMENT_VA(this);
118
return this->operator bool();
119
}
120
SBProcess::operator bool() const {
121
LLDB_INSTRUMENT_VA(this);
122
123
ProcessSP process_sp(m_opaque_wp.lock());
124
return ((bool)process_sp && process_sp->IsValid());
125
}
126
127
bool SBProcess::RemoteLaunch(char const **argv, char const **envp,
128
const char *stdin_path, const char *stdout_path,
129
const char *stderr_path,
130
const char *working_directory,
131
uint32_t launch_flags, bool stop_at_entry,
132
lldb::SBError &error) {
133
LLDB_INSTRUMENT_VA(this, argv, envp, stdin_path, stdout_path, stderr_path,
134
working_directory, launch_flags, stop_at_entry, error);
135
136
ProcessSP process_sp(GetSP());
137
if (process_sp) {
138
std::lock_guard<std::recursive_mutex> guard(
139
process_sp->GetTarget().GetAPIMutex());
140
if (process_sp->GetState() == eStateConnected) {
141
if (stop_at_entry)
142
launch_flags |= eLaunchFlagStopAtEntry;
143
ProcessLaunchInfo launch_info(FileSpec(stdin_path), FileSpec(stdout_path),
144
FileSpec(stderr_path),
145
FileSpec(working_directory), launch_flags);
146
Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
147
if (exe_module)
148
launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
149
if (argv)
150
launch_info.GetArguments().AppendArguments(argv);
151
if (envp)
152
launch_info.GetEnvironment() = Environment(envp);
153
error.SetError(process_sp->Launch(launch_info));
154
} else {
155
error.SetErrorString("must be in eStateConnected to call RemoteLaunch");
156
}
157
} else {
158
error.SetErrorString("unable to attach pid");
159
}
160
161
return error.Success();
162
}
163
164
bool SBProcess::RemoteAttachToProcessWithID(lldb::pid_t pid,
165
lldb::SBError &error) {
166
LLDB_INSTRUMENT_VA(this, pid, error);
167
168
ProcessSP process_sp(GetSP());
169
if (process_sp) {
170
std::lock_guard<std::recursive_mutex> guard(
171
process_sp->GetTarget().GetAPIMutex());
172
if (process_sp->GetState() == eStateConnected) {
173
ProcessAttachInfo attach_info;
174
attach_info.SetProcessID(pid);
175
error.SetError(process_sp->Attach(attach_info));
176
} else {
177
error.SetErrorString(
178
"must be in eStateConnected to call RemoteAttachToProcessWithID");
179
}
180
} else {
181
error.SetErrorString("unable to attach pid");
182
}
183
184
return error.Success();
185
}
186
187
uint32_t SBProcess::GetNumThreads() {
188
LLDB_INSTRUMENT_VA(this);
189
190
uint32_t num_threads = 0;
191
ProcessSP process_sp(GetSP());
192
if (process_sp) {
193
Process::StopLocker stop_locker;
194
195
const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
196
std::lock_guard<std::recursive_mutex> guard(
197
process_sp->GetTarget().GetAPIMutex());
198
num_threads = process_sp->GetThreadList().GetSize(can_update);
199
}
200
201
return num_threads;
202
}
203
204
SBThread SBProcess::GetSelectedThread() const {
205
LLDB_INSTRUMENT_VA(this);
206
207
SBThread sb_thread;
208
ThreadSP thread_sp;
209
ProcessSP process_sp(GetSP());
210
if (process_sp) {
211
std::lock_guard<std::recursive_mutex> guard(
212
process_sp->GetTarget().GetAPIMutex());
213
thread_sp = process_sp->GetThreadList().GetSelectedThread();
214
sb_thread.SetThread(thread_sp);
215
}
216
217
return sb_thread;
218
}
219
220
SBThread SBProcess::CreateOSPluginThread(lldb::tid_t tid,
221
lldb::addr_t context) {
222
LLDB_INSTRUMENT_VA(this, tid, context);
223
224
SBThread sb_thread;
225
ThreadSP thread_sp;
226
ProcessSP process_sp(GetSP());
227
if (process_sp) {
228
std::lock_guard<std::recursive_mutex> guard(
229
process_sp->GetTarget().GetAPIMutex());
230
thread_sp = process_sp->CreateOSPluginThread(tid, context);
231
sb_thread.SetThread(thread_sp);
232
}
233
234
return sb_thread;
235
}
236
237
SBTarget SBProcess::GetTarget() const {
238
LLDB_INSTRUMENT_VA(this);
239
240
SBTarget sb_target;
241
TargetSP target_sp;
242
ProcessSP process_sp(GetSP());
243
if (process_sp) {
244
target_sp = process_sp->GetTarget().shared_from_this();
245
sb_target.SetSP(target_sp);
246
}
247
248
return sb_target;
249
}
250
251
size_t SBProcess::PutSTDIN(const char *src, size_t src_len) {
252
LLDB_INSTRUMENT_VA(this, src, src_len);
253
254
size_t ret_val = 0;
255
ProcessSP process_sp(GetSP());
256
if (process_sp) {
257
Status error;
258
ret_val = process_sp->PutSTDIN(src, src_len, error);
259
}
260
261
return ret_val;
262
}
263
264
size_t SBProcess::GetSTDOUT(char *dst, size_t dst_len) const {
265
LLDB_INSTRUMENT_VA(this, dst, dst_len);
266
267
size_t bytes_read = 0;
268
ProcessSP process_sp(GetSP());
269
if (process_sp) {
270
Status error;
271
bytes_read = process_sp->GetSTDOUT(dst, dst_len, error);
272
}
273
274
return bytes_read;
275
}
276
277
size_t SBProcess::GetSTDERR(char *dst, size_t dst_len) const {
278
LLDB_INSTRUMENT_VA(this, dst, dst_len);
279
280
size_t bytes_read = 0;
281
ProcessSP process_sp(GetSP());
282
if (process_sp) {
283
Status error;
284
bytes_read = process_sp->GetSTDERR(dst, dst_len, error);
285
}
286
287
return bytes_read;
288
}
289
290
size_t SBProcess::GetAsyncProfileData(char *dst, size_t dst_len) const {
291
LLDB_INSTRUMENT_VA(this, dst, dst_len);
292
293
size_t bytes_read = 0;
294
ProcessSP process_sp(GetSP());
295
if (process_sp) {
296
Status error;
297
bytes_read = process_sp->GetAsyncProfileData(dst, dst_len, error);
298
}
299
300
return bytes_read;
301
}
302
303
void SBProcess::ReportEventState(const SBEvent &event, SBFile out) const {
304
LLDB_INSTRUMENT_VA(this, event, out);
305
306
return ReportEventState(event, out.m_opaque_sp);
307
}
308
309
void SBProcess::ReportEventState(const SBEvent &event, FILE *out) const {
310
LLDB_INSTRUMENT_VA(this, event, out);
311
FileSP outfile = std::make_shared<NativeFile>(out, false);
312
return ReportEventState(event, outfile);
313
}
314
315
void SBProcess::ReportEventState(const SBEvent &event, FileSP out) const {
316
317
LLDB_INSTRUMENT_VA(this, event, out);
318
319
if (!out || !out->IsValid())
320
return;
321
322
ProcessSP process_sp(GetSP());
323
if (process_sp) {
324
StreamFile stream(out);
325
const StateType event_state = SBProcess::GetStateFromEvent(event);
326
stream.Printf("Process %" PRIu64 " %s\n", process_sp->GetID(),
327
SBDebugger::StateAsCString(event_state));
328
}
329
}
330
331
void SBProcess::AppendEventStateReport(const SBEvent &event,
332
SBCommandReturnObject &result) {
333
LLDB_INSTRUMENT_VA(this, event, result);
334
335
ProcessSP process_sp(GetSP());
336
if (process_sp) {
337
const StateType event_state = SBProcess::GetStateFromEvent(event);
338
char message[1024];
339
::snprintf(message, sizeof(message), "Process %" PRIu64 " %s\n",
340
process_sp->GetID(), SBDebugger::StateAsCString(event_state));
341
342
result.AppendMessage(message);
343
}
344
}
345
346
bool SBProcess::SetSelectedThread(const SBThread &thread) {
347
LLDB_INSTRUMENT_VA(this, thread);
348
349
ProcessSP process_sp(GetSP());
350
if (process_sp) {
351
std::lock_guard<std::recursive_mutex> guard(
352
process_sp->GetTarget().GetAPIMutex());
353
return process_sp->GetThreadList().SetSelectedThreadByID(
354
thread.GetThreadID());
355
}
356
return false;
357
}
358
359
bool SBProcess::SetSelectedThreadByID(lldb::tid_t tid) {
360
LLDB_INSTRUMENT_VA(this, tid);
361
362
bool ret_val = false;
363
ProcessSP process_sp(GetSP());
364
if (process_sp) {
365
std::lock_guard<std::recursive_mutex> guard(
366
process_sp->GetTarget().GetAPIMutex());
367
ret_val = process_sp->GetThreadList().SetSelectedThreadByID(tid);
368
}
369
370
return ret_val;
371
}
372
373
bool SBProcess::SetSelectedThreadByIndexID(uint32_t index_id) {
374
LLDB_INSTRUMENT_VA(this, index_id);
375
376
bool ret_val = false;
377
ProcessSP process_sp(GetSP());
378
if (process_sp) {
379
std::lock_guard<std::recursive_mutex> guard(
380
process_sp->GetTarget().GetAPIMutex());
381
ret_val = process_sp->GetThreadList().SetSelectedThreadByIndexID(index_id);
382
}
383
384
return ret_val;
385
}
386
387
SBThread SBProcess::GetThreadAtIndex(size_t index) {
388
LLDB_INSTRUMENT_VA(this, index);
389
390
SBThread sb_thread;
391
ThreadSP thread_sp;
392
ProcessSP process_sp(GetSP());
393
if (process_sp) {
394
Process::StopLocker stop_locker;
395
const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
396
std::lock_guard<std::recursive_mutex> guard(
397
process_sp->GetTarget().GetAPIMutex());
398
thread_sp = process_sp->GetThreadList().GetThreadAtIndex(index, can_update);
399
sb_thread.SetThread(thread_sp);
400
}
401
402
return sb_thread;
403
}
404
405
uint32_t SBProcess::GetNumQueues() {
406
LLDB_INSTRUMENT_VA(this);
407
408
uint32_t num_queues = 0;
409
ProcessSP process_sp(GetSP());
410
if (process_sp) {
411
Process::StopLocker stop_locker;
412
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
413
std::lock_guard<std::recursive_mutex> guard(
414
process_sp->GetTarget().GetAPIMutex());
415
num_queues = process_sp->GetQueueList().GetSize();
416
}
417
}
418
419
return num_queues;
420
}
421
422
SBQueue SBProcess::GetQueueAtIndex(size_t index) {
423
LLDB_INSTRUMENT_VA(this, index);
424
425
SBQueue sb_queue;
426
QueueSP queue_sp;
427
ProcessSP process_sp(GetSP());
428
if (process_sp) {
429
Process::StopLocker stop_locker;
430
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
431
std::lock_guard<std::recursive_mutex> guard(
432
process_sp->GetTarget().GetAPIMutex());
433
queue_sp = process_sp->GetQueueList().GetQueueAtIndex(index);
434
sb_queue.SetQueue(queue_sp);
435
}
436
}
437
438
return sb_queue;
439
}
440
441
uint32_t SBProcess::GetStopID(bool include_expression_stops) {
442
LLDB_INSTRUMENT_VA(this, include_expression_stops);
443
444
ProcessSP process_sp(GetSP());
445
if (process_sp) {
446
std::lock_guard<std::recursive_mutex> guard(
447
process_sp->GetTarget().GetAPIMutex());
448
if (include_expression_stops)
449
return process_sp->GetStopID();
450
else
451
return process_sp->GetLastNaturalStopID();
452
}
453
return 0;
454
}
455
456
SBEvent SBProcess::GetStopEventForStopID(uint32_t stop_id) {
457
LLDB_INSTRUMENT_VA(this, stop_id);
458
459
SBEvent sb_event;
460
EventSP event_sp;
461
ProcessSP process_sp(GetSP());
462
if (process_sp) {
463
std::lock_guard<std::recursive_mutex> guard(
464
process_sp->GetTarget().GetAPIMutex());
465
event_sp = process_sp->GetStopEventForStopID(stop_id);
466
sb_event.reset(event_sp);
467
}
468
469
return sb_event;
470
}
471
472
void SBProcess::ForceScriptedState(StateType new_state) {
473
LLDB_INSTRUMENT_VA(this, new_state);
474
475
if (ProcessSP process_sp = GetSP()) {
476
std::lock_guard<std::recursive_mutex> guard(
477
process_sp->GetTarget().GetAPIMutex());
478
process_sp->ForceScriptedState(new_state);
479
}
480
}
481
482
StateType SBProcess::GetState() {
483
LLDB_INSTRUMENT_VA(this);
484
485
StateType ret_val = eStateInvalid;
486
ProcessSP process_sp(GetSP());
487
if (process_sp) {
488
std::lock_guard<std::recursive_mutex> guard(
489
process_sp->GetTarget().GetAPIMutex());
490
ret_val = process_sp->GetState();
491
}
492
493
return ret_val;
494
}
495
496
int SBProcess::GetExitStatus() {
497
LLDB_INSTRUMENT_VA(this);
498
499
int exit_status = 0;
500
ProcessSP process_sp(GetSP());
501
if (process_sp) {
502
std::lock_guard<std::recursive_mutex> guard(
503
process_sp->GetTarget().GetAPIMutex());
504
exit_status = process_sp->GetExitStatus();
505
}
506
507
return exit_status;
508
}
509
510
const char *SBProcess::GetExitDescription() {
511
LLDB_INSTRUMENT_VA(this);
512
513
ProcessSP process_sp(GetSP());
514
if (!process_sp)
515
return nullptr;
516
517
std::lock_guard<std::recursive_mutex> guard(
518
process_sp->GetTarget().GetAPIMutex());
519
return ConstString(process_sp->GetExitDescription()).GetCString();
520
}
521
522
lldb::pid_t SBProcess::GetProcessID() {
523
LLDB_INSTRUMENT_VA(this);
524
525
lldb::pid_t ret_val = LLDB_INVALID_PROCESS_ID;
526
ProcessSP process_sp(GetSP());
527
if (process_sp)
528
ret_val = process_sp->GetID();
529
530
return ret_val;
531
}
532
533
uint32_t SBProcess::GetUniqueID() {
534
LLDB_INSTRUMENT_VA(this);
535
536
uint32_t ret_val = 0;
537
ProcessSP process_sp(GetSP());
538
if (process_sp)
539
ret_val = process_sp->GetUniqueID();
540
return ret_val;
541
}
542
543
ByteOrder SBProcess::GetByteOrder() const {
544
LLDB_INSTRUMENT_VA(this);
545
546
ByteOrder byteOrder = eByteOrderInvalid;
547
ProcessSP process_sp(GetSP());
548
if (process_sp)
549
byteOrder = process_sp->GetTarget().GetArchitecture().GetByteOrder();
550
551
return byteOrder;
552
}
553
554
uint32_t SBProcess::GetAddressByteSize() const {
555
LLDB_INSTRUMENT_VA(this);
556
557
uint32_t size = 0;
558
ProcessSP process_sp(GetSP());
559
if (process_sp)
560
size = process_sp->GetTarget().GetArchitecture().GetAddressByteSize();
561
562
return size;
563
}
564
565
SBError SBProcess::Continue() {
566
LLDB_INSTRUMENT_VA(this);
567
568
SBError sb_error;
569
ProcessSP process_sp(GetSP());
570
571
if (process_sp) {
572
std::lock_guard<std::recursive_mutex> guard(
573
process_sp->GetTarget().GetAPIMutex());
574
575
if (process_sp->GetTarget().GetDebugger().GetAsyncExecution())
576
sb_error.ref() = process_sp->Resume();
577
else
578
sb_error.ref() = process_sp->ResumeSynchronous(nullptr);
579
} else
580
sb_error.SetErrorString("SBProcess is invalid");
581
582
return sb_error;
583
}
584
585
SBError SBProcess::Destroy() {
586
LLDB_INSTRUMENT_VA(this);
587
588
SBError sb_error;
589
ProcessSP process_sp(GetSP());
590
if (process_sp) {
591
std::lock_guard<std::recursive_mutex> guard(
592
process_sp->GetTarget().GetAPIMutex());
593
sb_error.SetError(process_sp->Destroy(false));
594
} else
595
sb_error.SetErrorString("SBProcess is invalid");
596
597
return sb_error;
598
}
599
600
SBError SBProcess::Stop() {
601
LLDB_INSTRUMENT_VA(this);
602
603
SBError sb_error;
604
ProcessSP process_sp(GetSP());
605
if (process_sp) {
606
std::lock_guard<std::recursive_mutex> guard(
607
process_sp->GetTarget().GetAPIMutex());
608
sb_error.SetError(process_sp->Halt());
609
} else
610
sb_error.SetErrorString("SBProcess is invalid");
611
612
return sb_error;
613
}
614
615
SBError SBProcess::Kill() {
616
LLDB_INSTRUMENT_VA(this);
617
618
SBError sb_error;
619
ProcessSP process_sp(GetSP());
620
if (process_sp) {
621
std::lock_guard<std::recursive_mutex> guard(
622
process_sp->GetTarget().GetAPIMutex());
623
sb_error.SetError(process_sp->Destroy(true));
624
} else
625
sb_error.SetErrorString("SBProcess is invalid");
626
627
return sb_error;
628
}
629
630
SBError SBProcess::Detach() {
631
LLDB_INSTRUMENT_VA(this);
632
633
// FIXME: This should come from a process default.
634
bool keep_stopped = false;
635
return Detach(keep_stopped);
636
}
637
638
SBError SBProcess::Detach(bool keep_stopped) {
639
LLDB_INSTRUMENT_VA(this, keep_stopped);
640
641
SBError sb_error;
642
ProcessSP process_sp(GetSP());
643
if (process_sp) {
644
std::lock_guard<std::recursive_mutex> guard(
645
process_sp->GetTarget().GetAPIMutex());
646
sb_error.SetError(process_sp->Detach(keep_stopped));
647
} else
648
sb_error.SetErrorString("SBProcess is invalid");
649
650
return sb_error;
651
}
652
653
SBError SBProcess::Signal(int signo) {
654
LLDB_INSTRUMENT_VA(this, signo);
655
656
SBError sb_error;
657
ProcessSP process_sp(GetSP());
658
if (process_sp) {
659
std::lock_guard<std::recursive_mutex> guard(
660
process_sp->GetTarget().GetAPIMutex());
661
sb_error.SetError(process_sp->Signal(signo));
662
} else
663
sb_error.SetErrorString("SBProcess is invalid");
664
665
return sb_error;
666
}
667
668
SBUnixSignals SBProcess::GetUnixSignals() {
669
LLDB_INSTRUMENT_VA(this);
670
671
if (auto process_sp = GetSP())
672
return SBUnixSignals{process_sp};
673
674
return SBUnixSignals{};
675
}
676
677
void SBProcess::SendAsyncInterrupt() {
678
LLDB_INSTRUMENT_VA(this);
679
680
ProcessSP process_sp(GetSP());
681
if (process_sp) {
682
process_sp->SendAsyncInterrupt();
683
}
684
}
685
686
SBThread SBProcess::GetThreadByID(tid_t tid) {
687
LLDB_INSTRUMENT_VA(this, tid);
688
689
SBThread sb_thread;
690
ThreadSP thread_sp;
691
ProcessSP process_sp(GetSP());
692
if (process_sp) {
693
Process::StopLocker stop_locker;
694
const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
695
std::lock_guard<std::recursive_mutex> guard(
696
process_sp->GetTarget().GetAPIMutex());
697
thread_sp = process_sp->GetThreadList().FindThreadByID(tid, can_update);
698
sb_thread.SetThread(thread_sp);
699
}
700
701
return sb_thread;
702
}
703
704
SBThread SBProcess::GetThreadByIndexID(uint32_t index_id) {
705
LLDB_INSTRUMENT_VA(this, index_id);
706
707
SBThread sb_thread;
708
ThreadSP thread_sp;
709
ProcessSP process_sp(GetSP());
710
if (process_sp) {
711
Process::StopLocker stop_locker;
712
const bool can_update = stop_locker.TryLock(&process_sp->GetRunLock());
713
std::lock_guard<std::recursive_mutex> guard(
714
process_sp->GetTarget().GetAPIMutex());
715
thread_sp =
716
process_sp->GetThreadList().FindThreadByIndexID(index_id, can_update);
717
sb_thread.SetThread(thread_sp);
718
}
719
720
return sb_thread;
721
}
722
723
StateType SBProcess::GetStateFromEvent(const SBEvent &event) {
724
LLDB_INSTRUMENT_VA(event);
725
726
StateType ret_val = Process::ProcessEventData::GetStateFromEvent(event.get());
727
728
return ret_val;
729
}
730
731
bool SBProcess::GetRestartedFromEvent(const SBEvent &event) {
732
LLDB_INSTRUMENT_VA(event);
733
734
bool ret_val = Process::ProcessEventData::GetRestartedFromEvent(event.get());
735
736
return ret_val;
737
}
738
739
size_t SBProcess::GetNumRestartedReasonsFromEvent(const lldb::SBEvent &event) {
740
LLDB_INSTRUMENT_VA(event);
741
742
return Process::ProcessEventData::GetNumRestartedReasons(event.get());
743
}
744
745
const char *
746
SBProcess::GetRestartedReasonAtIndexFromEvent(const lldb::SBEvent &event,
747
size_t idx) {
748
LLDB_INSTRUMENT_VA(event, idx);
749
750
return ConstString(Process::ProcessEventData::GetRestartedReasonAtIndex(
751
event.get(), idx))
752
.GetCString();
753
}
754
755
SBProcess SBProcess::GetProcessFromEvent(const SBEvent &event) {
756
LLDB_INSTRUMENT_VA(event);
757
758
ProcessSP process_sp =
759
Process::ProcessEventData::GetProcessFromEvent(event.get());
760
if (!process_sp) {
761
// StructuredData events also know the process they come from. Try that.
762
process_sp = EventDataStructuredData::GetProcessFromEvent(event.get());
763
}
764
765
return SBProcess(process_sp);
766
}
767
768
bool SBProcess::GetInterruptedFromEvent(const SBEvent &event) {
769
LLDB_INSTRUMENT_VA(event);
770
771
return Process::ProcessEventData::GetInterruptedFromEvent(event.get());
772
}
773
774
lldb::SBStructuredData
775
SBProcess::GetStructuredDataFromEvent(const lldb::SBEvent &event) {
776
LLDB_INSTRUMENT_VA(event);
777
778
return SBStructuredData(event.GetSP());
779
}
780
781
bool SBProcess::EventIsProcessEvent(const SBEvent &event) {
782
LLDB_INSTRUMENT_VA(event);
783
784
return Process::ProcessEventData::GetEventDataFromEvent(event.get()) !=
785
nullptr;
786
}
787
788
bool SBProcess::EventIsStructuredDataEvent(const lldb::SBEvent &event) {
789
LLDB_INSTRUMENT_VA(event);
790
791
EventSP event_sp = event.GetSP();
792
EventData *event_data = event_sp ? event_sp->GetData() : nullptr;
793
return event_data && (event_data->GetFlavor() ==
794
EventDataStructuredData::GetFlavorString());
795
}
796
797
SBBroadcaster SBProcess::GetBroadcaster() const {
798
LLDB_INSTRUMENT_VA(this);
799
800
ProcessSP process_sp(GetSP());
801
802
SBBroadcaster broadcaster(process_sp.get(), false);
803
804
return broadcaster;
805
}
806
807
const char *SBProcess::GetBroadcasterClass() {
808
LLDB_INSTRUMENT();
809
810
return ConstString(Process::GetStaticBroadcasterClass()).AsCString();
811
}
812
813
lldb::SBAddressRangeList SBProcess::FindRangesInMemory(
814
const void *buf, uint64_t size, const SBAddressRangeList &ranges,
815
uint32_t alignment, uint32_t max_matches, SBError &error) {
816
LLDB_INSTRUMENT_VA(this, buf, size, ranges, alignment, max_matches, error);
817
818
lldb::SBAddressRangeList matches;
819
820
ProcessSP process_sp(GetSP());
821
if (!process_sp) {
822
error.SetErrorString("SBProcess is invalid");
823
return matches;
824
}
825
Process::StopLocker stop_locker;
826
if (!stop_locker.TryLock(&process_sp->GetRunLock())) {
827
error.SetErrorString("process is running");
828
return matches;
829
}
830
std::lock_guard<std::recursive_mutex> guard(
831
process_sp->GetTarget().GetAPIMutex());
832
matches.m_opaque_up->ref() = process_sp->FindRangesInMemory(
833
reinterpret_cast<const uint8_t *>(buf), size, ranges.ref().ref(),
834
alignment, max_matches, error.ref());
835
return matches;
836
}
837
838
lldb::addr_t SBProcess::FindInMemory(const void *buf, uint64_t size,
839
const SBAddressRange &range,
840
uint32_t alignment, SBError &error) {
841
LLDB_INSTRUMENT_VA(this, buf, size, range, alignment, error);
842
843
ProcessSP process_sp(GetSP());
844
845
if (!process_sp) {
846
error.SetErrorString("SBProcess is invalid");
847
return LLDB_INVALID_ADDRESS;
848
}
849
850
Process::StopLocker stop_locker;
851
if (!stop_locker.TryLock(&process_sp->GetRunLock())) {
852
error.SetErrorString("process is running");
853
return LLDB_INVALID_ADDRESS;
854
}
855
856
std::lock_guard<std::recursive_mutex> guard(
857
process_sp->GetTarget().GetAPIMutex());
858
return process_sp->FindInMemory(reinterpret_cast<const uint8_t *>(buf), size,
859
range.ref(), alignment, error.ref());
860
}
861
862
size_t SBProcess::ReadMemory(addr_t addr, void *dst, size_t dst_len,
863
SBError &sb_error) {
864
LLDB_INSTRUMENT_VA(this, addr, dst, dst_len, sb_error);
865
866
if (!dst) {
867
sb_error.SetErrorStringWithFormat(
868
"no buffer provided to read %zu bytes into", dst_len);
869
return 0;
870
}
871
872
size_t bytes_read = 0;
873
ProcessSP process_sp(GetSP());
874
875
876
if (process_sp) {
877
Process::StopLocker stop_locker;
878
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
879
std::lock_guard<std::recursive_mutex> guard(
880
process_sp->GetTarget().GetAPIMutex());
881
bytes_read = process_sp->ReadMemory(addr, dst, dst_len, sb_error.ref());
882
} else {
883
sb_error.SetErrorString("process is running");
884
}
885
} else {
886
sb_error.SetErrorString("SBProcess is invalid");
887
}
888
889
return bytes_read;
890
}
891
892
size_t SBProcess::ReadCStringFromMemory(addr_t addr, void *buf, size_t size,
893
lldb::SBError &sb_error) {
894
LLDB_INSTRUMENT_VA(this, addr, buf, size, sb_error);
895
896
size_t bytes_read = 0;
897
ProcessSP process_sp(GetSP());
898
if (process_sp) {
899
Process::StopLocker stop_locker;
900
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
901
std::lock_guard<std::recursive_mutex> guard(
902
process_sp->GetTarget().GetAPIMutex());
903
bytes_read = process_sp->ReadCStringFromMemory(addr, (char *)buf, size,
904
sb_error.ref());
905
} else {
906
sb_error.SetErrorString("process is running");
907
}
908
} else {
909
sb_error.SetErrorString("SBProcess is invalid");
910
}
911
return bytes_read;
912
}
913
914
uint64_t SBProcess::ReadUnsignedFromMemory(addr_t addr, uint32_t byte_size,
915
lldb::SBError &sb_error) {
916
LLDB_INSTRUMENT_VA(this, addr, byte_size, sb_error);
917
918
uint64_t value = 0;
919
ProcessSP process_sp(GetSP());
920
if (process_sp) {
921
Process::StopLocker stop_locker;
922
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
923
std::lock_guard<std::recursive_mutex> guard(
924
process_sp->GetTarget().GetAPIMutex());
925
value = process_sp->ReadUnsignedIntegerFromMemory(addr, byte_size, 0,
926
sb_error.ref());
927
} else {
928
sb_error.SetErrorString("process is running");
929
}
930
} else {
931
sb_error.SetErrorString("SBProcess is invalid");
932
}
933
return value;
934
}
935
936
lldb::addr_t SBProcess::ReadPointerFromMemory(addr_t addr,
937
lldb::SBError &sb_error) {
938
LLDB_INSTRUMENT_VA(this, addr, sb_error);
939
940
lldb::addr_t ptr = LLDB_INVALID_ADDRESS;
941
ProcessSP process_sp(GetSP());
942
if (process_sp) {
943
Process::StopLocker stop_locker;
944
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
945
std::lock_guard<std::recursive_mutex> guard(
946
process_sp->GetTarget().GetAPIMutex());
947
ptr = process_sp->ReadPointerFromMemory(addr, sb_error.ref());
948
} else {
949
sb_error.SetErrorString("process is running");
950
}
951
} else {
952
sb_error.SetErrorString("SBProcess is invalid");
953
}
954
return ptr;
955
}
956
957
size_t SBProcess::WriteMemory(addr_t addr, const void *src, size_t src_len,
958
SBError &sb_error) {
959
LLDB_INSTRUMENT_VA(this, addr, src, src_len, sb_error);
960
961
size_t bytes_written = 0;
962
963
ProcessSP process_sp(GetSP());
964
965
if (process_sp) {
966
Process::StopLocker stop_locker;
967
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
968
std::lock_guard<std::recursive_mutex> guard(
969
process_sp->GetTarget().GetAPIMutex());
970
bytes_written =
971
process_sp->WriteMemory(addr, src, src_len, sb_error.ref());
972
} else {
973
sb_error.SetErrorString("process is running");
974
}
975
}
976
977
return bytes_written;
978
}
979
980
void SBProcess::GetStatus(SBStream &status) {
981
LLDB_INSTRUMENT_VA(this, status);
982
983
ProcessSP process_sp(GetSP());
984
if (process_sp)
985
process_sp->GetStatus(status.ref());
986
}
987
988
bool SBProcess::GetDescription(SBStream &description) {
989
LLDB_INSTRUMENT_VA(this, description);
990
991
Stream &strm = description.ref();
992
993
ProcessSP process_sp(GetSP());
994
if (process_sp) {
995
char path[PATH_MAX];
996
GetTarget().GetExecutable().GetPath(path, sizeof(path));
997
Module *exe_module = process_sp->GetTarget().GetExecutableModulePointer();
998
const char *exe_name = nullptr;
999
if (exe_module)
1000
exe_name = exe_module->GetFileSpec().GetFilename().AsCString();
1001
1002
strm.Printf("SBProcess: pid = %" PRIu64 ", state = %s, threads = %d%s%s",
1003
process_sp->GetID(), lldb_private::StateAsCString(GetState()),
1004
GetNumThreads(), exe_name ? ", executable = " : "",
1005
exe_name ? exe_name : "");
1006
} else
1007
strm.PutCString("No value");
1008
1009
return true;
1010
}
1011
1012
SBStructuredData SBProcess::GetExtendedCrashInformation() {
1013
LLDB_INSTRUMENT_VA(this);
1014
SBStructuredData data;
1015
ProcessSP process_sp(GetSP());
1016
if (!process_sp)
1017
return data;
1018
1019
PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1020
1021
if (!platform_sp)
1022
return data;
1023
1024
auto expected_data =
1025
platform_sp->FetchExtendedCrashInformation(*process_sp.get());
1026
1027
if (!expected_data)
1028
return data;
1029
1030
StructuredData::ObjectSP fetched_data = *expected_data;
1031
data.m_impl_up->SetObjectSP(fetched_data);
1032
return data;
1033
}
1034
1035
uint32_t
1036
SBProcess::GetNumSupportedHardwareWatchpoints(lldb::SBError &sb_error) const {
1037
LLDB_INSTRUMENT_VA(this, sb_error);
1038
1039
uint32_t num = 0;
1040
ProcessSP process_sp(GetSP());
1041
if (process_sp) {
1042
std::lock_guard<std::recursive_mutex> guard(
1043
process_sp->GetTarget().GetAPIMutex());
1044
std::optional<uint32_t> actual_num = process_sp->GetWatchpointSlotCount();
1045
if (actual_num) {
1046
num = *actual_num;
1047
} else {
1048
sb_error.SetErrorString("Unable to determine number of watchpoints");
1049
}
1050
} else {
1051
sb_error.SetErrorString("SBProcess is invalid");
1052
}
1053
return num;
1054
}
1055
1056
uint32_t SBProcess::LoadImage(lldb::SBFileSpec &sb_remote_image_spec,
1057
lldb::SBError &sb_error) {
1058
LLDB_INSTRUMENT_VA(this, sb_remote_image_spec, sb_error);
1059
1060
return LoadImage(SBFileSpec(), sb_remote_image_spec, sb_error);
1061
}
1062
1063
uint32_t SBProcess::LoadImage(const lldb::SBFileSpec &sb_local_image_spec,
1064
const lldb::SBFileSpec &sb_remote_image_spec,
1065
lldb::SBError &sb_error) {
1066
LLDB_INSTRUMENT_VA(this, sb_local_image_spec, sb_remote_image_spec, sb_error);
1067
1068
ProcessSP process_sp(GetSP());
1069
if (process_sp) {
1070
Process::StopLocker stop_locker;
1071
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1072
std::lock_guard<std::recursive_mutex> guard(
1073
process_sp->GetTarget().GetAPIMutex());
1074
PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1075
return platform_sp->LoadImage(process_sp.get(), *sb_local_image_spec,
1076
*sb_remote_image_spec, sb_error.ref());
1077
} else {
1078
sb_error.SetErrorString("process is running");
1079
}
1080
} else {
1081
sb_error.SetErrorString("process is invalid");
1082
}
1083
return LLDB_INVALID_IMAGE_TOKEN;
1084
}
1085
1086
uint32_t SBProcess::LoadImageUsingPaths(const lldb::SBFileSpec &image_spec,
1087
SBStringList &paths,
1088
lldb::SBFileSpec &loaded_path,
1089
lldb::SBError &error) {
1090
LLDB_INSTRUMENT_VA(this, image_spec, paths, loaded_path, error);
1091
1092
ProcessSP process_sp(GetSP());
1093
if (process_sp) {
1094
Process::StopLocker stop_locker;
1095
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1096
std::lock_guard<std::recursive_mutex> guard(
1097
process_sp->GetTarget().GetAPIMutex());
1098
PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1099
size_t num_paths = paths.GetSize();
1100
std::vector<std::string> paths_vec;
1101
paths_vec.reserve(num_paths);
1102
for (size_t i = 0; i < num_paths; i++)
1103
paths_vec.push_back(paths.GetStringAtIndex(i));
1104
FileSpec loaded_spec;
1105
1106
uint32_t token = platform_sp->LoadImageUsingPaths(
1107
process_sp.get(), *image_spec, paths_vec, error.ref(), &loaded_spec);
1108
if (token != LLDB_INVALID_IMAGE_TOKEN)
1109
loaded_path = loaded_spec;
1110
return token;
1111
} else {
1112
error.SetErrorString("process is running");
1113
}
1114
} else {
1115
error.SetErrorString("process is invalid");
1116
}
1117
1118
return LLDB_INVALID_IMAGE_TOKEN;
1119
}
1120
1121
lldb::SBError SBProcess::UnloadImage(uint32_t image_token) {
1122
LLDB_INSTRUMENT_VA(this, image_token);
1123
1124
lldb::SBError sb_error;
1125
ProcessSP process_sp(GetSP());
1126
if (process_sp) {
1127
Process::StopLocker stop_locker;
1128
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1129
std::lock_guard<std::recursive_mutex> guard(
1130
process_sp->GetTarget().GetAPIMutex());
1131
PlatformSP platform_sp = process_sp->GetTarget().GetPlatform();
1132
sb_error.SetError(
1133
platform_sp->UnloadImage(process_sp.get(), image_token));
1134
} else {
1135
sb_error.SetErrorString("process is running");
1136
}
1137
} else
1138
sb_error.SetErrorString("invalid process");
1139
return sb_error;
1140
}
1141
1142
lldb::SBError SBProcess::SendEventData(const char *event_data) {
1143
LLDB_INSTRUMENT_VA(this, event_data);
1144
1145
lldb::SBError sb_error;
1146
ProcessSP process_sp(GetSP());
1147
if (process_sp) {
1148
Process::StopLocker stop_locker;
1149
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1150
std::lock_guard<std::recursive_mutex> guard(
1151
process_sp->GetTarget().GetAPIMutex());
1152
sb_error.SetError(process_sp->SendEventData(event_data));
1153
} else {
1154
sb_error.SetErrorString("process is running");
1155
}
1156
} else
1157
sb_error.SetErrorString("invalid process");
1158
return sb_error;
1159
}
1160
1161
uint32_t SBProcess::GetNumExtendedBacktraceTypes() {
1162
LLDB_INSTRUMENT_VA(this);
1163
1164
ProcessSP process_sp(GetSP());
1165
if (process_sp && process_sp->GetSystemRuntime()) {
1166
SystemRuntime *runtime = process_sp->GetSystemRuntime();
1167
return runtime->GetExtendedBacktraceTypes().size();
1168
}
1169
return 0;
1170
}
1171
1172
const char *SBProcess::GetExtendedBacktraceTypeAtIndex(uint32_t idx) {
1173
LLDB_INSTRUMENT_VA(this, idx);
1174
1175
ProcessSP process_sp(GetSP());
1176
if (process_sp && process_sp->GetSystemRuntime()) {
1177
SystemRuntime *runtime = process_sp->GetSystemRuntime();
1178
const std::vector<ConstString> &names =
1179
runtime->GetExtendedBacktraceTypes();
1180
if (idx < names.size()) {
1181
return names[idx].AsCString();
1182
}
1183
}
1184
return nullptr;
1185
}
1186
1187
SBThreadCollection SBProcess::GetHistoryThreads(addr_t addr) {
1188
LLDB_INSTRUMENT_VA(this, addr);
1189
1190
ProcessSP process_sp(GetSP());
1191
SBThreadCollection threads;
1192
if (process_sp) {
1193
threads = SBThreadCollection(process_sp->GetHistoryThreads(addr));
1194
}
1195
return threads;
1196
}
1197
1198
bool SBProcess::IsInstrumentationRuntimePresent(
1199
InstrumentationRuntimeType type) {
1200
LLDB_INSTRUMENT_VA(this, type);
1201
1202
ProcessSP process_sp(GetSP());
1203
if (!process_sp)
1204
return false;
1205
1206
std::lock_guard<std::recursive_mutex> guard(
1207
process_sp->GetTarget().GetAPIMutex());
1208
1209
InstrumentationRuntimeSP runtime_sp =
1210
process_sp->GetInstrumentationRuntime(type);
1211
1212
if (!runtime_sp.get())
1213
return false;
1214
1215
return runtime_sp->IsActive();
1216
}
1217
1218
lldb::SBError SBProcess::SaveCore(const char *file_name) {
1219
LLDB_INSTRUMENT_VA(this, file_name);
1220
SBSaveCoreOptions options;
1221
options.SetOutputFile(SBFileSpec(file_name));
1222
options.SetStyle(SaveCoreStyle::eSaveCoreFull);
1223
return SaveCore(options);
1224
}
1225
1226
lldb::SBError SBProcess::SaveCore(const char *file_name,
1227
const char *flavor,
1228
SaveCoreStyle core_style) {
1229
LLDB_INSTRUMENT_VA(this, file_name, flavor, core_style);
1230
SBSaveCoreOptions options;
1231
options.SetOutputFile(SBFileSpec(file_name));
1232
options.SetStyle(core_style);
1233
SBError error = options.SetPluginName(flavor);
1234
if (error.Fail())
1235
return error;
1236
return SaveCore(options);
1237
}
1238
1239
lldb::SBError SBProcess::SaveCore(SBSaveCoreOptions &options) {
1240
1241
LLDB_INSTRUMENT_VA(this, options);
1242
1243
lldb::SBError error;
1244
ProcessSP process_sp(GetSP());
1245
if (!process_sp) {
1246
error.SetErrorString("SBProcess is invalid");
1247
return error;
1248
}
1249
1250
std::lock_guard<std::recursive_mutex> guard(
1251
process_sp->GetTarget().GetAPIMutex());
1252
1253
if (process_sp->GetState() != eStateStopped) {
1254
error.SetErrorString("the process is not stopped");
1255
return error;
1256
}
1257
1258
error.ref() = PluginManager::SaveCore(process_sp, options.ref());
1259
1260
return error;
1261
}
1262
1263
lldb::SBError
1264
SBProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
1265
SBMemoryRegionInfo &sb_region_info) {
1266
LLDB_INSTRUMENT_VA(this, load_addr, sb_region_info);
1267
1268
lldb::SBError sb_error;
1269
ProcessSP process_sp(GetSP());
1270
if (process_sp) {
1271
Process::StopLocker stop_locker;
1272
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1273
std::lock_guard<std::recursive_mutex> guard(
1274
process_sp->GetTarget().GetAPIMutex());
1275
1276
sb_error.ref() =
1277
process_sp->GetMemoryRegionInfo(load_addr, sb_region_info.ref());
1278
} else {
1279
sb_error.SetErrorString("process is running");
1280
}
1281
} else {
1282
sb_error.SetErrorString("SBProcess is invalid");
1283
}
1284
return sb_error;
1285
}
1286
1287
lldb::SBMemoryRegionInfoList SBProcess::GetMemoryRegions() {
1288
LLDB_INSTRUMENT_VA(this);
1289
1290
lldb::SBMemoryRegionInfoList sb_region_list;
1291
1292
ProcessSP process_sp(GetSP());
1293
Process::StopLocker stop_locker;
1294
if (process_sp && stop_locker.TryLock(&process_sp->GetRunLock())) {
1295
std::lock_guard<std::recursive_mutex> guard(
1296
process_sp->GetTarget().GetAPIMutex());
1297
1298
process_sp->GetMemoryRegions(sb_region_list.ref());
1299
}
1300
1301
return sb_region_list;
1302
}
1303
1304
lldb::SBProcessInfo SBProcess::GetProcessInfo() {
1305
LLDB_INSTRUMENT_VA(this);
1306
1307
lldb::SBProcessInfo sb_proc_info;
1308
ProcessSP process_sp(GetSP());
1309
ProcessInstanceInfo proc_info;
1310
if (process_sp && process_sp->GetProcessInfo(proc_info)) {
1311
sb_proc_info.SetProcessInfo(proc_info);
1312
}
1313
return sb_proc_info;
1314
}
1315
1316
lldb::SBFileSpec SBProcess::GetCoreFile() {
1317
LLDB_INSTRUMENT_VA(this);
1318
1319
ProcessSP process_sp(GetSP());
1320
FileSpec core_file;
1321
if (process_sp) {
1322
core_file = process_sp->GetCoreFile();
1323
}
1324
return SBFileSpec(core_file);
1325
}
1326
1327
addr_t SBProcess::GetAddressMask(AddressMaskType type,
1328
AddressMaskRange addr_range) {
1329
LLDB_INSTRUMENT_VA(this, type, addr_range);
1330
1331
if (ProcessSP process_sp = GetSP()) {
1332
switch (type) {
1333
case eAddressMaskTypeCode:
1334
if (addr_range == eAddressMaskRangeHigh)
1335
return process_sp->GetHighmemCodeAddressMask();
1336
else
1337
return process_sp->GetCodeAddressMask();
1338
case eAddressMaskTypeData:
1339
if (addr_range == eAddressMaskRangeHigh)
1340
return process_sp->GetHighmemDataAddressMask();
1341
else
1342
return process_sp->GetDataAddressMask();
1343
case eAddressMaskTypeAny:
1344
if (addr_range == eAddressMaskRangeHigh)
1345
return process_sp->GetHighmemDataAddressMask();
1346
else
1347
return process_sp->GetDataAddressMask();
1348
}
1349
}
1350
return LLDB_INVALID_ADDRESS_MASK;
1351
}
1352
1353
void SBProcess::SetAddressMask(AddressMaskType type, addr_t mask,
1354
AddressMaskRange addr_range) {
1355
LLDB_INSTRUMENT_VA(this, type, mask, addr_range);
1356
1357
if (ProcessSP process_sp = GetSP()) {
1358
switch (type) {
1359
case eAddressMaskTypeCode:
1360
if (addr_range == eAddressMaskRangeAll) {
1361
process_sp->SetCodeAddressMask(mask);
1362
process_sp->SetHighmemCodeAddressMask(mask);
1363
} else if (addr_range == eAddressMaskRangeHigh) {
1364
process_sp->SetHighmemCodeAddressMask(mask);
1365
} else {
1366
process_sp->SetCodeAddressMask(mask);
1367
}
1368
break;
1369
case eAddressMaskTypeData:
1370
if (addr_range == eAddressMaskRangeAll) {
1371
process_sp->SetDataAddressMask(mask);
1372
process_sp->SetHighmemDataAddressMask(mask);
1373
} else if (addr_range == eAddressMaskRangeHigh) {
1374
process_sp->SetHighmemDataAddressMask(mask);
1375
} else {
1376
process_sp->SetDataAddressMask(mask);
1377
}
1378
break;
1379
case eAddressMaskTypeAll:
1380
if (addr_range == eAddressMaskRangeAll) {
1381
process_sp->SetCodeAddressMask(mask);
1382
process_sp->SetDataAddressMask(mask);
1383
process_sp->SetHighmemCodeAddressMask(mask);
1384
process_sp->SetHighmemDataAddressMask(mask);
1385
} else if (addr_range == eAddressMaskRangeHigh) {
1386
process_sp->SetHighmemCodeAddressMask(mask);
1387
process_sp->SetHighmemDataAddressMask(mask);
1388
} else {
1389
process_sp->SetCodeAddressMask(mask);
1390
process_sp->SetDataAddressMask(mask);
1391
}
1392
break;
1393
}
1394
}
1395
}
1396
1397
void SBProcess::SetAddressableBits(AddressMaskType type, uint32_t num_bits,
1398
AddressMaskRange addr_range) {
1399
LLDB_INSTRUMENT_VA(this, type, num_bits, addr_range);
1400
1401
SetAddressMask(type, AddressableBits::AddressableBitToMask(num_bits),
1402
addr_range);
1403
}
1404
1405
addr_t SBProcess::FixAddress(addr_t addr, AddressMaskType type) {
1406
LLDB_INSTRUMENT_VA(this, addr, type);
1407
1408
if (ProcessSP process_sp = GetSP()) {
1409
if (type == eAddressMaskTypeAny)
1410
return process_sp->FixAnyAddress(addr);
1411
else if (type == eAddressMaskTypeData)
1412
return process_sp->FixDataAddress(addr);
1413
else if (type == eAddressMaskTypeCode)
1414
return process_sp->FixCodeAddress(addr);
1415
}
1416
return addr;
1417
}
1418
1419
lldb::addr_t SBProcess::AllocateMemory(size_t size, uint32_t permissions,
1420
lldb::SBError &sb_error) {
1421
LLDB_INSTRUMENT_VA(this, size, permissions, sb_error);
1422
1423
lldb::addr_t addr = LLDB_INVALID_ADDRESS;
1424
ProcessSP process_sp(GetSP());
1425
if (process_sp) {
1426
Process::StopLocker stop_locker;
1427
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1428
std::lock_guard<std::recursive_mutex> guard(
1429
process_sp->GetTarget().GetAPIMutex());
1430
addr = process_sp->AllocateMemory(size, permissions, sb_error.ref());
1431
} else {
1432
sb_error.SetErrorString("process is running");
1433
}
1434
} else {
1435
sb_error.SetErrorString("SBProcess is invalid");
1436
}
1437
return addr;
1438
}
1439
1440
lldb::SBError SBProcess::DeallocateMemory(lldb::addr_t ptr) {
1441
LLDB_INSTRUMENT_VA(this, ptr);
1442
1443
lldb::SBError sb_error;
1444
ProcessSP process_sp(GetSP());
1445
if (process_sp) {
1446
Process::StopLocker stop_locker;
1447
if (stop_locker.TryLock(&process_sp->GetRunLock())) {
1448
std::lock_guard<std::recursive_mutex> guard(
1449
process_sp->GetTarget().GetAPIMutex());
1450
Status error = process_sp->DeallocateMemory(ptr);
1451
sb_error.SetError(error);
1452
} else {
1453
sb_error.SetErrorString("process is running");
1454
}
1455
} else {
1456
sb_error.SetErrorString("SBProcess is invalid");
1457
}
1458
return sb_error;
1459
}
1460
1461
lldb::SBScriptObject SBProcess::GetScriptedImplementation() {
1462
LLDB_INSTRUMENT_VA(this);
1463
ProcessSP process_sp(GetSP());
1464
return lldb::SBScriptObject((process_sp) ? process_sp->GetImplementation()
1465
: nullptr,
1466
eScriptLanguageDefault);
1467
}
1468
1469