1 //===-- SBTarget.cpp --------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/API/SBTarget.h"
11 
12 #include "lldb/lldb-public.h"
13 
14 #include "lldb/API/SBBreakpoint.h"
15 #include "lldb/API/SBDebugger.h"
16 #include "lldb/API/SBEvent.h"
17 #include "lldb/API/SBExpressionOptions.h"
18 #include "lldb/API/SBFileSpec.h"
19 #include "lldb/API/SBListener.h"
20 #include "lldb/API/SBModule.h"
21 #include "lldb/API/SBModuleSpec.h"
22 #include "lldb/API/SBProcess.h"
23 #include "lldb/API/SBSourceManager.h"
24 #include "lldb/API/SBStream.h"
25 #include "lldb/API/SBStringList.h"
26 #include "lldb/API/SBStructuredData.h"
27 #include "lldb/API/SBSymbolContextList.h"
28 #include "lldb/Breakpoint/BreakpointID.h"
29 #include "lldb/Breakpoint/BreakpointIDList.h"
30 #include "lldb/Breakpoint/BreakpointList.h"
31 #include "lldb/Breakpoint/BreakpointLocation.h"
32 #include "lldb/Core/Address.h"
33 #include "lldb/Core/AddressResolver.h"
34 #include "lldb/Core/AddressResolverName.h"
35 #include "lldb/Core/Debugger.h"
36 #include "lldb/Core/Disassembler.h"
37 #include "lldb/Core/Module.h"
38 #include "lldb/Core/ModuleSpec.h"
39 #include "lldb/Core/STLUtils.h"
40 #include "lldb/Core/SearchFilter.h"
41 #include "lldb/Core/Section.h"
42 #include "lldb/Core/StructuredDataImpl.h"
43 #include "lldb/Core/ValueObjectConstResult.h"
44 #include "lldb/Core/ValueObjectList.h"
45 #include "lldb/Core/ValueObjectVariable.h"
46 #include "lldb/Host/Host.h"
47 #include "lldb/Symbol/ClangASTContext.h"
48 #include "lldb/Symbol/DeclVendor.h"
49 #include "lldb/Symbol/ObjectFile.h"
50 #include "lldb/Symbol/SymbolFile.h"
51 #include "lldb/Symbol/SymbolVendor.h"
52 #include "lldb/Symbol/VariableList.h"
53 #include "lldb/Target/ABI.h"
54 #include "lldb/Target/Language.h"
55 #include "lldb/Target/LanguageRuntime.h"
56 #include "lldb/Target/ObjCLanguageRuntime.h"
57 #include "lldb/Target/Process.h"
58 #include "lldb/Target/StackFrame.h"
59 #include "lldb/Target/Target.h"
60 #include "lldb/Target/TargetList.h"
61 #include "lldb/Utility/ArchSpec.h"
62 #include "lldb/Utility/Args.h"
63 #include "lldb/Utility/FileSpec.h"
64 #include "lldb/Utility/Log.h"
65 #include "lldb/Utility/RegularExpression.h"
66 
67 #include "Commands/CommandObjectBreakpoint.h"
68 #include "lldb/Interpreter/CommandReturnObject.h"
69 #include "llvm/Support/PrettyStackTrace.h"
70 #include "llvm/Support/Regex.h"
71 
72 using namespace lldb;
73 using namespace lldb_private;
74 
75 #define DEFAULT_DISASM_BYTE_SIZE 32
76 
77 namespace {
78 
79 Status AttachToProcess(ProcessAttachInfo &attach_info, Target &target) {
80   std::lock_guard<std::recursive_mutex> guard(target.GetAPIMutex());
81 
82   auto process_sp = target.GetProcessSP();
83   if (process_sp) {
84     const auto state = process_sp->GetState();
85     if (process_sp->IsAlive() && state == eStateConnected) {
86       // If we are already connected, then we have already specified the
87       // listener, so if a valid listener is supplied, we need to error out to
88       // let the client know.
89       if (attach_info.GetListener())
90         return Status("process is connected and already has a listener, pass "
91                       "empty listener");
92     }
93   }
94 
95   return target.Attach(attach_info, nullptr);
96 }
97 
98 } // namespace
99 
100 //----------------------------------------------------------------------
101 // SBTarget constructor
102 //----------------------------------------------------------------------
103 SBTarget::SBTarget() : m_opaque_sp() {}
104 
105 SBTarget::SBTarget(const SBTarget &rhs) : m_opaque_sp(rhs.m_opaque_sp) {}
106 
107 SBTarget::SBTarget(const TargetSP &target_sp) : m_opaque_sp(target_sp) {}
108 
109 const SBTarget &SBTarget::operator=(const SBTarget &rhs) {
110   if (this != &rhs)
111     m_opaque_sp = rhs.m_opaque_sp;
112   return *this;
113 }
114 
115 //----------------------------------------------------------------------
116 // Destructor
117 //----------------------------------------------------------------------
118 SBTarget::~SBTarget() {}
119 
120 bool SBTarget::EventIsTargetEvent(const SBEvent &event) {
121   return Target::TargetEventData::GetEventDataFromEvent(event.get()) != NULL;
122 }
123 
124 SBTarget SBTarget::GetTargetFromEvent(const SBEvent &event) {
125   return Target::TargetEventData::GetTargetFromEvent(event.get());
126 }
127 
128 uint32_t SBTarget::GetNumModulesFromEvent(const SBEvent &event) {
129   const ModuleList module_list =
130       Target::TargetEventData::GetModuleListFromEvent(event.get());
131   return module_list.GetSize();
132 }
133 
134 SBModule SBTarget::GetModuleAtIndexFromEvent(const uint32_t idx,
135                                              const SBEvent &event) {
136   const ModuleList module_list =
137       Target::TargetEventData::GetModuleListFromEvent(event.get());
138   return SBModule(module_list.GetModuleAtIndex(idx));
139 }
140 
141 const char *SBTarget::GetBroadcasterClassName() {
142   return Target::GetStaticBroadcasterClass().AsCString();
143 }
144 
145 bool SBTarget::IsValid() const {
146   return m_opaque_sp.get() != NULL && m_opaque_sp->IsValid();
147 }
148 
149 SBProcess SBTarget::GetProcess() {
150   SBProcess sb_process;
151   ProcessSP process_sp;
152   TargetSP target_sp(GetSP());
153   if (target_sp) {
154     process_sp = target_sp->GetProcessSP();
155     sb_process.SetSP(process_sp);
156   }
157 
158   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
159   if (log)
160     log->Printf("SBTarget(%p)::GetProcess () => SBProcess(%p)",
161                 static_cast<void *>(target_sp.get()),
162                 static_cast<void *>(process_sp.get()));
163 
164   return sb_process;
165 }
166 
167 SBPlatform SBTarget::GetPlatform() {
168   TargetSP target_sp(GetSP());
169   if (!target_sp)
170     return SBPlatform();
171 
172   SBPlatform platform;
173   platform.m_opaque_sp = target_sp->GetPlatform();
174 
175   return platform;
176 }
177 
178 SBDebugger SBTarget::GetDebugger() const {
179   SBDebugger debugger;
180   TargetSP target_sp(GetSP());
181   if (target_sp)
182     debugger.reset(target_sp->GetDebugger().shared_from_this());
183   return debugger;
184 }
185 
186 SBStructuredData SBTarget::GetStatistics() {
187   SBStructuredData data;
188   TargetSP target_sp(GetSP());
189   if (!target_sp)
190     return data;
191 
192   auto stats_up = llvm::make_unique<StructuredData::Dictionary>();
193   int i = 0;
194   for (auto &Entry : target_sp->GetStatistics()) {
195     std::string Desc = lldb_private::GetStatDescription(
196         static_cast<lldb_private::StatisticKind>(i));
197     stats_up->AddIntegerItem(Desc, Entry);
198     i += 1;
199   }
200 
201   data.m_impl_up->SetObjectSP(std::move(stats_up));
202   return data;
203 }
204 
205 SBProcess SBTarget::LoadCore(const char *core_file) {
206   lldb::SBError error; // Ignored
207   return LoadCore(core_file, error);
208 }
209 
210 SBProcess SBTarget::LoadCore(const char *core_file, lldb::SBError &error) {
211   SBProcess sb_process;
212   TargetSP target_sp(GetSP());
213   if (target_sp) {
214     FileSpec filespec(core_file, true);
215     ProcessSP process_sp(target_sp->CreateProcess(
216         target_sp->GetDebugger().GetListener(), "", &filespec));
217     if (process_sp) {
218       error.SetError(process_sp->LoadCore());
219       if (error.Success())
220         sb_process.SetSP(process_sp);
221     } else {
222       error.SetErrorString("Failed to create the process");
223     }
224   } else {
225     error.SetErrorString("SBTarget is invalid");
226   }
227   return sb_process;
228 }
229 
230 SBProcess SBTarget::LaunchSimple(char const **argv, char const **envp,
231                                  const char *working_directory) {
232   char *stdin_path = NULL;
233   char *stdout_path = NULL;
234   char *stderr_path = NULL;
235   uint32_t launch_flags = 0;
236   bool stop_at_entry = false;
237   SBError error;
238   SBListener listener = GetDebugger().GetListener();
239   return Launch(listener, argv, envp, stdin_path, stdout_path, stderr_path,
240                 working_directory, launch_flags, stop_at_entry, error);
241 }
242 
243 SBError SBTarget::Install() {
244   SBError sb_error;
245   TargetSP target_sp(GetSP());
246   if (target_sp) {
247     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
248     sb_error.ref() = target_sp->Install(NULL);
249   }
250   return sb_error;
251 }
252 
253 SBProcess SBTarget::Launch(SBListener &listener, char const **argv,
254                            char const **envp, const char *stdin_path,
255                            const char *stdout_path, const char *stderr_path,
256                            const char *working_directory,
257                            uint32_t launch_flags, // See LaunchFlags
258                            bool stop_at_entry, lldb::SBError &error) {
259   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
260 
261   SBProcess sb_process;
262   ProcessSP process_sp;
263   TargetSP target_sp(GetSP());
264 
265   if (log)
266     log->Printf("SBTarget(%p)::Launch (argv=%p, envp=%p, stdin=%s, stdout=%s, "
267                 "stderr=%s, working-dir=%s, launch_flags=0x%x, "
268                 "stop_at_entry=%i, &error (%p))...",
269                 static_cast<void *>(target_sp.get()), static_cast<void *>(argv),
270                 static_cast<void *>(envp), stdin_path ? stdin_path : "NULL",
271                 stdout_path ? stdout_path : "NULL",
272                 stderr_path ? stderr_path : "NULL",
273                 working_directory ? working_directory : "NULL", launch_flags,
274                 stop_at_entry, static_cast<void *>(error.get()));
275 
276   if (target_sp) {
277     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
278 
279     if (stop_at_entry)
280       launch_flags |= eLaunchFlagStopAtEntry;
281 
282     if (getenv("LLDB_LAUNCH_FLAG_DISABLE_ASLR"))
283       launch_flags |= eLaunchFlagDisableASLR;
284 
285     StateType state = eStateInvalid;
286     process_sp = target_sp->GetProcessSP();
287     if (process_sp) {
288       state = process_sp->GetState();
289 
290       if (process_sp->IsAlive() && state != eStateConnected) {
291         if (state == eStateAttaching)
292           error.SetErrorString("process attach is in progress");
293         else
294           error.SetErrorString("a process is already being debugged");
295         return sb_process;
296       }
297     }
298 
299     if (state == eStateConnected) {
300       // If we are already connected, then we have already specified the
301       // listener, so if a valid listener is supplied, we need to error out to
302       // let the client know.
303       if (listener.IsValid()) {
304         error.SetErrorString("process is connected and already has a listener, "
305                              "pass empty listener");
306         return sb_process;
307       }
308     }
309 
310     if (getenv("LLDB_LAUNCH_FLAG_DISABLE_STDIO"))
311       launch_flags |= eLaunchFlagDisableSTDIO;
312 
313     ProcessLaunchInfo launch_info(
314         FileSpec{stdin_path, false}, FileSpec{stdout_path, false},
315         FileSpec{stderr_path, false}, FileSpec{working_directory, false},
316         launch_flags);
317 
318     Module *exe_module = target_sp->GetExecutableModulePointer();
319     if (exe_module)
320       launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
321     if (argv)
322       launch_info.GetArguments().AppendArguments(argv);
323     if (envp)
324       launch_info.GetEnvironment() = Environment(envp);
325 
326     if (listener.IsValid())
327       launch_info.SetListener(listener.GetSP());
328 
329     error.SetError(target_sp->Launch(launch_info, NULL));
330 
331     sb_process.SetSP(target_sp->GetProcessSP());
332   } else {
333     error.SetErrorString("SBTarget is invalid");
334   }
335 
336   log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API);
337   if (log)
338     log->Printf("SBTarget(%p)::Launch (...) => SBProcess(%p), SBError(%s)",
339                 static_cast<void *>(target_sp.get()),
340                 static_cast<void *>(sb_process.GetSP().get()),
341                 error.GetCString());
342 
343   return sb_process;
344 }
345 
346 SBProcess SBTarget::Launch(SBLaunchInfo &sb_launch_info, SBError &error) {
347   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
348 
349   SBProcess sb_process;
350   TargetSP target_sp(GetSP());
351 
352   if (log)
353     log->Printf("SBTarget(%p)::Launch (launch_info, error)...",
354                 static_cast<void *>(target_sp.get()));
355 
356   if (target_sp) {
357     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
358     StateType state = eStateInvalid;
359     {
360       ProcessSP process_sp = target_sp->GetProcessSP();
361       if (process_sp) {
362         state = process_sp->GetState();
363 
364         if (process_sp->IsAlive() && state != eStateConnected) {
365           if (state == eStateAttaching)
366             error.SetErrorString("process attach is in progress");
367           else
368             error.SetErrorString("a process is already being debugged");
369           return sb_process;
370         }
371       }
372     }
373 
374     lldb_private::ProcessLaunchInfo launch_info = sb_launch_info.ref();
375 
376     if (!launch_info.GetExecutableFile()) {
377       Module *exe_module = target_sp->GetExecutableModulePointer();
378       if (exe_module)
379         launch_info.SetExecutableFile(exe_module->GetPlatformFileSpec(), true);
380     }
381 
382     const ArchSpec &arch_spec = target_sp->GetArchitecture();
383     if (arch_spec.IsValid())
384       launch_info.GetArchitecture() = arch_spec;
385 
386     error.SetError(target_sp->Launch(launch_info, NULL));
387     sb_launch_info.set_ref(launch_info);
388     sb_process.SetSP(target_sp->GetProcessSP());
389   } else {
390     error.SetErrorString("SBTarget is invalid");
391   }
392 
393   log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API);
394   if (log)
395     log->Printf("SBTarget(%p)::Launch (...) => SBProcess(%p)",
396                 static_cast<void *>(target_sp.get()),
397                 static_cast<void *>(sb_process.GetSP().get()));
398 
399   return sb_process;
400 }
401 
402 lldb::SBProcess SBTarget::Attach(SBAttachInfo &sb_attach_info, SBError &error) {
403   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
404 
405   SBProcess sb_process;
406   TargetSP target_sp(GetSP());
407 
408   if (log)
409     log->Printf("SBTarget(%p)::Attach (sb_attach_info, error)...",
410                 static_cast<void *>(target_sp.get()));
411 
412   if (target_sp) {
413     ProcessAttachInfo &attach_info = sb_attach_info.ref();
414     if (attach_info.ProcessIDIsValid() && !attach_info.UserIDIsValid()) {
415       PlatformSP platform_sp = target_sp->GetPlatform();
416       // See if we can pre-verify if a process exists or not
417       if (platform_sp && platform_sp->IsConnected()) {
418         lldb::pid_t attach_pid = attach_info.GetProcessID();
419         ProcessInstanceInfo instance_info;
420         if (platform_sp->GetProcessInfo(attach_pid, instance_info)) {
421           attach_info.SetUserID(instance_info.GetEffectiveUserID());
422         } else {
423           error.ref().SetErrorStringWithFormat(
424               "no process found with process ID %" PRIu64, attach_pid);
425           if (log) {
426             log->Printf("SBTarget(%p)::Attach (...) => error %s",
427                         static_cast<void *>(target_sp.get()),
428                         error.GetCString());
429           }
430           return sb_process;
431         }
432       }
433     }
434     error.SetError(AttachToProcess(attach_info, *target_sp));
435     if (error.Success())
436       sb_process.SetSP(target_sp->GetProcessSP());
437   } else {
438     error.SetErrorString("SBTarget is invalid");
439   }
440 
441   if (log)
442     log->Printf("SBTarget(%p)::Attach (...) => SBProcess(%p)",
443                 static_cast<void *>(target_sp.get()),
444                 static_cast<void *>(sb_process.GetSP().get()));
445 
446   return sb_process;
447 }
448 
449 lldb::SBProcess SBTarget::AttachToProcessWithID(
450     SBListener &listener,
451     lldb::pid_t pid, // The process ID to attach to
452     SBError &error   // An error explaining what went wrong if attach fails
453     ) {
454   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
455 
456   SBProcess sb_process;
457   TargetSP target_sp(GetSP());
458 
459   if (log)
460     log->Printf("SBTarget(%p)::%s (listener, pid=%" PRId64 ", error)...",
461                 static_cast<void *>(target_sp.get()), __FUNCTION__, pid);
462 
463   if (target_sp) {
464     ProcessAttachInfo attach_info;
465     attach_info.SetProcessID(pid);
466     if (listener.IsValid())
467       attach_info.SetListener(listener.GetSP());
468 
469     ProcessInstanceInfo instance_info;
470     if (target_sp->GetPlatform()->GetProcessInfo(pid, instance_info))
471       attach_info.SetUserID(instance_info.GetEffectiveUserID());
472 
473     error.SetError(AttachToProcess(attach_info, *target_sp));
474     if (error.Success())
475       sb_process.SetSP(target_sp->GetProcessSP());
476   } else
477     error.SetErrorString("SBTarget is invalid");
478 
479   if (log)
480     log->Printf("SBTarget(%p)::%s (...) => SBProcess(%p)",
481                 static_cast<void *>(target_sp.get()), __FUNCTION__,
482                 static_cast<void *>(sb_process.GetSP().get()));
483   return sb_process;
484 }
485 
486 lldb::SBProcess SBTarget::AttachToProcessWithName(
487     SBListener &listener,
488     const char *name, // basename of process to attach to
489     bool wait_for, // if true wait for a new instance of "name" to be launched
490     SBError &error // An error explaining what went wrong if attach fails
491     ) {
492   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
493 
494   SBProcess sb_process;
495   TargetSP target_sp(GetSP());
496 
497   if (log)
498     log->Printf("SBTarget(%p)::%s (listener, name=%s, wait_for=%s, error)...",
499                 static_cast<void *>(target_sp.get()), __FUNCTION__, name,
500                 wait_for ? "true" : "false");
501 
502   if (name && target_sp) {
503     ProcessAttachInfo attach_info;
504     attach_info.GetExecutableFile().SetFile(name, false,
505                                             FileSpec::Style::native);
506     attach_info.SetWaitForLaunch(wait_for);
507     if (listener.IsValid())
508       attach_info.SetListener(listener.GetSP());
509 
510     error.SetError(AttachToProcess(attach_info, *target_sp));
511     if (error.Success())
512       sb_process.SetSP(target_sp->GetProcessSP());
513   } else
514     error.SetErrorString("SBTarget is invalid");
515 
516   if (log)
517     log->Printf("SBTarget(%p)::%s (...) => SBProcess(%p)",
518                 static_cast<void *>(target_sp.get()), __FUNCTION__,
519                 static_cast<void *>(sb_process.GetSP().get()));
520   return sb_process;
521 }
522 
523 lldb::SBProcess SBTarget::ConnectRemote(SBListener &listener, const char *url,
524                                         const char *plugin_name,
525                                         SBError &error) {
526   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
527 
528   SBProcess sb_process;
529   ProcessSP process_sp;
530   TargetSP target_sp(GetSP());
531 
532   if (log)
533     log->Printf("SBTarget(%p)::ConnectRemote (listener, url=%s, "
534                 "plugin_name=%s, error)...",
535                 static_cast<void *>(target_sp.get()), url, plugin_name);
536 
537   if (target_sp) {
538     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
539     if (listener.IsValid())
540       process_sp =
541           target_sp->CreateProcess(listener.m_opaque_sp, plugin_name, NULL);
542     else
543       process_sp = target_sp->CreateProcess(
544           target_sp->GetDebugger().GetListener(), plugin_name, NULL);
545 
546     if (process_sp) {
547       sb_process.SetSP(process_sp);
548       error.SetError(process_sp->ConnectRemote(NULL, url));
549     } else {
550       error.SetErrorString("unable to create lldb_private::Process");
551     }
552   } else {
553     error.SetErrorString("SBTarget is invalid");
554   }
555 
556   if (log)
557     log->Printf("SBTarget(%p)::ConnectRemote (...) => SBProcess(%p)",
558                 static_cast<void *>(target_sp.get()),
559                 static_cast<void *>(process_sp.get()));
560   return sb_process;
561 }
562 
563 SBFileSpec SBTarget::GetExecutable() {
564 
565   SBFileSpec exe_file_spec;
566   TargetSP target_sp(GetSP());
567   if (target_sp) {
568     Module *exe_module = target_sp->GetExecutableModulePointer();
569     if (exe_module)
570       exe_file_spec.SetFileSpec(exe_module->GetFileSpec());
571   }
572 
573   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
574   if (log) {
575     log->Printf("SBTarget(%p)::GetExecutable () => SBFileSpec(%p)",
576                 static_cast<void *>(target_sp.get()),
577                 static_cast<const void *>(exe_file_spec.get()));
578   }
579 
580   return exe_file_spec;
581 }
582 
583 bool SBTarget::operator==(const SBTarget &rhs) const {
584   return m_opaque_sp.get() == rhs.m_opaque_sp.get();
585 }
586 
587 bool SBTarget::operator!=(const SBTarget &rhs) const {
588   return m_opaque_sp.get() != rhs.m_opaque_sp.get();
589 }
590 
591 lldb::TargetSP SBTarget::GetSP() const { return m_opaque_sp; }
592 
593 void SBTarget::SetSP(const lldb::TargetSP &target_sp) {
594   m_opaque_sp = target_sp;
595 }
596 
597 lldb::SBAddress SBTarget::ResolveLoadAddress(lldb::addr_t vm_addr) {
598   lldb::SBAddress sb_addr;
599   Address &addr = sb_addr.ref();
600   TargetSP target_sp(GetSP());
601   if (target_sp) {
602     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
603     if (target_sp->ResolveLoadAddress(vm_addr, addr))
604       return sb_addr;
605   }
606 
607   // We have a load address that isn't in a section, just return an address
608   // with the offset filled in (the address) and the section set to NULL
609   addr.SetRawAddress(vm_addr);
610   return sb_addr;
611 }
612 
613 lldb::SBAddress SBTarget::ResolveFileAddress(lldb::addr_t file_addr) {
614   lldb::SBAddress sb_addr;
615   Address &addr = sb_addr.ref();
616   TargetSP target_sp(GetSP());
617   if (target_sp) {
618     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
619     if (target_sp->ResolveFileAddress(file_addr, addr))
620       return sb_addr;
621   }
622 
623   addr.SetRawAddress(file_addr);
624   return sb_addr;
625 }
626 
627 lldb::SBAddress SBTarget::ResolvePastLoadAddress(uint32_t stop_id,
628                                                  lldb::addr_t vm_addr) {
629   lldb::SBAddress sb_addr;
630   Address &addr = sb_addr.ref();
631   TargetSP target_sp(GetSP());
632   if (target_sp) {
633     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
634     if (target_sp->ResolveLoadAddress(vm_addr, addr))
635       return sb_addr;
636   }
637 
638   // We have a load address that isn't in a section, just return an address
639   // with the offset filled in (the address) and the section set to NULL
640   addr.SetRawAddress(vm_addr);
641   return sb_addr;
642 }
643 
644 SBSymbolContext
645 SBTarget::ResolveSymbolContextForAddress(const SBAddress &addr,
646                                          uint32_t resolve_scope) {
647   SBSymbolContext sc;
648   if (addr.IsValid()) {
649     TargetSP target_sp(GetSP());
650     if (target_sp)
651       target_sp->GetImages().ResolveSymbolContextForAddress(
652           addr.ref(), resolve_scope, sc.ref());
653   }
654   return sc;
655 }
656 
657 size_t SBTarget::ReadMemory(const SBAddress addr, void *buf, size_t size,
658                             lldb::SBError &error) {
659   SBError sb_error;
660   size_t bytes_read = 0;
661   TargetSP target_sp(GetSP());
662   if (target_sp) {
663     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
664     bytes_read =
665         target_sp->ReadMemory(addr.ref(), false, buf, size, sb_error.ref());
666   } else {
667     sb_error.SetErrorString("invalid target");
668   }
669 
670   return bytes_read;
671 }
672 
673 SBBreakpoint SBTarget::BreakpointCreateByLocation(const char *file,
674                                                   uint32_t line) {
675   return SBBreakpoint(
676       BreakpointCreateByLocation(SBFileSpec(file, false), line));
677 }
678 
679 SBBreakpoint
680 SBTarget::BreakpointCreateByLocation(const SBFileSpec &sb_file_spec,
681                                      uint32_t line) {
682   return BreakpointCreateByLocation(sb_file_spec, line, 0);
683 }
684 
685 SBBreakpoint
686 SBTarget::BreakpointCreateByLocation(const SBFileSpec &sb_file_spec,
687                                      uint32_t line, lldb::addr_t offset) {
688   SBFileSpecList empty_list;
689   return BreakpointCreateByLocation(sb_file_spec, line, offset, empty_list);
690 }
691 
692 SBBreakpoint
693 SBTarget::BreakpointCreateByLocation(const SBFileSpec &sb_file_spec,
694                                      uint32_t line, lldb::addr_t offset,
695                                      SBFileSpecList &sb_module_list) {
696   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
697 
698   SBBreakpoint sb_bp;
699   TargetSP target_sp(GetSP());
700   if (target_sp && line != 0) {
701     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
702 
703     const LazyBool check_inlines = eLazyBoolCalculate;
704     const LazyBool skip_prologue = eLazyBoolCalculate;
705     const bool internal = false;
706     const bool hardware = false;
707     const LazyBool move_to_nearest_code = eLazyBoolCalculate;
708     const FileSpecList *module_list = nullptr;
709     if (sb_module_list.GetSize() > 0) {
710       module_list = sb_module_list.get();
711     }
712     sb_bp = target_sp->CreateBreakpoint(
713         module_list, *sb_file_spec, line, offset, check_inlines, skip_prologue,
714         internal, hardware, move_to_nearest_code);
715   }
716 
717   if (log) {
718     SBStream sstr;
719     sb_bp.GetDescription(sstr);
720     char path[PATH_MAX];
721     sb_file_spec->GetPath(path, sizeof(path));
722     log->Printf("SBTarget(%p)::BreakpointCreateByLocation ( %s:%u ) => "
723                 "SBBreakpoint(%p): %s",
724                 static_cast<void *>(target_sp.get()), path, line,
725                 static_cast<void *>(sb_bp.GetSP().get()), sstr.GetData());
726   }
727 
728   return sb_bp;
729 }
730 
731 SBBreakpoint SBTarget::BreakpointCreateByName(const char *symbol_name,
732                                               const char *module_name) {
733   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
734 
735   SBBreakpoint sb_bp;
736   TargetSP target_sp(GetSP());
737   if (target_sp.get()) {
738     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
739 
740     const bool internal = false;
741     const bool hardware = false;
742     const LazyBool skip_prologue = eLazyBoolCalculate;
743     const lldb::addr_t offset = 0;
744     if (module_name && module_name[0]) {
745       FileSpecList module_spec_list;
746       module_spec_list.Append(FileSpec(module_name, false));
747       sb_bp = target_sp->CreateBreakpoint(
748           &module_spec_list, NULL, symbol_name, eFunctionNameTypeAuto,
749           eLanguageTypeUnknown, offset, skip_prologue, internal, hardware);
750     } else {
751       sb_bp = target_sp->CreateBreakpoint(
752           NULL, NULL, symbol_name, eFunctionNameTypeAuto, eLanguageTypeUnknown,
753           offset, skip_prologue, internal, hardware);
754     }
755   }
756 
757   if (log)
758     log->Printf("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", "
759                 "module=\"%s\") => SBBreakpoint(%p)",
760                 static_cast<void *>(target_sp.get()), symbol_name, module_name,
761                 static_cast<void *>(sb_bp.GetSP().get()));
762 
763   return sb_bp;
764 }
765 
766 lldb::SBBreakpoint
767 SBTarget::BreakpointCreateByName(const char *symbol_name,
768                                  const SBFileSpecList &module_list,
769                                  const SBFileSpecList &comp_unit_list) {
770   uint32_t name_type_mask = eFunctionNameTypeAuto;
771   return BreakpointCreateByName(symbol_name, name_type_mask,
772                                 eLanguageTypeUnknown, module_list,
773                                 comp_unit_list);
774 }
775 
776 lldb::SBBreakpoint SBTarget::BreakpointCreateByName(
777     const char *symbol_name, uint32_t name_type_mask,
778     const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) {
779   return BreakpointCreateByName(symbol_name, name_type_mask,
780                                 eLanguageTypeUnknown, module_list,
781                                 comp_unit_list);
782 }
783 
784 lldb::SBBreakpoint SBTarget::BreakpointCreateByName(
785     const char *symbol_name, uint32_t name_type_mask,
786     LanguageType symbol_language, const SBFileSpecList &module_list,
787     const SBFileSpecList &comp_unit_list) {
788   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
789 
790   SBBreakpoint sb_bp;
791   TargetSP target_sp(GetSP());
792   if (target_sp && symbol_name && symbol_name[0]) {
793     const bool internal = false;
794     const bool hardware = false;
795     const LazyBool skip_prologue = eLazyBoolCalculate;
796     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
797     sb_bp = target_sp->CreateBreakpoint(
798         module_list.get(), comp_unit_list.get(), symbol_name, name_type_mask,
799         symbol_language, 0, skip_prologue, internal, hardware);
800   }
801 
802   if (log)
803     log->Printf("SBTarget(%p)::BreakpointCreateByName (symbol=\"%s\", "
804                 "name_type: %d) => SBBreakpoint(%p)",
805                 static_cast<void *>(target_sp.get()), symbol_name,
806                 name_type_mask, static_cast<void *>(sb_bp.GetSP().get()));
807 
808   return sb_bp;
809 }
810 
811 lldb::SBBreakpoint SBTarget::BreakpointCreateByNames(
812     const char *symbol_names[], uint32_t num_names, uint32_t name_type_mask,
813     const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) {
814   return BreakpointCreateByNames(symbol_names, num_names, name_type_mask,
815                                  eLanguageTypeUnknown, module_list,
816                                  comp_unit_list);
817 }
818 
819 lldb::SBBreakpoint SBTarget::BreakpointCreateByNames(
820     const char *symbol_names[], uint32_t num_names, uint32_t name_type_mask,
821     LanguageType symbol_language, const SBFileSpecList &module_list,
822     const SBFileSpecList &comp_unit_list) {
823   return BreakpointCreateByNames(symbol_names, num_names, name_type_mask,
824                                  eLanguageTypeUnknown, 0, module_list,
825                                  comp_unit_list);
826 }
827 
828 lldb::SBBreakpoint SBTarget::BreakpointCreateByNames(
829     const char *symbol_names[], uint32_t num_names, uint32_t name_type_mask,
830     LanguageType symbol_language, lldb::addr_t offset,
831     const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) {
832   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
833 
834   SBBreakpoint sb_bp;
835   TargetSP target_sp(GetSP());
836   if (target_sp && num_names > 0) {
837     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
838     const bool internal = false;
839     const bool hardware = false;
840     const LazyBool skip_prologue = eLazyBoolCalculate;
841     sb_bp = target_sp->CreateBreakpoint(
842         module_list.get(), comp_unit_list.get(), symbol_names, num_names,
843         name_type_mask, symbol_language, offset, skip_prologue, internal,
844         hardware);
845   }
846 
847   if (log) {
848     log->Printf("SBTarget(%p)::BreakpointCreateByName (symbols={",
849                 static_cast<void *>(target_sp.get()));
850     for (uint32_t i = 0; i < num_names; i++) {
851       char sep;
852       if (i < num_names - 1)
853         sep = ',';
854       else
855         sep = '}';
856       if (symbol_names[i] != NULL)
857         log->Printf("\"%s\"%c ", symbol_names[i], sep);
858       else
859         log->Printf("\"<NULL>\"%c ", sep);
860     }
861     log->Printf("name_type: %d) => SBBreakpoint(%p)", name_type_mask,
862                 static_cast<void *>(sb_bp.GetSP().get()));
863   }
864 
865   return sb_bp;
866 }
867 
868 SBBreakpoint SBTarget::BreakpointCreateByRegex(const char *symbol_name_regex,
869                                                const char *module_name) {
870   SBFileSpecList module_spec_list;
871   SBFileSpecList comp_unit_list;
872   if (module_name && module_name[0]) {
873     module_spec_list.Append(FileSpec(module_name, false));
874   }
875   return BreakpointCreateByRegex(symbol_name_regex, eLanguageTypeUnknown,
876                                  module_spec_list, comp_unit_list);
877 }
878 
879 lldb::SBBreakpoint
880 SBTarget::BreakpointCreateByRegex(const char *symbol_name_regex,
881                                   const SBFileSpecList &module_list,
882                                   const SBFileSpecList &comp_unit_list) {
883   return BreakpointCreateByRegex(symbol_name_regex, eLanguageTypeUnknown,
884                                  module_list, comp_unit_list);
885 }
886 
887 lldb::SBBreakpoint SBTarget::BreakpointCreateByRegex(
888     const char *symbol_name_regex, LanguageType symbol_language,
889     const SBFileSpecList &module_list, const SBFileSpecList &comp_unit_list) {
890   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
891 
892   SBBreakpoint sb_bp;
893   TargetSP target_sp(GetSP());
894   if (target_sp && symbol_name_regex && symbol_name_regex[0]) {
895     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
896     RegularExpression regexp((llvm::StringRef(symbol_name_regex)));
897     const bool internal = false;
898     const bool hardware = false;
899     const LazyBool skip_prologue = eLazyBoolCalculate;
900 
901     sb_bp = target_sp->CreateFuncRegexBreakpoint(
902         module_list.get(), comp_unit_list.get(), regexp, symbol_language,
903         skip_prologue, internal, hardware);
904   }
905 
906   if (log)
907     log->Printf("SBTarget(%p)::BreakpointCreateByRegex (symbol_regex=\"%s\") "
908                 "=> SBBreakpoint(%p)",
909                 static_cast<void *>(target_sp.get()), symbol_name_regex,
910                 static_cast<void *>(sb_bp.GetSP().get()));
911 
912   return sb_bp;
913 }
914 
915 SBBreakpoint SBTarget::BreakpointCreateByAddress(addr_t address) {
916   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
917 
918   SBBreakpoint sb_bp;
919   TargetSP target_sp(GetSP());
920   if (target_sp) {
921     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
922     const bool hardware = false;
923     sb_bp = target_sp->CreateBreakpoint(address, false, hardware);
924   }
925 
926   if (log)
927     log->Printf("SBTarget(%p)::BreakpointCreateByAddress (address=%" PRIu64
928                 ") => SBBreakpoint(%p)",
929                 static_cast<void *>(target_sp.get()),
930                 static_cast<uint64_t>(address),
931                 static_cast<void *>(sb_bp.GetSP().get()));
932 
933   return sb_bp;
934 }
935 
936 SBBreakpoint SBTarget::BreakpointCreateBySBAddress(SBAddress &sb_address) {
937   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
938 
939   SBBreakpoint sb_bp;
940   TargetSP target_sp(GetSP());
941   if (!sb_address.IsValid()) {
942     if (log)
943       log->Printf("SBTarget(%p)::BreakpointCreateBySBAddress called with "
944                   "invalid address",
945                   static_cast<void *>(target_sp.get()));
946     return sb_bp;
947   }
948 
949   if (target_sp) {
950     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
951     const bool hardware = false;
952     sb_bp = target_sp->CreateBreakpoint(sb_address.ref(), false, hardware);
953   }
954 
955   if (log) {
956     SBStream s;
957     sb_address.GetDescription(s);
958     log->Printf("SBTarget(%p)::BreakpointCreateBySBAddress (address=%s) => "
959                 "SBBreakpoint(%p)",
960                 static_cast<void *>(target_sp.get()), s.GetData(),
961                 static_cast<void *>(sb_bp.GetSP().get()));
962   }
963 
964   return sb_bp;
965 }
966 
967 lldb::SBBreakpoint
968 SBTarget::BreakpointCreateBySourceRegex(const char *source_regex,
969                                         const lldb::SBFileSpec &source_file,
970                                         const char *module_name) {
971   SBFileSpecList module_spec_list;
972 
973   if (module_name && module_name[0]) {
974     module_spec_list.Append(FileSpec(module_name, false));
975   }
976 
977   SBFileSpecList source_file_list;
978   if (source_file.IsValid()) {
979     source_file_list.Append(source_file);
980   }
981 
982   return BreakpointCreateBySourceRegex(source_regex, module_spec_list,
983                                        source_file_list);
984 }
985 
986 lldb::SBBreakpoint SBTarget::BreakpointCreateBySourceRegex(
987     const char *source_regex, const SBFileSpecList &module_list,
988     const lldb::SBFileSpecList &source_file_list) {
989   return BreakpointCreateBySourceRegex(source_regex, module_list,
990                                        source_file_list, SBStringList());
991 }
992 
993 lldb::SBBreakpoint SBTarget::BreakpointCreateBySourceRegex(
994     const char *source_regex, const SBFileSpecList &module_list,
995     const lldb::SBFileSpecList &source_file_list,
996     const SBStringList &func_names) {
997   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
998 
999   SBBreakpoint sb_bp;
1000   TargetSP target_sp(GetSP());
1001   if (target_sp && source_regex && source_regex[0]) {
1002     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1003     const bool hardware = false;
1004     const LazyBool move_to_nearest_code = eLazyBoolCalculate;
1005     RegularExpression regexp((llvm::StringRef(source_regex)));
1006     std::unordered_set<std::string> func_names_set;
1007     for (size_t i = 0; i < func_names.GetSize(); i++) {
1008       func_names_set.insert(func_names.GetStringAtIndex(i));
1009     }
1010 
1011     sb_bp = target_sp->CreateSourceRegexBreakpoint(
1012         module_list.get(), source_file_list.get(), func_names_set, regexp,
1013         false, hardware, move_to_nearest_code);
1014   }
1015 
1016   if (log)
1017     log->Printf("SBTarget(%p)::BreakpointCreateByRegex (source_regex=\"%s\") "
1018                 "=> SBBreakpoint(%p)",
1019                 static_cast<void *>(target_sp.get()), source_regex,
1020                 static_cast<void *>(sb_bp.GetSP().get()));
1021 
1022   return sb_bp;
1023 }
1024 
1025 lldb::SBBreakpoint
1026 SBTarget::BreakpointCreateForException(lldb::LanguageType language,
1027                                        bool catch_bp, bool throw_bp) {
1028   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1029 
1030   SBBreakpoint sb_bp;
1031   TargetSP target_sp(GetSP());
1032   if (target_sp) {
1033     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1034     const bool hardware = false;
1035     sb_bp = target_sp->CreateExceptionBreakpoint(language, catch_bp, throw_bp,
1036                                                   hardware);
1037   }
1038 
1039   if (log)
1040     log->Printf("SBTarget(%p)::BreakpointCreateByRegex (Language: %s, catch: "
1041                 "%s throw: %s) => SBBreakpoint(%p)",
1042                 static_cast<void *>(target_sp.get()),
1043                 Language::GetNameForLanguageType(language),
1044                 catch_bp ? "on" : "off", throw_bp ? "on" : "off",
1045                 static_cast<void *>(sb_bp.GetSP().get()));
1046 
1047   return sb_bp;
1048 }
1049 
1050 uint32_t SBTarget::GetNumBreakpoints() const {
1051   TargetSP target_sp(GetSP());
1052   if (target_sp) {
1053     // The breakpoint list is thread safe, no need to lock
1054     return target_sp->GetBreakpointList().GetSize();
1055   }
1056   return 0;
1057 }
1058 
1059 SBBreakpoint SBTarget::GetBreakpointAtIndex(uint32_t idx) const {
1060   SBBreakpoint sb_breakpoint;
1061   TargetSP target_sp(GetSP());
1062   if (target_sp) {
1063     // The breakpoint list is thread safe, no need to lock
1064     sb_breakpoint = target_sp->GetBreakpointList().GetBreakpointAtIndex(idx);
1065   }
1066   return sb_breakpoint;
1067 }
1068 
1069 bool SBTarget::BreakpointDelete(break_id_t bp_id) {
1070   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1071 
1072   bool result = false;
1073   TargetSP target_sp(GetSP());
1074   if (target_sp) {
1075     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1076     result = target_sp->RemoveBreakpointByID(bp_id);
1077   }
1078 
1079   if (log)
1080     log->Printf("SBTarget(%p)::BreakpointDelete (bp_id=%d) => %i",
1081                 static_cast<void *>(target_sp.get()),
1082                 static_cast<uint32_t>(bp_id), result);
1083 
1084   return result;
1085 }
1086 
1087 SBBreakpoint SBTarget::FindBreakpointByID(break_id_t bp_id) {
1088   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1089 
1090   SBBreakpoint sb_breakpoint;
1091   TargetSP target_sp(GetSP());
1092   if (target_sp && bp_id != LLDB_INVALID_BREAK_ID) {
1093     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1094     sb_breakpoint = target_sp->GetBreakpointByID(bp_id);
1095   }
1096 
1097   if (log)
1098     log->Printf(
1099         "SBTarget(%p)::FindBreakpointByID (bp_id=%d) => SBBreakpoint(%p)",
1100         static_cast<void *>(target_sp.get()), static_cast<uint32_t>(bp_id),
1101         static_cast<void *>(sb_breakpoint.GetSP().get()));
1102 
1103   return sb_breakpoint;
1104 }
1105 
1106 bool SBTarget::FindBreakpointsByName(const char *name,
1107                                      SBBreakpointList &bkpts) {
1108   TargetSP target_sp(GetSP());
1109   if (target_sp) {
1110     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1111     BreakpointList bkpt_list(false);
1112     bool is_valid =
1113         target_sp->GetBreakpointList().FindBreakpointsByName(name, bkpt_list);
1114     if (!is_valid)
1115       return false;
1116     for (BreakpointSP bkpt_sp : bkpt_list.Breakpoints()) {
1117       bkpts.AppendByID(bkpt_sp->GetID());
1118     }
1119   }
1120   return true;
1121 }
1122 
1123 void SBTarget::GetBreakpointNames(SBStringList &names)
1124 {
1125   names.Clear();
1126 
1127   TargetSP target_sp(GetSP());
1128   if (target_sp) {
1129     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1130 
1131     std::vector<std::string> name_vec;
1132     target_sp->GetBreakpointNames(name_vec);
1133     for (auto name : name_vec)
1134       names.AppendString(name.c_str());
1135   }
1136 }
1137 
1138 void SBTarget::DeleteBreakpointName(const char *name)
1139 {
1140   TargetSP target_sp(GetSP());
1141   if (target_sp) {
1142     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1143     target_sp->DeleteBreakpointName(ConstString(name));
1144   }
1145 }
1146 
1147 bool SBTarget::EnableAllBreakpoints() {
1148   TargetSP target_sp(GetSP());
1149   if (target_sp) {
1150     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1151     target_sp->EnableAllowedBreakpoints();
1152     return true;
1153   }
1154   return false;
1155 }
1156 
1157 bool SBTarget::DisableAllBreakpoints() {
1158   TargetSP target_sp(GetSP());
1159   if (target_sp) {
1160     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1161     target_sp->DisableAllowedBreakpoints();
1162     return true;
1163   }
1164   return false;
1165 }
1166 
1167 bool SBTarget::DeleteAllBreakpoints() {
1168   TargetSP target_sp(GetSP());
1169   if (target_sp) {
1170     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1171     target_sp->RemoveAllowedBreakpoints();
1172     return true;
1173   }
1174   return false;
1175 }
1176 
1177 lldb::SBError SBTarget::BreakpointsCreateFromFile(SBFileSpec &source_file,
1178                                                   SBBreakpointList &new_bps) {
1179   SBStringList empty_name_list;
1180   return BreakpointsCreateFromFile(source_file, empty_name_list, new_bps);
1181 }
1182 
1183 lldb::SBError SBTarget::BreakpointsCreateFromFile(SBFileSpec &source_file,
1184                                                   SBStringList &matching_names,
1185                                                   SBBreakpointList &new_bps) {
1186   SBError sberr;
1187   TargetSP target_sp(GetSP());
1188   if (!target_sp) {
1189     sberr.SetErrorString(
1190         "BreakpointCreateFromFile called with invalid target.");
1191     return sberr;
1192   }
1193   std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1194 
1195   BreakpointIDList bp_ids;
1196 
1197   std::vector<std::string> name_vector;
1198   size_t num_names = matching_names.GetSize();
1199   for (size_t i = 0; i < num_names; i++)
1200     name_vector.push_back(matching_names.GetStringAtIndex(i));
1201 
1202   sberr.ref() = target_sp->CreateBreakpointsFromFile(source_file.ref(),
1203                                                      name_vector, bp_ids);
1204   if (sberr.Fail())
1205     return sberr;
1206 
1207   size_t num_bkpts = bp_ids.GetSize();
1208   for (size_t i = 0; i < num_bkpts; i++) {
1209     BreakpointID bp_id = bp_ids.GetBreakpointIDAtIndex(i);
1210     new_bps.AppendByID(bp_id.GetBreakpointID());
1211   }
1212   return sberr;
1213 }
1214 
1215 lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file) {
1216   SBError sberr;
1217   TargetSP target_sp(GetSP());
1218   if (!target_sp) {
1219     sberr.SetErrorString("BreakpointWriteToFile called with invalid target.");
1220     return sberr;
1221   }
1222   SBBreakpointList bkpt_list(*this);
1223   return BreakpointsWriteToFile(dest_file, bkpt_list);
1224 }
1225 
1226 lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file,
1227                                                SBBreakpointList &bkpt_list,
1228                                                bool append) {
1229   SBError sberr;
1230   TargetSP target_sp(GetSP());
1231   if (!target_sp) {
1232     sberr.SetErrorString("BreakpointWriteToFile called with invalid target.");
1233     return sberr;
1234   }
1235 
1236   std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1237   BreakpointIDList bp_id_list;
1238   bkpt_list.CopyToBreakpointIDList(bp_id_list);
1239   sberr.ref() = target_sp->SerializeBreakpointsToFile(dest_file.ref(),
1240                                                       bp_id_list, append);
1241   return sberr;
1242 }
1243 
1244 uint32_t SBTarget::GetNumWatchpoints() const {
1245   TargetSP target_sp(GetSP());
1246   if (target_sp) {
1247     // The watchpoint list is thread safe, no need to lock
1248     return target_sp->GetWatchpointList().GetSize();
1249   }
1250   return 0;
1251 }
1252 
1253 SBWatchpoint SBTarget::GetWatchpointAtIndex(uint32_t idx) const {
1254   SBWatchpoint sb_watchpoint;
1255   TargetSP target_sp(GetSP());
1256   if (target_sp) {
1257     // The watchpoint list is thread safe, no need to lock
1258     sb_watchpoint.SetSP(target_sp->GetWatchpointList().GetByIndex(idx));
1259   }
1260   return sb_watchpoint;
1261 }
1262 
1263 bool SBTarget::DeleteWatchpoint(watch_id_t wp_id) {
1264   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1265 
1266   bool result = false;
1267   TargetSP target_sp(GetSP());
1268   if (target_sp) {
1269     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1270     std::unique_lock<std::recursive_mutex> lock;
1271     target_sp->GetWatchpointList().GetListMutex(lock);
1272     result = target_sp->RemoveWatchpointByID(wp_id);
1273   }
1274 
1275   if (log)
1276     log->Printf("SBTarget(%p)::WatchpointDelete (wp_id=%d) => %i",
1277                 static_cast<void *>(target_sp.get()),
1278                 static_cast<uint32_t>(wp_id), result);
1279 
1280   return result;
1281 }
1282 
1283 SBWatchpoint SBTarget::FindWatchpointByID(lldb::watch_id_t wp_id) {
1284   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1285 
1286   SBWatchpoint sb_watchpoint;
1287   lldb::WatchpointSP watchpoint_sp;
1288   TargetSP target_sp(GetSP());
1289   if (target_sp && wp_id != LLDB_INVALID_WATCH_ID) {
1290     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1291     std::unique_lock<std::recursive_mutex> lock;
1292     target_sp->GetWatchpointList().GetListMutex(lock);
1293     watchpoint_sp = target_sp->GetWatchpointList().FindByID(wp_id);
1294     sb_watchpoint.SetSP(watchpoint_sp);
1295   }
1296 
1297   if (log)
1298     log->Printf(
1299         "SBTarget(%p)::FindWatchpointByID (bp_id=%d) => SBWatchpoint(%p)",
1300         static_cast<void *>(target_sp.get()), static_cast<uint32_t>(wp_id),
1301         static_cast<void *>(watchpoint_sp.get()));
1302 
1303   return sb_watchpoint;
1304 }
1305 
1306 lldb::SBWatchpoint SBTarget::WatchAddress(lldb::addr_t addr, size_t size,
1307                                           bool read, bool write,
1308                                           SBError &error) {
1309   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1310 
1311   SBWatchpoint sb_watchpoint;
1312   lldb::WatchpointSP watchpoint_sp;
1313   TargetSP target_sp(GetSP());
1314   if (target_sp && (read || write) && addr != LLDB_INVALID_ADDRESS &&
1315       size > 0) {
1316     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1317     uint32_t watch_type = 0;
1318     if (read)
1319       watch_type |= LLDB_WATCH_TYPE_READ;
1320     if (write)
1321       watch_type |= LLDB_WATCH_TYPE_WRITE;
1322     if (watch_type == 0) {
1323       error.SetErrorString(
1324           "Can't create a watchpoint that is neither read nor write.");
1325       return sb_watchpoint;
1326     }
1327 
1328     // Target::CreateWatchpoint() is thread safe.
1329     Status cw_error;
1330     // This API doesn't take in a type, so we can't figure out what it is.
1331     CompilerType *type = NULL;
1332     watchpoint_sp =
1333         target_sp->CreateWatchpoint(addr, size, type, watch_type, cw_error);
1334     error.SetError(cw_error);
1335     sb_watchpoint.SetSP(watchpoint_sp);
1336   }
1337 
1338   if (log)
1339     log->Printf("SBTarget(%p)::WatchAddress (addr=0x%" PRIx64
1340                 ", 0x%u) => SBWatchpoint(%p)",
1341                 static_cast<void *>(target_sp.get()), addr,
1342                 static_cast<uint32_t>(size),
1343                 static_cast<void *>(watchpoint_sp.get()));
1344 
1345   return sb_watchpoint;
1346 }
1347 
1348 bool SBTarget::EnableAllWatchpoints() {
1349   TargetSP target_sp(GetSP());
1350   if (target_sp) {
1351     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1352     std::unique_lock<std::recursive_mutex> lock;
1353     target_sp->GetWatchpointList().GetListMutex(lock);
1354     target_sp->EnableAllWatchpoints();
1355     return true;
1356   }
1357   return false;
1358 }
1359 
1360 bool SBTarget::DisableAllWatchpoints() {
1361   TargetSP target_sp(GetSP());
1362   if (target_sp) {
1363     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1364     std::unique_lock<std::recursive_mutex> lock;
1365     target_sp->GetWatchpointList().GetListMutex(lock);
1366     target_sp->DisableAllWatchpoints();
1367     return true;
1368   }
1369   return false;
1370 }
1371 
1372 SBValue SBTarget::CreateValueFromAddress(const char *name, SBAddress addr,
1373                                          SBType type) {
1374   SBValue sb_value;
1375   lldb::ValueObjectSP new_value_sp;
1376   if (IsValid() && name && *name && addr.IsValid() && type.IsValid()) {
1377     lldb::addr_t load_addr(addr.GetLoadAddress(*this));
1378     ExecutionContext exe_ctx(
1379         ExecutionContextRef(ExecutionContext(m_opaque_sp.get(), false)));
1380     CompilerType ast_type(type.GetSP()->GetCompilerType(true));
1381     new_value_sp = ValueObject::CreateValueObjectFromAddress(name, load_addr,
1382                                                              exe_ctx, ast_type);
1383   }
1384   sb_value.SetSP(new_value_sp);
1385   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1386   if (log) {
1387     if (new_value_sp)
1388       log->Printf("SBTarget(%p)::CreateValueFromAddress => \"%s\"",
1389                   static_cast<void *>(m_opaque_sp.get()),
1390                   new_value_sp->GetName().AsCString());
1391     else
1392       log->Printf("SBTarget(%p)::CreateValueFromAddress => NULL",
1393                   static_cast<void *>(m_opaque_sp.get()));
1394   }
1395   return sb_value;
1396 }
1397 
1398 lldb::SBValue SBTarget::CreateValueFromData(const char *name, lldb::SBData data,
1399                                             lldb::SBType type) {
1400   SBValue sb_value;
1401   lldb::ValueObjectSP new_value_sp;
1402   if (IsValid() && name && *name && data.IsValid() && type.IsValid()) {
1403     DataExtractorSP extractor(*data);
1404     ExecutionContext exe_ctx(
1405         ExecutionContextRef(ExecutionContext(m_opaque_sp.get(), false)));
1406     CompilerType ast_type(type.GetSP()->GetCompilerType(true));
1407     new_value_sp = ValueObject::CreateValueObjectFromData(name, *extractor,
1408                                                           exe_ctx, ast_type);
1409   }
1410   sb_value.SetSP(new_value_sp);
1411   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1412   if (log) {
1413     if (new_value_sp)
1414       log->Printf("SBTarget(%p)::CreateValueFromData => \"%s\"",
1415                   static_cast<void *>(m_opaque_sp.get()),
1416                   new_value_sp->GetName().AsCString());
1417     else
1418       log->Printf("SBTarget(%p)::CreateValueFromData => NULL",
1419                   static_cast<void *>(m_opaque_sp.get()));
1420   }
1421   return sb_value;
1422 }
1423 
1424 lldb::SBValue SBTarget::CreateValueFromExpression(const char *name,
1425                                                   const char *expr) {
1426   SBValue sb_value;
1427   lldb::ValueObjectSP new_value_sp;
1428   if (IsValid() && name && *name && expr && *expr) {
1429     ExecutionContext exe_ctx(
1430         ExecutionContextRef(ExecutionContext(m_opaque_sp.get(), false)));
1431     new_value_sp =
1432         ValueObject::CreateValueObjectFromExpression(name, expr, exe_ctx);
1433   }
1434   sb_value.SetSP(new_value_sp);
1435   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1436   if (log) {
1437     if (new_value_sp)
1438       log->Printf("SBTarget(%p)::CreateValueFromExpression => \"%s\"",
1439                   static_cast<void *>(m_opaque_sp.get()),
1440                   new_value_sp->GetName().AsCString());
1441     else
1442       log->Printf("SBTarget(%p)::CreateValueFromExpression => NULL",
1443                   static_cast<void *>(m_opaque_sp.get()));
1444   }
1445   return sb_value;
1446 }
1447 
1448 bool SBTarget::DeleteAllWatchpoints() {
1449   TargetSP target_sp(GetSP());
1450   if (target_sp) {
1451     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
1452     std::unique_lock<std::recursive_mutex> lock;
1453     target_sp->GetWatchpointList().GetListMutex(lock);
1454     target_sp->RemoveAllWatchpoints();
1455     return true;
1456   }
1457   return false;
1458 }
1459 
1460 lldb::SBModule SBTarget::AddModule(const char *path, const char *triple,
1461                                    const char *uuid_cstr) {
1462   return AddModule(path, triple, uuid_cstr, NULL);
1463 }
1464 
1465 lldb::SBModule SBTarget::AddModule(const char *path, const char *triple,
1466                                    const char *uuid_cstr, const char *symfile) {
1467   lldb::SBModule sb_module;
1468   TargetSP target_sp(GetSP());
1469   if (target_sp) {
1470     ModuleSpec module_spec;
1471     if (path)
1472       module_spec.GetFileSpec().SetFile(path, false, FileSpec::Style::native);
1473 
1474     if (uuid_cstr)
1475       module_spec.GetUUID().SetFromStringRef(uuid_cstr);
1476 
1477     if (triple)
1478       module_spec.GetArchitecture() = Platform::GetAugmentedArchSpec(
1479           target_sp->GetPlatform().get(), triple);
1480     else
1481       module_spec.GetArchitecture() = target_sp->GetArchitecture();
1482 
1483     if (symfile)
1484       module_spec.GetSymbolFileSpec().SetFile(symfile, false,
1485                                               FileSpec::Style::native);
1486 
1487     sb_module.SetSP(target_sp->GetSharedModule(module_spec));
1488   }
1489   return sb_module;
1490 }
1491 
1492 lldb::SBModule SBTarget::AddModule(const SBModuleSpec &module_spec) {
1493   lldb::SBModule sb_module;
1494   TargetSP target_sp(GetSP());
1495   if (target_sp)
1496     sb_module.SetSP(target_sp->GetSharedModule(*module_spec.m_opaque_ap));
1497   return sb_module;
1498 }
1499 
1500 bool SBTarget::AddModule(lldb::SBModule &module) {
1501   TargetSP target_sp(GetSP());
1502   if (target_sp) {
1503     target_sp->GetImages().AppendIfNeeded(module.GetSP());
1504     return true;
1505   }
1506   return false;
1507 }
1508 
1509 uint32_t SBTarget::GetNumModules() const {
1510   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1511 
1512   uint32_t num = 0;
1513   TargetSP target_sp(GetSP());
1514   if (target_sp) {
1515     // The module list is thread safe, no need to lock
1516     num = target_sp->GetImages().GetSize();
1517   }
1518 
1519   if (log)
1520     log->Printf("SBTarget(%p)::GetNumModules () => %d",
1521                 static_cast<void *>(target_sp.get()), num);
1522 
1523   return num;
1524 }
1525 
1526 void SBTarget::Clear() {
1527   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1528 
1529   if (log)
1530     log->Printf("SBTarget(%p)::Clear ()",
1531                 static_cast<void *>(m_opaque_sp.get()));
1532 
1533   m_opaque_sp.reset();
1534 }
1535 
1536 SBModule SBTarget::FindModule(const SBFileSpec &sb_file_spec) {
1537   SBModule sb_module;
1538   TargetSP target_sp(GetSP());
1539   if (target_sp && sb_file_spec.IsValid()) {
1540     ModuleSpec module_spec(*sb_file_spec);
1541     // The module list is thread safe, no need to lock
1542     sb_module.SetSP(target_sp->GetImages().FindFirstModule(module_spec));
1543   }
1544   return sb_module;
1545 }
1546 
1547 lldb::ByteOrder SBTarget::GetByteOrder() {
1548   TargetSP target_sp(GetSP());
1549   if (target_sp)
1550     return target_sp->GetArchitecture().GetByteOrder();
1551   return eByteOrderInvalid;
1552 }
1553 
1554 const char *SBTarget::GetTriple() {
1555   TargetSP target_sp(GetSP());
1556   if (target_sp) {
1557     std::string triple(target_sp->GetArchitecture().GetTriple().str());
1558     // Unique the string so we don't run into ownership issues since the const
1559     // strings put the string into the string pool once and the strings never
1560     // comes out
1561     ConstString const_triple(triple.c_str());
1562     return const_triple.GetCString();
1563   }
1564   return NULL;
1565 }
1566 
1567 uint32_t SBTarget::GetDataByteSize() {
1568   TargetSP target_sp(GetSP());
1569   if (target_sp) {
1570     return target_sp->GetArchitecture().GetDataByteSize();
1571   }
1572   return 0;
1573 }
1574 
1575 uint32_t SBTarget::GetCodeByteSize() {
1576   TargetSP target_sp(GetSP());
1577   if (target_sp) {
1578     return target_sp->GetArchitecture().GetCodeByteSize();
1579   }
1580   return 0;
1581 }
1582 
1583 uint32_t SBTarget::GetAddressByteSize() {
1584   TargetSP target_sp(GetSP());
1585   if (target_sp)
1586     return target_sp->GetArchitecture().GetAddressByteSize();
1587   return sizeof(void *);
1588 }
1589 
1590 SBModule SBTarget::GetModuleAtIndex(uint32_t idx) {
1591   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1592 
1593   SBModule sb_module;
1594   ModuleSP module_sp;
1595   TargetSP target_sp(GetSP());
1596   if (target_sp) {
1597     // The module list is thread safe, no need to lock
1598     module_sp = target_sp->GetImages().GetModuleAtIndex(idx);
1599     sb_module.SetSP(module_sp);
1600   }
1601 
1602   if (log)
1603     log->Printf("SBTarget(%p)::GetModuleAtIndex (idx=%d) => SBModule(%p)",
1604                 static_cast<void *>(target_sp.get()), idx,
1605                 static_cast<void *>(module_sp.get()));
1606 
1607   return sb_module;
1608 }
1609 
1610 bool SBTarget::RemoveModule(lldb::SBModule module) {
1611   TargetSP target_sp(GetSP());
1612   if (target_sp)
1613     return target_sp->GetImages().Remove(module.GetSP());
1614   return false;
1615 }
1616 
1617 SBBroadcaster SBTarget::GetBroadcaster() const {
1618   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1619 
1620   TargetSP target_sp(GetSP());
1621   SBBroadcaster broadcaster(target_sp.get(), false);
1622 
1623   if (log)
1624     log->Printf("SBTarget(%p)::GetBroadcaster () => SBBroadcaster(%p)",
1625                 static_cast<void *>(target_sp.get()),
1626                 static_cast<void *>(broadcaster.get()));
1627 
1628   return broadcaster;
1629 }
1630 
1631 bool SBTarget::GetDescription(SBStream &description,
1632                               lldb::DescriptionLevel description_level) {
1633   Stream &strm = description.ref();
1634 
1635   TargetSP target_sp(GetSP());
1636   if (target_sp) {
1637     target_sp->Dump(&strm, description_level);
1638   } else
1639     strm.PutCString("No value");
1640 
1641   return true;
1642 }
1643 
1644 lldb::SBSymbolContextList SBTarget::FindFunctions(const char *name,
1645                                                   uint32_t name_type_mask) {
1646   lldb::SBSymbolContextList sb_sc_list;
1647   if (name && name[0]) {
1648     TargetSP target_sp(GetSP());
1649     if (target_sp) {
1650       const bool symbols_ok = true;
1651       const bool inlines_ok = true;
1652       const bool append = true;
1653       target_sp->GetImages().FindFunctions(ConstString(name), name_type_mask,
1654                                            symbols_ok, inlines_ok, append,
1655                                            *sb_sc_list);
1656     }
1657   }
1658   return sb_sc_list;
1659 }
1660 
1661 lldb::SBSymbolContextList SBTarget::FindGlobalFunctions(const char *name,
1662                                                         uint32_t max_matches,
1663                                                         MatchType matchtype) {
1664   lldb::SBSymbolContextList sb_sc_list;
1665   if (name && name[0]) {
1666     llvm::StringRef name_ref(name);
1667     TargetSP target_sp(GetSP());
1668     if (target_sp) {
1669       std::string regexstr;
1670       switch (matchtype) {
1671       case eMatchTypeRegex:
1672         target_sp->GetImages().FindFunctions(RegularExpression(name_ref), true,
1673                                              true, true, *sb_sc_list);
1674         break;
1675       case eMatchTypeStartsWith:
1676         regexstr = llvm::Regex::escape(name) + ".*";
1677         target_sp->GetImages().FindFunctions(RegularExpression(regexstr), true,
1678                                              true, true, *sb_sc_list);
1679         break;
1680       default:
1681         target_sp->GetImages().FindFunctions(ConstString(name),
1682                                              eFunctionNameTypeAny, true, true,
1683                                              true, *sb_sc_list);
1684         break;
1685       }
1686     }
1687   }
1688   return sb_sc_list;
1689 }
1690 
1691 lldb::SBType SBTarget::FindFirstType(const char *typename_cstr) {
1692   TargetSP target_sp(GetSP());
1693   if (typename_cstr && typename_cstr[0] && target_sp) {
1694     ConstString const_typename(typename_cstr);
1695     SymbolContext sc;
1696     const bool exact_match = false;
1697 
1698     const ModuleList &module_list = target_sp->GetImages();
1699     size_t count = module_list.GetSize();
1700     for (size_t idx = 0; idx < count; idx++) {
1701       ModuleSP module_sp(module_list.GetModuleAtIndex(idx));
1702       if (module_sp) {
1703         TypeSP type_sp(
1704             module_sp->FindFirstType(sc, const_typename, exact_match));
1705         if (type_sp)
1706           return SBType(type_sp);
1707       }
1708     }
1709 
1710     // Didn't find the type in the symbols; try the Objective-C runtime if one
1711     // is installed
1712 
1713     ProcessSP process_sp(target_sp->GetProcessSP());
1714 
1715     if (process_sp) {
1716       ObjCLanguageRuntime *objc_language_runtime =
1717           process_sp->GetObjCLanguageRuntime();
1718 
1719       if (objc_language_runtime) {
1720         DeclVendor *objc_decl_vendor = objc_language_runtime->GetDeclVendor();
1721 
1722         if (objc_decl_vendor) {
1723           std::vector<clang::NamedDecl *> decls;
1724 
1725           if (objc_decl_vendor->FindDecls(const_typename, true, 1, decls) > 0) {
1726             if (CompilerType type = ClangASTContext::GetTypeForDecl(decls[0])) {
1727               return SBType(type);
1728             }
1729           }
1730         }
1731       }
1732     }
1733 
1734     // No matches, search for basic typename matches
1735     ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext();
1736     if (clang_ast)
1737       return SBType(ClangASTContext::GetBasicType(clang_ast->getASTContext(),
1738                                                   const_typename));
1739   }
1740   return SBType();
1741 }
1742 
1743 SBType SBTarget::GetBasicType(lldb::BasicType type) {
1744   TargetSP target_sp(GetSP());
1745   if (target_sp) {
1746     ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext();
1747     if (clang_ast)
1748       return SBType(
1749           ClangASTContext::GetBasicType(clang_ast->getASTContext(), type));
1750   }
1751   return SBType();
1752 }
1753 
1754 lldb::SBTypeList SBTarget::FindTypes(const char *typename_cstr) {
1755   SBTypeList sb_type_list;
1756   TargetSP target_sp(GetSP());
1757   if (typename_cstr && typename_cstr[0] && target_sp) {
1758     ModuleList &images = target_sp->GetImages();
1759     ConstString const_typename(typename_cstr);
1760     bool exact_match = false;
1761     SymbolContext sc;
1762     TypeList type_list;
1763     llvm::DenseSet<SymbolFile *> searched_symbol_files;
1764     uint32_t num_matches =
1765         images.FindTypes(sc, const_typename, exact_match, UINT32_MAX,
1766                          searched_symbol_files, type_list);
1767 
1768     if (num_matches > 0) {
1769       for (size_t idx = 0; idx < num_matches; idx++) {
1770         TypeSP type_sp(type_list.GetTypeAtIndex(idx));
1771         if (type_sp)
1772           sb_type_list.Append(SBType(type_sp));
1773       }
1774     }
1775 
1776     // Try the Objective-C runtime if one is installed
1777 
1778     ProcessSP process_sp(target_sp->GetProcessSP());
1779 
1780     if (process_sp) {
1781       ObjCLanguageRuntime *objc_language_runtime =
1782           process_sp->GetObjCLanguageRuntime();
1783 
1784       if (objc_language_runtime) {
1785         DeclVendor *objc_decl_vendor = objc_language_runtime->GetDeclVendor();
1786 
1787         if (objc_decl_vendor) {
1788           std::vector<clang::NamedDecl *> decls;
1789 
1790           if (objc_decl_vendor->FindDecls(const_typename, true, 1, decls) > 0) {
1791             for (clang::NamedDecl *decl : decls) {
1792               if (CompilerType type = ClangASTContext::GetTypeForDecl(decl)) {
1793                 sb_type_list.Append(SBType(type));
1794               }
1795             }
1796           }
1797         }
1798       }
1799     }
1800 
1801     if (sb_type_list.GetSize() == 0) {
1802       // No matches, search for basic typename matches
1803       ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext();
1804       if (clang_ast)
1805         sb_type_list.Append(SBType(ClangASTContext::GetBasicType(
1806             clang_ast->getASTContext(), const_typename)));
1807     }
1808   }
1809   return sb_type_list;
1810 }
1811 
1812 SBValueList SBTarget::FindGlobalVariables(const char *name,
1813                                           uint32_t max_matches) {
1814   SBValueList sb_value_list;
1815 
1816   TargetSP target_sp(GetSP());
1817   if (name && target_sp) {
1818     VariableList variable_list;
1819     const uint32_t match_count = target_sp->GetImages().FindGlobalVariables(
1820         ConstString(name), max_matches, variable_list);
1821 
1822     if (match_count > 0) {
1823       ExecutionContextScope *exe_scope = target_sp->GetProcessSP().get();
1824       if (exe_scope == NULL)
1825         exe_scope = target_sp.get();
1826       for (uint32_t i = 0; i < match_count; ++i) {
1827         lldb::ValueObjectSP valobj_sp(ValueObjectVariable::Create(
1828             exe_scope, variable_list.GetVariableAtIndex(i)));
1829         if (valobj_sp)
1830           sb_value_list.Append(SBValue(valobj_sp));
1831       }
1832     }
1833   }
1834 
1835   return sb_value_list;
1836 }
1837 
1838 SBValueList SBTarget::FindGlobalVariables(const char *name,
1839                                           uint32_t max_matches,
1840                                           MatchType matchtype) {
1841   SBValueList sb_value_list;
1842 
1843   TargetSP target_sp(GetSP());
1844   if (name && target_sp) {
1845     llvm::StringRef name_ref(name);
1846     VariableList variable_list;
1847 
1848     std::string regexstr;
1849     uint32_t match_count;
1850     switch (matchtype) {
1851     case eMatchTypeNormal:
1852       match_count = target_sp->GetImages().FindGlobalVariables(
1853           ConstString(name), max_matches, variable_list);
1854       break;
1855     case eMatchTypeRegex:
1856       match_count = target_sp->GetImages().FindGlobalVariables(
1857           RegularExpression(name_ref), max_matches, variable_list);
1858       break;
1859     case eMatchTypeStartsWith:
1860       regexstr = llvm::Regex::escape(name) + ".*";
1861       match_count = target_sp->GetImages().FindGlobalVariables(
1862           RegularExpression(regexstr), max_matches, variable_list);
1863       break;
1864     }
1865 
1866     if (match_count > 0) {
1867       ExecutionContextScope *exe_scope = target_sp->GetProcessSP().get();
1868       if (exe_scope == NULL)
1869         exe_scope = target_sp.get();
1870       for (uint32_t i = 0; i < match_count; ++i) {
1871         lldb::ValueObjectSP valobj_sp(ValueObjectVariable::Create(
1872             exe_scope, variable_list.GetVariableAtIndex(i)));
1873         if (valobj_sp)
1874           sb_value_list.Append(SBValue(valobj_sp));
1875       }
1876     }
1877   }
1878 
1879   return sb_value_list;
1880 }
1881 
1882 lldb::SBValue SBTarget::FindFirstGlobalVariable(const char *name) {
1883   SBValueList sb_value_list(FindGlobalVariables(name, 1));
1884   if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
1885     return sb_value_list.GetValueAtIndex(0);
1886   return SBValue();
1887 }
1888 
1889 SBSourceManager SBTarget::GetSourceManager() {
1890   SBSourceManager source_manager(*this);
1891   return source_manager;
1892 }
1893 
1894 lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr,
1895                                                    uint32_t count) {
1896   return ReadInstructions(base_addr, count, NULL);
1897 }
1898 
1899 lldb::SBInstructionList SBTarget::ReadInstructions(lldb::SBAddress base_addr,
1900                                                    uint32_t count,
1901                                                    const char *flavor_string) {
1902   SBInstructionList sb_instructions;
1903 
1904   TargetSP target_sp(GetSP());
1905   if (target_sp) {
1906     Address *addr_ptr = base_addr.get();
1907 
1908     if (addr_ptr) {
1909       DataBufferHeap data(
1910           target_sp->GetArchitecture().GetMaximumOpcodeByteSize() * count, 0);
1911       bool prefer_file_cache = false;
1912       lldb_private::Status error;
1913       lldb::addr_t load_addr = LLDB_INVALID_ADDRESS;
1914       const size_t bytes_read =
1915           target_sp->ReadMemory(*addr_ptr, prefer_file_cache, data.GetBytes(),
1916                                 data.GetByteSize(), error, &load_addr);
1917       const bool data_from_file = load_addr == LLDB_INVALID_ADDRESS;
1918       sb_instructions.SetDisassembler(Disassembler::DisassembleBytes(
1919           target_sp->GetArchitecture(), NULL, flavor_string, *addr_ptr,
1920           data.GetBytes(), bytes_read, count, data_from_file));
1921     }
1922   }
1923 
1924   return sb_instructions;
1925 }
1926 
1927 lldb::SBInstructionList SBTarget::GetInstructions(lldb::SBAddress base_addr,
1928                                                   const void *buf,
1929                                                   size_t size) {
1930   return GetInstructionsWithFlavor(base_addr, NULL, buf, size);
1931 }
1932 
1933 lldb::SBInstructionList
1934 SBTarget::GetInstructionsWithFlavor(lldb::SBAddress base_addr,
1935                                     const char *flavor_string, const void *buf,
1936                                     size_t size) {
1937   SBInstructionList sb_instructions;
1938 
1939   TargetSP target_sp(GetSP());
1940   if (target_sp) {
1941     Address addr;
1942 
1943     if (base_addr.get())
1944       addr = *base_addr.get();
1945 
1946     const bool data_from_file = true;
1947 
1948     sb_instructions.SetDisassembler(Disassembler::DisassembleBytes(
1949         target_sp->GetArchitecture(), NULL, flavor_string, addr, buf, size,
1950         UINT32_MAX, data_from_file));
1951   }
1952 
1953   return sb_instructions;
1954 }
1955 
1956 lldb::SBInstructionList SBTarget::GetInstructions(lldb::addr_t base_addr,
1957                                                   const void *buf,
1958                                                   size_t size) {
1959   return GetInstructionsWithFlavor(ResolveLoadAddress(base_addr), NULL, buf,
1960                                    size);
1961 }
1962 
1963 lldb::SBInstructionList
1964 SBTarget::GetInstructionsWithFlavor(lldb::addr_t base_addr,
1965                                     const char *flavor_string, const void *buf,
1966                                     size_t size) {
1967   return GetInstructionsWithFlavor(ResolveLoadAddress(base_addr), flavor_string,
1968                                    buf, size);
1969 }
1970 
1971 SBError SBTarget::SetSectionLoadAddress(lldb::SBSection section,
1972                                         lldb::addr_t section_base_addr) {
1973   SBError sb_error;
1974   TargetSP target_sp(GetSP());
1975   if (target_sp) {
1976     if (!section.IsValid()) {
1977       sb_error.SetErrorStringWithFormat("invalid section");
1978     } else {
1979       SectionSP section_sp(section.GetSP());
1980       if (section_sp) {
1981         if (section_sp->IsThreadSpecific()) {
1982           sb_error.SetErrorString(
1983               "thread specific sections are not yet supported");
1984         } else {
1985           ProcessSP process_sp(target_sp->GetProcessSP());
1986           if (target_sp->SetSectionLoadAddress(section_sp, section_base_addr)) {
1987             ModuleSP module_sp(section_sp->GetModule());
1988             if (module_sp) {
1989               ModuleList module_list;
1990               module_list.Append(module_sp);
1991               target_sp->ModulesDidLoad(module_list);
1992             }
1993             // Flush info in the process (stack frames, etc)
1994             if (process_sp)
1995               process_sp->Flush();
1996           }
1997         }
1998       }
1999     }
2000   } else {
2001     sb_error.SetErrorString("invalid target");
2002   }
2003   return sb_error;
2004 }
2005 
2006 SBError SBTarget::ClearSectionLoadAddress(lldb::SBSection section) {
2007   SBError sb_error;
2008 
2009   TargetSP target_sp(GetSP());
2010   if (target_sp) {
2011     if (!section.IsValid()) {
2012       sb_error.SetErrorStringWithFormat("invalid section");
2013     } else {
2014       SectionSP section_sp(section.GetSP());
2015       if (section_sp) {
2016         ProcessSP process_sp(target_sp->GetProcessSP());
2017         if (target_sp->SetSectionUnloaded(section_sp)) {
2018           ModuleSP module_sp(section_sp->GetModule());
2019           if (module_sp) {
2020             ModuleList module_list;
2021             module_list.Append(module_sp);
2022             target_sp->ModulesDidUnload(module_list, false);
2023           }
2024           // Flush info in the process (stack frames, etc)
2025           if (process_sp)
2026             process_sp->Flush();
2027         }
2028       } else {
2029         sb_error.SetErrorStringWithFormat("invalid section");
2030       }
2031     }
2032   } else {
2033     sb_error.SetErrorStringWithFormat("invalid target");
2034   }
2035   return sb_error;
2036 }
2037 
2038 SBError SBTarget::SetModuleLoadAddress(lldb::SBModule module,
2039                                        int64_t slide_offset) {
2040   SBError sb_error;
2041 
2042   TargetSP target_sp(GetSP());
2043   if (target_sp) {
2044     ModuleSP module_sp(module.GetSP());
2045     if (module_sp) {
2046       bool changed = false;
2047       if (module_sp->SetLoadAddress(*target_sp, slide_offset, true, changed)) {
2048         // The load was successful, make sure that at least some sections
2049         // changed before we notify that our module was loaded.
2050         if (changed) {
2051           ModuleList module_list;
2052           module_list.Append(module_sp);
2053           target_sp->ModulesDidLoad(module_list);
2054           // Flush info in the process (stack frames, etc)
2055           ProcessSP process_sp(target_sp->GetProcessSP());
2056           if (process_sp)
2057             process_sp->Flush();
2058         }
2059       }
2060     } else {
2061       sb_error.SetErrorStringWithFormat("invalid module");
2062     }
2063 
2064   } else {
2065     sb_error.SetErrorStringWithFormat("invalid target");
2066   }
2067   return sb_error;
2068 }
2069 
2070 SBError SBTarget::ClearModuleLoadAddress(lldb::SBModule module) {
2071   SBError sb_error;
2072 
2073   char path[PATH_MAX];
2074   TargetSP target_sp(GetSP());
2075   if (target_sp) {
2076     ModuleSP module_sp(module.GetSP());
2077     if (module_sp) {
2078       ObjectFile *objfile = module_sp->GetObjectFile();
2079       if (objfile) {
2080         SectionList *section_list = objfile->GetSectionList();
2081         if (section_list) {
2082           ProcessSP process_sp(target_sp->GetProcessSP());
2083 
2084           bool changed = false;
2085           const size_t num_sections = section_list->GetSize();
2086           for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
2087             SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
2088             if (section_sp)
2089               changed |= target_sp->SetSectionUnloaded(section_sp);
2090           }
2091           if (changed) {
2092             ModuleList module_list;
2093             module_list.Append(module_sp);
2094             target_sp->ModulesDidUnload(module_list, false);
2095             // Flush info in the process (stack frames, etc)
2096             ProcessSP process_sp(target_sp->GetProcessSP());
2097             if (process_sp)
2098               process_sp->Flush();
2099           }
2100         } else {
2101           module_sp->GetFileSpec().GetPath(path, sizeof(path));
2102           sb_error.SetErrorStringWithFormat("no sections in object file '%s'",
2103                                             path);
2104         }
2105       } else {
2106         module_sp->GetFileSpec().GetPath(path, sizeof(path));
2107         sb_error.SetErrorStringWithFormat("no object file for module '%s'",
2108                                           path);
2109       }
2110     } else {
2111       sb_error.SetErrorStringWithFormat("invalid module");
2112     }
2113   } else {
2114     sb_error.SetErrorStringWithFormat("invalid target");
2115   }
2116   return sb_error;
2117 }
2118 
2119 lldb::SBSymbolContextList SBTarget::FindSymbols(const char *name,
2120                                                 lldb::SymbolType symbol_type) {
2121   SBSymbolContextList sb_sc_list;
2122   if (name && name[0]) {
2123     TargetSP target_sp(GetSP());
2124     if (target_sp) {
2125       bool append = true;
2126       target_sp->GetImages().FindSymbolsWithNameAndType(
2127           ConstString(name), symbol_type, *sb_sc_list, append);
2128     }
2129   }
2130   return sb_sc_list;
2131 }
2132 
2133 lldb::SBValue SBTarget::EvaluateExpression(const char *expr) {
2134   TargetSP target_sp(GetSP());
2135   if (!target_sp)
2136     return SBValue();
2137 
2138   SBExpressionOptions options;
2139   lldb::DynamicValueType fetch_dynamic_value =
2140       target_sp->GetPreferDynamicValue();
2141   options.SetFetchDynamicValue(fetch_dynamic_value);
2142   options.SetUnwindOnError(true);
2143   return EvaluateExpression(expr, options);
2144 }
2145 
2146 lldb::SBValue SBTarget::EvaluateExpression(const char *expr,
2147                                            const SBExpressionOptions &options) {
2148   Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
2149 #if !defined(LLDB_DISABLE_PYTHON)
2150   Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS));
2151 #endif
2152   SBValue expr_result;
2153   ExpressionResults exe_results = eExpressionSetupError;
2154   ValueObjectSP expr_value_sp;
2155   TargetSP target_sp(GetSP());
2156   StackFrame *frame = NULL;
2157   if (target_sp) {
2158     if (expr == NULL || expr[0] == '\0') {
2159       if (log)
2160         log->Printf(
2161             "SBTarget::EvaluateExpression called with an empty expression");
2162       return expr_result;
2163     }
2164 
2165     std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
2166     ExecutionContext exe_ctx(m_opaque_sp.get());
2167 
2168     if (log)
2169       log->Printf("SBTarget()::EvaluateExpression (expr=\"%s\")...", expr);
2170 
2171     frame = exe_ctx.GetFramePtr();
2172     Target *target = exe_ctx.GetTargetPtr();
2173 
2174     if (target) {
2175 #ifdef LLDB_CONFIGURATION_DEBUG
2176       StreamString frame_description;
2177       if (frame)
2178         frame->DumpUsingSettingsFormat(&frame_description);
2179       llvm::PrettyStackTraceFormat stack_trace(
2180           "SBTarget::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = "
2181           "%u) %s",
2182           expr, options.GetFetchDynamicValue(),
2183           frame_description.GetString().str().c_str());
2184 #endif
2185       exe_results =
2186           target->EvaluateExpression(expr, frame, expr_value_sp, options.ref());
2187 
2188       expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
2189     } else {
2190       if (log)
2191         log->Printf("SBTarget::EvaluateExpression () => error: could not "
2192                     "reconstruct frame object for this SBTarget.");
2193     }
2194   }
2195 #ifndef LLDB_DISABLE_PYTHON
2196   if (expr_log)
2197     expr_log->Printf("** [SBTarget::EvaluateExpression] Expression result is "
2198                      "%s, summary %s **",
2199                      expr_result.GetValue(), expr_result.GetSummary());
2200 
2201   if (log)
2202     log->Printf("SBTarget(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) "
2203                 "(execution result=%d)",
2204                 static_cast<void *>(frame), expr,
2205                 static_cast<void *>(expr_value_sp.get()), exe_results);
2206 #endif
2207 
2208   return expr_result;
2209 }
2210 
2211 lldb::addr_t SBTarget::GetStackRedZoneSize() {
2212   TargetSP target_sp(GetSP());
2213   if (target_sp) {
2214     ABISP abi_sp;
2215     ProcessSP process_sp(target_sp->GetProcessSP());
2216     if (process_sp)
2217       abi_sp = process_sp->GetABI();
2218     else
2219       abi_sp = ABI::FindPlugin(ProcessSP(), target_sp->GetArchitecture());
2220     if (abi_sp)
2221       return abi_sp->GetRedZoneSize();
2222   }
2223   return 0;
2224 }
2225 
2226 lldb::SBLaunchInfo SBTarget::GetLaunchInfo() const {
2227   lldb::SBLaunchInfo launch_info(NULL);
2228   TargetSP target_sp(GetSP());
2229   if (target_sp)
2230     launch_info.set_ref(m_opaque_sp->GetProcessLaunchInfo());
2231   return launch_info;
2232 }
2233 
2234 void SBTarget::SetLaunchInfo(const lldb::SBLaunchInfo &launch_info) {
2235   TargetSP target_sp(GetSP());
2236   if (target_sp)
2237     m_opaque_sp->SetProcessLaunchInfo(launch_info.ref());
2238 }
2239