1 //===-- Target.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 // C Includes
11 // C++ Includes
12 #include <mutex>
13 // Other libraries and framework includes
14 // Project includes
15 #include "lldb/Target/Target.h"
16 #include "lldb/Breakpoint/BreakpointResolver.h"
17 #include "lldb/Breakpoint/BreakpointResolverAddress.h"
18 #include "lldb/Breakpoint/BreakpointResolverFileLine.h"
19 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h"
20 #include "lldb/Breakpoint/BreakpointResolverName.h"
21 #include "lldb/Breakpoint/Watchpoint.h"
22 #include "lldb/Core/Debugger.h"
23 #include "lldb/Core/Event.h"
24 #include "lldb/Core/Log.h"
25 #include "lldb/Core/Module.h"
26 #include "lldb/Core/ModuleSpec.h"
27 #include "lldb/Core/Section.h"
28 #include "lldb/Core/SourceManager.h"
29 #include "lldb/Core/State.h"
30 #include "lldb/Core/StreamFile.h"
31 #include "lldb/Core/StreamString.h"
32 #include "lldb/Core/Timer.h"
33 #include "lldb/Core/ValueObject.h"
34 #include "lldb/Expression/REPL.h"
35 #include "lldb/Expression/UserExpression.h"
36 #include "Plugins/ExpressionParser/Clang/ClangASTSource.h"
37 #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
38 #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h"
39 #include "lldb/Host/FileSpec.h"
40 #include "lldb/Host/Host.h"
41 #include "lldb/Interpreter/CommandInterpreter.h"
42 #include "lldb/Interpreter/CommandReturnObject.h"
43 #include "lldb/Interpreter/OptionGroupWatchpoint.h"
44 #include "lldb/Interpreter/OptionValues.h"
45 #include "lldb/Interpreter/Property.h"
46 #include "lldb/Symbol/ClangASTContext.h"
47 #include "lldb/Symbol/ObjectFile.h"
48 #include "lldb/Symbol/Function.h"
49 #include "lldb/Symbol/Symbol.h"
50 #include "lldb/Target/Language.h"
51 #include "lldb/Target/LanguageRuntime.h"
52 #include "lldb/Target/ObjCLanguageRuntime.h"
53 #include "lldb/Target/Process.h"
54 #include "lldb/Target/SectionLoadList.h"
55 #include "lldb/Target/StackFrame.h"
56 #include "lldb/Target/SystemRuntime.h"
57 #include "lldb/Target/Thread.h"
58 #include "lldb/Target/ThreadSpec.h"
59 #include "lldb/Utility/LLDBAssert.h"
60 
61 using namespace lldb;
62 using namespace lldb_private;
63 
64 ConstString &
65 Target::GetStaticBroadcasterClass ()
66 {
67     static ConstString class_name ("lldb.target");
68     return class_name;
69 }
70 
71 Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp,
72                bool is_dummy_target)
73     : TargetProperties(this),
74       Broadcaster(debugger.GetBroadcasterManager(), Target::GetStaticBroadcasterClass().AsCString()),
75       ExecutionContextScope(),
76       m_debugger(debugger),
77       m_platform_sp(platform_sp),
78       m_mutex(),
79       m_arch(target_arch),
80       m_images(this),
81       m_section_load_history(),
82       m_breakpoint_list(false),
83       m_internal_breakpoint_list(true),
84       m_watchpoint_list(),
85       m_process_sp(),
86       m_search_filter_sp(),
87       m_image_search_paths(ImageSearchPathsChanged, this),
88       m_ast_importer_sp(),
89       m_source_manager_ap(),
90       m_stop_hooks(),
91       m_stop_hook_next_id(0),
92       m_valid(true),
93       m_suppress_stop_hooks(false),
94       m_is_dummy_target(is_dummy_target)
95 
96 {
97     SetEventName(eBroadcastBitBreakpointChanged, "breakpoint-changed");
98     SetEventName(eBroadcastBitModulesLoaded, "modules-loaded");
99     SetEventName(eBroadcastBitModulesUnloaded, "modules-unloaded");
100     SetEventName(eBroadcastBitWatchpointChanged, "watchpoint-changed");
101     SetEventName(eBroadcastBitSymbolsLoaded, "symbols-loaded");
102 
103     CheckInWithManager();
104 
105     Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT));
106     if (log)
107         log->Printf("%p Target::Target()", static_cast<void *>(this));
108     if (m_arch.IsValid())
109     {
110         LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)",
111                               m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
112     }
113 }
114 
115 Target::~Target()
116 {
117     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
118     if (log)
119         log->Printf ("%p Target::~Target()", static_cast<void*>(this));
120     DeleteCurrentProcess ();
121 }
122 
123 void
124 Target::PrimeFromDummyTarget(Target *target)
125 {
126     if (!target)
127         return;
128 
129     m_stop_hooks = target->m_stop_hooks;
130 
131     for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints())
132     {
133         if (breakpoint_sp->IsInternal())
134             continue;
135 
136         BreakpointSP new_bp (new Breakpoint (*this, *breakpoint_sp.get()));
137         AddBreakpoint (new_bp, false);
138     }
139 }
140 
141 void
142 Target::Dump (Stream *s, lldb::DescriptionLevel description_level)
143 {
144 //    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
145     if (description_level != lldb::eDescriptionLevelBrief)
146     {
147         s->Indent();
148         s->PutCString("Target\n");
149         s->IndentMore();
150             m_images.Dump(s);
151             m_breakpoint_list.Dump(s);
152             m_internal_breakpoint_list.Dump(s);
153         s->IndentLess();
154     }
155     else
156     {
157         Module *exe_module = GetExecutableModulePointer();
158         if (exe_module)
159             s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString());
160         else
161             s->PutCString ("No executable module.");
162     }
163 }
164 
165 void
166 Target::CleanupProcess ()
167 {
168     // Do any cleanup of the target we need to do between process instances.
169     // NB It is better to do this before destroying the process in case the
170     // clean up needs some help from the process.
171     m_breakpoint_list.ClearAllBreakpointSites();
172     m_internal_breakpoint_list.ClearAllBreakpointSites();
173     // Disable watchpoints just on the debugger side.
174     std::unique_lock<std::recursive_mutex> lock;
175     this->GetWatchpointList().GetListMutex(lock);
176     DisableAllWatchpoints(false);
177     ClearAllWatchpointHitCounts();
178     ClearAllWatchpointHistoricValues();
179 }
180 
181 void
182 Target::DeleteCurrentProcess ()
183 {
184     if (m_process_sp)
185     {
186         m_section_load_history.Clear();
187         if (m_process_sp->IsAlive())
188             m_process_sp->Destroy(false);
189 
190         m_process_sp->Finalize();
191 
192         CleanupProcess ();
193 
194         m_process_sp.reset();
195     }
196 }
197 
198 const lldb::ProcessSP &
199 Target::CreateProcess (ListenerSP listener_sp, const char *plugin_name, const FileSpec *crash_file)
200 {
201     DeleteCurrentProcess ();
202     m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name, listener_sp, crash_file);
203     return m_process_sp;
204 }
205 
206 const lldb::ProcessSP &
207 Target::GetProcessSP () const
208 {
209     return m_process_sp;
210 }
211 
212 lldb::REPLSP
213 Target::GetREPL (Error &err, lldb::LanguageType language, const char *repl_options, bool can_create)
214 {
215     if (language == eLanguageTypeUnknown)
216     {
217         std::set<LanguageType> repl_languages;
218 
219         Language::GetLanguagesSupportingREPLs(repl_languages);
220 
221         if (repl_languages.size() == 1)
222         {
223             language = *repl_languages.begin();
224         }
225         else if (repl_languages.size() == 0)
226         {
227             err.SetErrorStringWithFormat("LLDB isn't configured with REPL support for any languages.");
228             return REPLSP();
229         }
230         else
231         {
232             err.SetErrorStringWithFormat("Multiple possible REPL languages.  Please specify a language.");
233             return REPLSP();
234         }
235     }
236 
237     REPLMap::iterator pos = m_repl_map.find(language);
238 
239     if (pos != m_repl_map.end())
240     {
241         return pos->second;
242     }
243 
244     if (!can_create)
245     {
246         err.SetErrorStringWithFormat("Couldn't find an existing REPL for %s, and can't create a new one", Language::GetNameForLanguageType(language));
247         return lldb::REPLSP();
248     }
249 
250     Debugger *const debugger = nullptr;
251     lldb::REPLSP ret = REPL::Create(err, language, debugger, this, repl_options);
252 
253     if (ret)
254     {
255         m_repl_map[language] = ret;
256         return m_repl_map[language];
257     }
258 
259     if (err.Success())
260     {
261         err.SetErrorStringWithFormat("Couldn't create a REPL for %s", Language::GetNameForLanguageType(language));
262     }
263 
264     return lldb::REPLSP();
265 }
266 
267 void
268 Target::SetREPL (lldb::LanguageType language, lldb::REPLSP repl_sp)
269 {
270     lldbassert(!m_repl_map.count(language));
271 
272     m_repl_map[language] = repl_sp;
273 }
274 
275 void
276 Target::Destroy()
277 {
278     std::lock_guard<std::recursive_mutex> guard(m_mutex);
279     m_valid = false;
280     DeleteCurrentProcess ();
281     m_platform_sp.reset();
282     m_arch.Clear();
283     ClearModules(true);
284     m_section_load_history.Clear();
285     const bool notify = false;
286     m_breakpoint_list.RemoveAll(notify);
287     m_internal_breakpoint_list.RemoveAll(notify);
288     m_last_created_breakpoint.reset();
289     m_last_created_watchpoint.reset();
290     m_search_filter_sp.reset();
291     m_image_search_paths.Clear(notify);
292     m_stop_hooks.clear();
293     m_stop_hook_next_id = 0;
294     m_suppress_stop_hooks = false;
295 }
296 
297 BreakpointList &
298 Target::GetBreakpointList(bool internal)
299 {
300     if (internal)
301         return m_internal_breakpoint_list;
302     else
303         return m_breakpoint_list;
304 }
305 
306 const BreakpointList &
307 Target::GetBreakpointList(bool internal) const
308 {
309     if (internal)
310         return m_internal_breakpoint_list;
311     else
312         return m_breakpoint_list;
313 }
314 
315 BreakpointSP
316 Target::GetBreakpointByID (break_id_t break_id)
317 {
318     BreakpointSP bp_sp;
319 
320     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
321         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
322     else
323         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
324 
325     return bp_sp;
326 }
327 
328 BreakpointSP
329 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules,
330                                      const FileSpecList *source_file_spec_list,
331                                      const std::unordered_set<std::string> &function_names,
332                                      RegularExpression &source_regex,
333                                      bool internal,
334                                      bool hardware,
335                                      LazyBool move_to_nearest_code)
336 {
337     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list));
338     if (move_to_nearest_code == eLazyBoolCalculate)
339         move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
340     BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex(nullptr,
341                                                                      source_regex,
342                                                                      function_names,
343                                                                      !static_cast<bool>(move_to_nearest_code)));
344 
345     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
346 }
347 
348 BreakpointSP
349 Target::CreateBreakpoint (const FileSpecList *containingModules,
350                           const FileSpec &file,
351                           uint32_t line_no,
352                           lldb::addr_t offset,
353                           LazyBool check_inlines,
354                           LazyBool skip_prologue,
355                           bool internal,
356                           bool hardware,
357                           LazyBool move_to_nearest_code)
358 {
359     FileSpec remapped_file;
360     ConstString remapped_path;
361     if (GetSourcePathMap().ReverseRemapPath(ConstString(file.GetPath().c_str()), remapped_path))
362         remapped_file.SetFile(remapped_path.AsCString(), true);
363     else
364         remapped_file = file;
365 
366     if (check_inlines == eLazyBoolCalculate)
367     {
368         const InlineStrategy inline_strategy = GetInlineStrategy();
369         switch (inline_strategy)
370         {
371             case eInlineBreakpointsNever:
372                 check_inlines = eLazyBoolNo;
373                 break;
374 
375             case eInlineBreakpointsHeaders:
376                 if (remapped_file.IsSourceImplementationFile())
377                     check_inlines = eLazyBoolNo;
378                 else
379                     check_inlines = eLazyBoolYes;
380                 break;
381 
382             case eInlineBreakpointsAlways:
383                 check_inlines = eLazyBoolYes;
384                 break;
385         }
386     }
387     SearchFilterSP filter_sp;
388     if (check_inlines == eLazyBoolNo)
389     {
390         // Not checking for inlines, we are looking only for matching compile units
391         FileSpecList compile_unit_list;
392         compile_unit_list.Append (remapped_file);
393         filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list);
394     }
395     else
396     {
397         filter_sp = GetSearchFilterForModuleList (containingModules);
398     }
399     if (skip_prologue == eLazyBoolCalculate)
400         skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
401     if (move_to_nearest_code == eLazyBoolCalculate)
402         move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo;
403 
404     BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (nullptr,
405                                                                      remapped_file,
406                                                                      line_no,
407                                                                      offset,
408                                                                      check_inlines,
409                                                                      skip_prologue,
410                                                                      !static_cast<bool>(move_to_nearest_code)));
411     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
412 }
413 
414 BreakpointSP
415 Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware)
416 {
417     Address so_addr;
418 
419     // Check for any reason we want to move this breakpoint to other address.
420     addr = GetBreakableLoadAddress(addr);
421 
422     // Attempt to resolve our load address if possible, though it is ok if
423     // it doesn't resolve to section/offset.
424 
425     // Try and resolve as a load address if possible
426     GetSectionLoadList().ResolveLoadAddress(addr, so_addr);
427     if (!so_addr.IsValid())
428     {
429         // The address didn't resolve, so just set this as an absolute address
430         so_addr.SetOffset (addr);
431     }
432     BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware));
433     return bp_sp;
434 }
435 
436 BreakpointSP
437 Target::CreateBreakpoint (const Address &addr, bool internal, bool hardware)
438 {
439     SearchFilterSP filter_sp(new SearchFilterForUnconstrainedSearches (shared_from_this()));
440     BreakpointResolverSP resolver_sp(new BreakpointResolverAddress(nullptr, addr));
441     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false);
442 }
443 
444 lldb::BreakpointSP
445 Target::CreateAddressInModuleBreakpoint (lldb::addr_t file_addr,
446                                          bool internal,
447                                          const FileSpec *file_spec,
448                                          bool request_hardware)
449 {
450     SearchFilterSP filter_sp(new SearchFilterForUnconstrainedSearches (shared_from_this()));
451     BreakpointResolverSP resolver_sp(new BreakpointResolverAddress(nullptr, file_addr, file_spec));
452     return CreateBreakpoint (filter_sp, resolver_sp, internal, request_hardware, false);
453 }
454 
455 BreakpointSP
456 Target::CreateBreakpoint (const FileSpecList *containingModules,
457                           const FileSpecList *containingSourceFiles,
458                           const char *func_name,
459                           uint32_t func_name_type_mask,
460                           LanguageType language,
461                           lldb::addr_t offset,
462                           LazyBool skip_prologue,
463                           bool internal,
464                           bool hardware)
465 {
466     BreakpointSP bp_sp;
467     if (func_name)
468     {
469         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
470 
471         if (skip_prologue == eLazyBoolCalculate)
472             skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
473         if (language == lldb::eLanguageTypeUnknown)
474             language = GetLanguage();
475 
476         BreakpointResolverSP resolver_sp (new BreakpointResolverName (nullptr,
477                                                                       func_name,
478                                                                       func_name_type_mask,
479                                                                       language,
480                                                                       Breakpoint::Exact,
481                                                                       offset,
482                                                                       skip_prologue));
483         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
484     }
485     return bp_sp;
486 }
487 
488 lldb::BreakpointSP
489 Target::CreateBreakpoint (const FileSpecList *containingModules,
490                           const FileSpecList *containingSourceFiles,
491                           const std::vector<std::string> &func_names,
492                           uint32_t func_name_type_mask,
493                           LanguageType language,
494                           lldb::addr_t offset,
495                           LazyBool skip_prologue,
496                           bool internal,
497                           bool hardware)
498 {
499     BreakpointSP bp_sp;
500     size_t num_names = func_names.size();
501     if (num_names > 0)
502     {
503         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
504 
505         if (skip_prologue == eLazyBoolCalculate)
506             skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
507         if (language == lldb::eLanguageTypeUnknown)
508             language = GetLanguage();
509 
510 
511         BreakpointResolverSP resolver_sp (new BreakpointResolverName (nullptr,
512                                                                       func_names,
513                                                                       func_name_type_mask,
514                                                                       language,
515                                                                       offset,
516                                                                       skip_prologue));
517         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
518     }
519     return bp_sp;
520 }
521 
522 BreakpointSP
523 Target::CreateBreakpoint (const FileSpecList *containingModules,
524                           const FileSpecList *containingSourceFiles,
525                           const char *func_names[],
526                           size_t num_names,
527                           uint32_t func_name_type_mask,
528                           LanguageType language,
529                           lldb::addr_t offset,
530                           LazyBool skip_prologue,
531                           bool internal,
532                           bool hardware)
533 {
534     BreakpointSP bp_sp;
535     if (num_names > 0)
536     {
537         SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
538 
539         if (skip_prologue == eLazyBoolCalculate)
540         {
541             if (offset == 0)
542                 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo;
543             else
544                 skip_prologue = eLazyBoolNo;
545         }
546         if (language == lldb::eLanguageTypeUnknown)
547             language = GetLanguage();
548 
549         BreakpointResolverSP resolver_sp (new BreakpointResolverName (nullptr,
550                                                                       func_names,
551                                                                       num_names,
552                                                                       func_name_type_mask,
553                                                                       language,
554                                                                       offset,
555                                                                       skip_prologue));
556         resolver_sp->SetOffset(offset);
557         bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
558     }
559     return bp_sp;
560 }
561 
562 SearchFilterSP
563 Target::GetSearchFilterForModule (const FileSpec *containingModule)
564 {
565     SearchFilterSP filter_sp;
566     if (containingModule != nullptr)
567     {
568         // TODO: We should look into sharing module based search filters
569         // across many breakpoints like we do for the simple target based one
570         filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule));
571     }
572     else
573     {
574         if (!m_search_filter_sp)
575             m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
576         filter_sp = m_search_filter_sp;
577     }
578     return filter_sp;
579 }
580 
581 SearchFilterSP
582 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules)
583 {
584     SearchFilterSP filter_sp;
585     if (containingModules && containingModules->GetSize() != 0)
586     {
587         // TODO: We should look into sharing module based search filters
588         // across many breakpoints like we do for the simple target based one
589         filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules));
590     }
591     else
592     {
593         if (!m_search_filter_sp)
594             m_search_filter_sp.reset (new SearchFilterForUnconstrainedSearches (shared_from_this()));
595         filter_sp = m_search_filter_sp;
596     }
597     return filter_sp;
598 }
599 
600 SearchFilterSP
601 Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules,
602                                            const FileSpecList *containingSourceFiles)
603 {
604     if (containingSourceFiles == nullptr || containingSourceFiles->GetSize() == 0)
605         return GetSearchFilterForModuleList(containingModules);
606 
607     SearchFilterSP filter_sp;
608     if (containingModules == nullptr)
609     {
610         // We could make a special "CU List only SearchFilter".  Better yet was if these could be composable,
611         // but that will take a little reworking.
612 
613         filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles));
614     }
615     else
616     {
617         filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles));
618     }
619     return filter_sp;
620 }
621 
622 BreakpointSP
623 Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules,
624                                    const FileSpecList *containingSourceFiles,
625                                    RegularExpression &func_regex,
626                                    lldb::LanguageType requested_language,
627                                    LazyBool skip_prologue,
628                                    bool internal,
629                                    bool hardware)
630 {
631     SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles));
632     bool skip =
633       (skip_prologue == eLazyBoolCalculate) ? GetSkipPrologue()
634                                             : static_cast<bool>(skip_prologue);
635     BreakpointResolverSP resolver_sp(new BreakpointResolverName (nullptr,
636                                                                  func_regex,
637                                                                  requested_language,
638                                                                  0,
639                                                                  skip));
640 
641     return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true);
642 }
643 
644 lldb::BreakpointSP
645 Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal, Args *additional_args, Error *error)
646 {
647     BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal);
648     if (exc_bkpt_sp && additional_args)
649     {
650         Breakpoint::BreakpointPreconditionSP precondition_sp = exc_bkpt_sp->GetPrecondition();
651         if (precondition_sp && additional_args)
652         {
653             if (error)
654                 *error = precondition_sp->ConfigurePrecondition(*additional_args);
655             else
656                 precondition_sp->ConfigurePrecondition(*additional_args);
657         }
658     }
659     return exc_bkpt_sp;
660 }
661 
662 BreakpointSP
663 Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols)
664 {
665     BreakpointSP bp_sp;
666     if (filter_sp && resolver_sp)
667     {
668         bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols));
669         resolver_sp->SetBreakpoint (bp_sp.get());
670         AddBreakpoint (bp_sp, internal);
671     }
672     return bp_sp;
673 }
674 
675 void
676 Target::AddBreakpoint (lldb::BreakpointSP bp_sp, bool internal)
677 {
678     if (!bp_sp)
679         return;
680     if (internal)
681         m_internal_breakpoint_list.Add (bp_sp, false);
682     else
683         m_breakpoint_list.Add (bp_sp, true);
684 
685     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
686     if (log)
687     {
688         StreamString s;
689         bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose);
690         log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, bp_sp->IsInternal() ? "yes" : "no", s.GetData());
691     }
692 
693     bp_sp->ResolveBreakpoint();
694 
695     if (!internal)
696     {
697         m_last_created_breakpoint = bp_sp;
698     }
699 }
700 
701 bool
702 Target::ProcessIsValid()
703 {
704     return (m_process_sp && m_process_sp->IsAlive());
705 }
706 
707 static bool
708 CheckIfWatchpointsExhausted(Target *target, Error &error)
709 {
710     uint32_t num_supported_hardware_watchpoints;
711     Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints);
712     if (rc.Success())
713     {
714         uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize();
715         if (num_current_watchpoints >= num_supported_hardware_watchpoints)
716             error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached",
717                                            num_supported_hardware_watchpoints);
718     }
719     return false;
720 }
721 
722 // See also Watchpoint::SetWatchpointType(uint32_t type) and
723 // the OptionGroupWatchpoint::WatchType enum type.
724 WatchpointSP
725 Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const CompilerType *type, uint32_t kind, Error &error)
726 {
727     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
728     if (log)
729         log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n",
730                     __FUNCTION__, addr, (uint64_t)size, kind);
731 
732     WatchpointSP wp_sp;
733     if (!ProcessIsValid())
734     {
735         error.SetErrorString("process is not alive");
736         return wp_sp;
737     }
738 
739     if (addr == LLDB_INVALID_ADDRESS || size == 0)
740     {
741         if (size == 0)
742             error.SetErrorString("cannot set a watchpoint with watch_size of 0");
743         else
744             error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr);
745         return wp_sp;
746     }
747 
748     if (!LLDB_WATCH_TYPE_IS_VALID(kind))
749     {
750         error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind);
751     }
752 
753     // Currently we only support one watchpoint per address, with total number
754     // of watchpoints limited by the hardware which the inferior is running on.
755 
756     // Grab the list mutex while doing operations.
757     const bool notify = false;   // Don't notify about all the state changes we do on creating the watchpoint.
758     std::unique_lock<std::recursive_mutex> lock;
759     this->GetWatchpointList().GetListMutex(lock);
760     WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr);
761     if (matched_sp)
762     {
763         size_t old_size = matched_sp->GetByteSize();
764         uint32_t old_type =
765             (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) |
766             (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0);
767         // Return the existing watchpoint if both size and type match.
768         if (size == old_size && kind == old_type)
769         {
770             wp_sp = matched_sp;
771             wp_sp->SetEnabled(false, notify);
772         }
773         else
774         {
775             // Nil the matched watchpoint; we will be creating a new one.
776             m_process_sp->DisableWatchpoint(matched_sp.get(), notify);
777             m_watchpoint_list.Remove(matched_sp->GetID(), true);
778         }
779     }
780 
781     if (!wp_sp)
782     {
783         wp_sp.reset(new Watchpoint(*this, addr, size, type));
784         wp_sp->SetWatchpointType(kind, notify);
785         m_watchpoint_list.Add (wp_sp, true);
786     }
787 
788     error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify);
789     if (log)
790         log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n",
791                     __FUNCTION__,
792                     error.Success() ? "succeeded" : "failed",
793                     wp_sp->GetID());
794 
795     if (error.Fail())
796     {
797         // Enabling the watchpoint on the device side failed.
798         // Remove the said watchpoint from the list maintained by the target instance.
799         m_watchpoint_list.Remove (wp_sp->GetID(), true);
800         // See if we could provide more helpful error message.
801         if (!CheckIfWatchpointsExhausted(this, error))
802         {
803             if (!OptionGroupWatchpoint::IsWatchSizeSupported(size))
804                 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size);
805         }
806         wp_sp.reset();
807     }
808     else
809         m_last_created_watchpoint = wp_sp;
810     return wp_sp;
811 }
812 
813 void
814 Target::RemoveAllBreakpoints (bool internal_also)
815 {
816     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
817     if (log)
818         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
819 
820     m_breakpoint_list.RemoveAll (true);
821     if (internal_also)
822         m_internal_breakpoint_list.RemoveAll (false);
823 
824     m_last_created_breakpoint.reset();
825 }
826 
827 void
828 Target::DisableAllBreakpoints (bool internal_also)
829 {
830     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
831     if (log)
832         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
833 
834     m_breakpoint_list.SetEnabledAll (false);
835     if (internal_also)
836         m_internal_breakpoint_list.SetEnabledAll (false);
837 }
838 
839 void
840 Target::EnableAllBreakpoints (bool internal_also)
841 {
842     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
843     if (log)
844         log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no");
845 
846     m_breakpoint_list.SetEnabledAll (true);
847     if (internal_also)
848         m_internal_breakpoint_list.SetEnabledAll (true);
849 }
850 
851 bool
852 Target::RemoveBreakpointByID (break_id_t break_id)
853 {
854     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
855     if (log)
856         log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
857 
858     if (DisableBreakpointByID (break_id))
859     {
860         if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
861             m_internal_breakpoint_list.Remove(break_id, false);
862         else
863         {
864             if (m_last_created_breakpoint)
865             {
866                 if (m_last_created_breakpoint->GetID() == break_id)
867                     m_last_created_breakpoint.reset();
868             }
869             m_breakpoint_list.Remove(break_id, true);
870         }
871         return true;
872     }
873     return false;
874 }
875 
876 bool
877 Target::DisableBreakpointByID (break_id_t break_id)
878 {
879     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
880     if (log)
881         log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
882 
883     BreakpointSP bp_sp;
884 
885     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
886         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
887     else
888         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
889     if (bp_sp)
890     {
891         bp_sp->SetEnabled (false);
892         return true;
893     }
894     return false;
895 }
896 
897 bool
898 Target::EnableBreakpointByID (break_id_t break_id)
899 {
900     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
901     if (log)
902         log->Printf ("Target::%s (break_id = %i, internal = %s)\n",
903                      __FUNCTION__,
904                      break_id,
905                      LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no");
906 
907     BreakpointSP bp_sp;
908 
909     if (LLDB_BREAK_ID_IS_INTERNAL (break_id))
910         bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id);
911     else
912         bp_sp = m_breakpoint_list.FindBreakpointByID (break_id);
913 
914     if (bp_sp)
915     {
916         bp_sp->SetEnabled (true);
917         return true;
918     }
919     return false;
920 }
921 
922 // The flag 'end_to_end', default to true, signifies that the operation is
923 // performed end to end, for both the debugger and the debuggee.
924 
925 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end
926 // to end operations.
927 bool
928 Target::RemoveAllWatchpoints (bool end_to_end)
929 {
930     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
931     if (log)
932         log->Printf ("Target::%s\n", __FUNCTION__);
933 
934     if (!end_to_end) {
935         m_watchpoint_list.RemoveAll(true);
936         return true;
937     }
938 
939     // Otherwise, it's an end to end operation.
940 
941     if (!ProcessIsValid())
942         return false;
943 
944     size_t num_watchpoints = m_watchpoint_list.GetSize();
945     for (size_t i = 0; i < num_watchpoints; ++i)
946     {
947         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
948         if (!wp_sp)
949             return false;
950 
951         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
952         if (rc.Fail())
953             return false;
954     }
955     m_watchpoint_list.RemoveAll (true);
956     m_last_created_watchpoint.reset();
957     return true; // Success!
958 }
959 
960 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
961 // end operations.
962 bool
963 Target::DisableAllWatchpoints (bool end_to_end)
964 {
965     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
966     if (log)
967         log->Printf ("Target::%s\n", __FUNCTION__);
968 
969     if (!end_to_end) {
970         m_watchpoint_list.SetEnabledAll(false);
971         return true;
972     }
973 
974     // Otherwise, it's an end to end operation.
975 
976     if (!ProcessIsValid())
977         return false;
978 
979     size_t num_watchpoints = m_watchpoint_list.GetSize();
980     for (size_t i = 0; i < num_watchpoints; ++i)
981     {
982         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
983         if (!wp_sp)
984             return false;
985 
986         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
987         if (rc.Fail())
988             return false;
989     }
990     return true; // Success!
991 }
992 
993 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to
994 // end operations.
995 bool
996 Target::EnableAllWatchpoints (bool end_to_end)
997 {
998     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
999     if (log)
1000         log->Printf ("Target::%s\n", __FUNCTION__);
1001 
1002     if (!end_to_end) {
1003         m_watchpoint_list.SetEnabledAll(true);
1004         return true;
1005     }
1006 
1007     // Otherwise, it's an end to end operation.
1008 
1009     if (!ProcessIsValid())
1010         return false;
1011 
1012     size_t num_watchpoints = m_watchpoint_list.GetSize();
1013     for (size_t i = 0; i < num_watchpoints; ++i)
1014     {
1015         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1016         if (!wp_sp)
1017             return false;
1018 
1019         Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
1020         if (rc.Fail())
1021             return false;
1022     }
1023     return true; // Success!
1024 }
1025 
1026 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1027 bool
1028 Target::ClearAllWatchpointHitCounts ()
1029 {
1030     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1031     if (log)
1032         log->Printf ("Target::%s\n", __FUNCTION__);
1033 
1034     size_t num_watchpoints = m_watchpoint_list.GetSize();
1035     for (size_t i = 0; i < num_watchpoints; ++i)
1036     {
1037         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1038         if (!wp_sp)
1039             return false;
1040 
1041         wp_sp->ResetHitCount();
1042     }
1043     return true; // Success!
1044 }
1045 
1046 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1047 bool
1048 Target::ClearAllWatchpointHistoricValues ()
1049 {
1050     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1051     if (log)
1052         log->Printf ("Target::%s\n", __FUNCTION__);
1053 
1054     size_t num_watchpoints = m_watchpoint_list.GetSize();
1055     for (size_t i = 0; i < num_watchpoints; ++i)
1056     {
1057         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1058         if (!wp_sp)
1059             return false;
1060 
1061         wp_sp->ResetHistoricValues();
1062     }
1063     return true; // Success!
1064 }
1065 
1066 // Assumption: Caller holds the list mutex lock for m_watchpoint_list
1067 // during these operations.
1068 bool
1069 Target::IgnoreAllWatchpoints (uint32_t ignore_count)
1070 {
1071     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1072     if (log)
1073         log->Printf ("Target::%s\n", __FUNCTION__);
1074 
1075     if (!ProcessIsValid())
1076         return false;
1077 
1078     size_t num_watchpoints = m_watchpoint_list.GetSize();
1079     for (size_t i = 0; i < num_watchpoints; ++i)
1080     {
1081         WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i);
1082         if (!wp_sp)
1083             return false;
1084 
1085         wp_sp->SetIgnoreCount(ignore_count);
1086     }
1087     return true; // Success!
1088 }
1089 
1090 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1091 bool
1092 Target::DisableWatchpointByID (lldb::watch_id_t watch_id)
1093 {
1094     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1095     if (log)
1096         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1097 
1098     if (!ProcessIsValid())
1099         return false;
1100 
1101     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1102     if (wp_sp)
1103     {
1104         Error rc = m_process_sp->DisableWatchpoint(wp_sp.get());
1105         if (rc.Success())
1106             return true;
1107 
1108         // Else, fallthrough.
1109     }
1110     return false;
1111 }
1112 
1113 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1114 bool
1115 Target::EnableWatchpointByID (lldb::watch_id_t watch_id)
1116 {
1117     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1118     if (log)
1119         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1120 
1121     if (!ProcessIsValid())
1122         return false;
1123 
1124     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1125     if (wp_sp)
1126     {
1127         Error rc = m_process_sp->EnableWatchpoint(wp_sp.get());
1128         if (rc.Success())
1129             return true;
1130 
1131         // Else, fallthrough.
1132     }
1133     return false;
1134 }
1135 
1136 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1137 bool
1138 Target::RemoveWatchpointByID (lldb::watch_id_t watch_id)
1139 {
1140     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1141     if (log)
1142         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1143 
1144     WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id);
1145     if (watch_to_remove_sp == m_last_created_watchpoint)
1146         m_last_created_watchpoint.reset();
1147 
1148     if (DisableWatchpointByID (watch_id))
1149     {
1150         m_watchpoint_list.Remove(watch_id, true);
1151         return true;
1152     }
1153     return false;
1154 }
1155 
1156 // Assumption: Caller holds the list mutex lock for m_watchpoint_list.
1157 bool
1158 Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count)
1159 {
1160     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS));
1161     if (log)
1162         log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id);
1163 
1164     if (!ProcessIsValid())
1165         return false;
1166 
1167     WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id);
1168     if (wp_sp)
1169     {
1170         wp_sp->SetIgnoreCount(ignore_count);
1171         return true;
1172     }
1173     return false;
1174 }
1175 
1176 ModuleSP
1177 Target::GetExecutableModule ()
1178 {
1179     // search for the first executable in the module list
1180     for (size_t i = 0; i < m_images.GetSize(); ++i)
1181     {
1182         ModuleSP module_sp = m_images.GetModuleAtIndex (i);
1183         lldb_private::ObjectFile * obj = module_sp->GetObjectFile();
1184         if (obj == nullptr)
1185             continue;
1186         if (obj->GetType() == ObjectFile::Type::eTypeExecutable)
1187             return module_sp;
1188     }
1189     // as fall back return the first module loaded
1190     return m_images.GetModuleAtIndex (0);
1191 }
1192 
1193 Module*
1194 Target::GetExecutableModulePointer ()
1195 {
1196     return GetExecutableModule().get();
1197 }
1198 
1199 static void
1200 LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target)
1201 {
1202     Error error;
1203     StreamString feedback_stream;
1204     if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream))
1205     {
1206         if (error.AsCString())
1207             target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n",
1208                                                            module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1209                                                            error.AsCString());
1210     }
1211     if (feedback_stream.GetSize())
1212         target->GetDebugger().GetErrorFile()->Printf("%s\n",
1213                                                      feedback_stream.GetData());
1214 }
1215 
1216 void
1217 Target::ClearModules(bool delete_locations)
1218 {
1219     ModulesDidUnload (m_images, delete_locations);
1220     m_section_load_history.Clear();
1221     m_images.Clear();
1222     m_scratch_type_system_map.Clear();
1223     m_ast_importer_sp.reset();
1224 }
1225 
1226 void
1227 Target::DidExec ()
1228 {
1229     // When a process exec's we need to know about it so we can do some cleanup.
1230     m_breakpoint_list.RemoveInvalidLocations(m_arch);
1231     m_internal_breakpoint_list.RemoveInvalidLocations(m_arch);
1232 }
1233 
1234 void
1235 Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files)
1236 {
1237     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
1238     ClearModules(false);
1239 
1240     if (executable_sp)
1241     {
1242         Timer scoped_timer (__PRETTY_FUNCTION__,
1243                             "Target::SetExecutableModule (executable = '%s')",
1244                             executable_sp->GetFileSpec().GetPath().c_str());
1245 
1246         m_images.Append(executable_sp); // The first image is our executable file
1247 
1248         // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module.
1249         if (!m_arch.IsValid())
1250         {
1251             m_arch = executable_sp->GetArchitecture();
1252             if (log)
1253               log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1254         }
1255 
1256         FileSpecList dependent_files;
1257         ObjectFile *executable_objfile = executable_sp->GetObjectFile();
1258 
1259         if (executable_objfile && get_dependent_files)
1260         {
1261             executable_objfile->GetDependentModules(dependent_files);
1262             for (uint32_t i=0; i<dependent_files.GetSize(); i++)
1263             {
1264                 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i));
1265                 FileSpec platform_dependent_file_spec;
1266                 if (m_platform_sp)
1267                     m_platform_sp->GetFileWithUUID(dependent_file_spec, nullptr, platform_dependent_file_spec);
1268                 else
1269                     platform_dependent_file_spec = dependent_file_spec;
1270 
1271                 ModuleSpec module_spec (platform_dependent_file_spec, m_arch);
1272                 ModuleSP image_module_sp(GetSharedModule (module_spec));
1273                 if (image_module_sp)
1274                 {
1275                     ObjectFile *objfile = image_module_sp->GetObjectFile();
1276                     if (objfile)
1277                         objfile->GetDependentModules(dependent_files);
1278                 }
1279             }
1280         }
1281     }
1282 }
1283 
1284 bool
1285 Target::SetArchitecture (const ArchSpec &arch_spec)
1286 {
1287     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
1288     bool missing_local_arch = !m_arch.IsValid();
1289     bool replace_local_arch = true;
1290     bool compatible_local_arch = false;
1291     ArchSpec other(arch_spec);
1292 
1293     if (!missing_local_arch)
1294     {
1295         if (m_arch.IsCompatibleMatch(arch_spec))
1296         {
1297             other.MergeFrom(m_arch);
1298 
1299             if (m_arch.IsCompatibleMatch(other))
1300             {
1301                 compatible_local_arch = true;
1302                 bool arch_changed, vendor_changed, os_changed, os_ver_changed, env_changed;
1303 
1304                 m_arch.PiecewiseTripleCompare(other,
1305                                               arch_changed,
1306                                               vendor_changed,
1307                                               os_changed,
1308                                               os_ver_changed,
1309                                               env_changed);
1310 
1311                 if (!arch_changed && !vendor_changed && !os_changed && !env_changed)
1312                     replace_local_arch = false;
1313             }
1314         }
1315     }
1316 
1317     if (compatible_local_arch || missing_local_arch)
1318     {
1319         // If we haven't got a valid arch spec, or the architectures are compatible
1320         // update the architecture, unless the one we already have is more specified
1321         if (replace_local_arch)
1322             m_arch = other;
1323         if (log)
1324             log->Printf ("Target::SetArchitecture set architecture to %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str());
1325         return true;
1326     }
1327 
1328     // If we have an executable file, try to reset the executable to the desired architecture
1329     if (log)
1330       log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1331     m_arch = other;
1332     ModuleSP executable_sp = GetExecutableModule ();
1333 
1334     ClearModules(true);
1335     // Need to do something about unsetting breakpoints.
1336 
1337     if (executable_sp)
1338     {
1339         if (log)
1340           log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str());
1341         ModuleSpec module_spec (executable_sp->GetFileSpec(), other);
1342         Error error = ModuleList::GetSharedModule(module_spec,
1343                                                   executable_sp,
1344                                                   &GetExecutableSearchPaths(),
1345                                                   nullptr,
1346                                                   nullptr);
1347 
1348         if (!error.Fail() && executable_sp)
1349         {
1350             SetExecutableModule (executable_sp, true);
1351             return true;
1352         }
1353     }
1354     return false;
1355 }
1356 
1357 bool
1358 Target::MergeArchitecture (const ArchSpec &arch_spec)
1359 {
1360     if (arch_spec.IsValid())
1361     {
1362         if (m_arch.IsCompatibleMatch(arch_spec))
1363         {
1364             // The current target arch is compatible with "arch_spec", see if we
1365             // can improve our current architecture using bits from "arch_spec"
1366 
1367             // Merge bits from arch_spec into "merged_arch" and set our architecture
1368             ArchSpec merged_arch (m_arch);
1369             merged_arch.MergeFrom (arch_spec);
1370             return SetArchitecture(merged_arch);
1371         }
1372         else
1373         {
1374             // The new architecture is different, we just need to replace it
1375             return SetArchitecture(arch_spec);
1376         }
1377     }
1378     return false;
1379 }
1380 
1381 void
1382 Target::WillClearList (const ModuleList& module_list)
1383 {
1384 }
1385 
1386 void
1387 Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp)
1388 {
1389     // A module is being added to this target for the first time
1390     if (m_valid)
1391     {
1392         ModuleList my_module_list;
1393         my_module_list.Append(module_sp);
1394         LoadScriptingResourceForModule(module_sp, this);
1395         ModulesDidLoad (my_module_list);
1396     }
1397 }
1398 
1399 void
1400 Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp)
1401 {
1402     // A module is being removed from this target.
1403     if (m_valid)
1404     {
1405         ModuleList my_module_list;
1406         my_module_list.Append(module_sp);
1407         ModulesDidUnload (my_module_list, false);
1408     }
1409 }
1410 
1411 void
1412 Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp)
1413 {
1414     // A module is replacing an already added module
1415     if (m_valid)
1416     {
1417         m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
1418         m_internal_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp);
1419     }
1420 }
1421 
1422 void
1423 Target::ModulesDidLoad (ModuleList &module_list)
1424 {
1425     if (m_valid && module_list.GetSize())
1426     {
1427         m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1428         m_internal_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1429         if (m_process_sp)
1430         {
1431             m_process_sp->ModulesDidLoad (module_list);
1432         }
1433         BroadcastEvent (eBroadcastBitModulesLoaded, new TargetEventData (this->shared_from_this(), module_list));
1434     }
1435 }
1436 
1437 void
1438 Target::SymbolsDidLoad (ModuleList &module_list)
1439 {
1440     if (m_valid && module_list.GetSize())
1441     {
1442         if (m_process_sp)
1443         {
1444             LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
1445             if (runtime)
1446             {
1447                 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime;
1448                 objc_runtime->SymbolsDidLoad(module_list);
1449             }
1450         }
1451 
1452         m_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1453         m_internal_breakpoint_list.UpdateBreakpoints (module_list, true, false);
1454         BroadcastEvent (eBroadcastBitSymbolsLoaded, new TargetEventData (this->shared_from_this(), module_list));
1455     }
1456 }
1457 
1458 void
1459 Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations)
1460 {
1461     if (m_valid && module_list.GetSize())
1462     {
1463         UnloadModuleSections (module_list);
1464         m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
1465         m_internal_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations);
1466         BroadcastEvent (eBroadcastBitModulesUnloaded, new TargetEventData (this->shared_from_this(), module_list));
1467     }
1468 }
1469 
1470 bool
1471 Target::ModuleIsExcludedForUnconstrainedSearches (const FileSpec &module_file_spec)
1472 {
1473     if (GetBreakpointsConsultPlatformAvoidList())
1474     {
1475         ModuleList matchingModules;
1476         ModuleSpec module_spec (module_file_spec);
1477         size_t num_modules = GetImages().FindModules(module_spec, matchingModules);
1478 
1479         // If there is more than one module for this file spec, only return true if ALL the modules are on the
1480         // black list.
1481         if (num_modules > 0)
1482         {
1483             for (size_t i  = 0; i < num_modules; i++)
1484             {
1485                 if (!ModuleIsExcludedForUnconstrainedSearches (matchingModules.GetModuleAtIndex(i)))
1486                     return false;
1487             }
1488             return true;
1489         }
1490     }
1491     return false;
1492 }
1493 
1494 bool
1495 Target::ModuleIsExcludedForUnconstrainedSearches (const lldb::ModuleSP &module_sp)
1496 {
1497     if (GetBreakpointsConsultPlatformAvoidList())
1498     {
1499         if (m_platform_sp)
1500             return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches (*this, module_sp);
1501     }
1502     return false;
1503 }
1504 
1505 size_t
1506 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error)
1507 {
1508     SectionSP section_sp (addr.GetSection());
1509     if (section_sp)
1510     {
1511         // If the contents of this section are encrypted, the on-disk file is unusable.  Read only from live memory.
1512         if (section_sp->IsEncrypted())
1513         {
1514             error.SetErrorString("section is encrypted");
1515             return 0;
1516         }
1517         ModuleSP module_sp (section_sp->GetModule());
1518         if (module_sp)
1519         {
1520             ObjectFile *objfile = section_sp->GetModule()->GetObjectFile();
1521             if (objfile)
1522             {
1523                 size_t bytes_read = objfile->ReadSectionData (section_sp.get(),
1524                                                               addr.GetOffset(),
1525                                                               dst,
1526                                                               dst_len);
1527                 if (bytes_read > 0)
1528                     return bytes_read;
1529                 else
1530                     error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString());
1531             }
1532             else
1533                 error.SetErrorString("address isn't from a object file");
1534         }
1535         else
1536             error.SetErrorString("address isn't in a module");
1537     }
1538     else
1539         error.SetErrorString("address doesn't contain a section that points to a section in a object file");
1540 
1541     return 0;
1542 }
1543 
1544 size_t
1545 Target::ReadMemory (const Address& addr,
1546                     bool prefer_file_cache,
1547                     void *dst,
1548                     size_t dst_len,
1549                     Error &error,
1550                     lldb::addr_t *load_addr_ptr)
1551 {
1552     error.Clear();
1553 
1554     // if we end up reading this from process memory, we will fill this
1555     // with the actual load address
1556     if (load_addr_ptr)
1557         *load_addr_ptr = LLDB_INVALID_ADDRESS;
1558 
1559     size_t bytes_read = 0;
1560 
1561     addr_t load_addr = LLDB_INVALID_ADDRESS;
1562     addr_t file_addr = LLDB_INVALID_ADDRESS;
1563     Address resolved_addr;
1564     if (!addr.IsSectionOffset())
1565     {
1566         SectionLoadList &section_load_list = GetSectionLoadList();
1567         if (section_load_list.IsEmpty())
1568         {
1569             // No sections are loaded, so we must assume we are not running
1570             // yet and anything we are given is a file address.
1571             file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address
1572             m_images.ResolveFileAddress (file_addr, resolved_addr);
1573         }
1574         else
1575         {
1576             // We have at least one section loaded. This can be because
1577             // we have manually loaded some sections with "target modules load ..."
1578             // or because we have have a live process that has sections loaded
1579             // through the dynamic loader
1580             load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address
1581             section_load_list.ResolveLoadAddress (load_addr, resolved_addr);
1582         }
1583     }
1584     if (!resolved_addr.IsValid())
1585         resolved_addr = addr;
1586 
1587     if (prefer_file_cache)
1588     {
1589         bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1590         if (bytes_read > 0)
1591             return bytes_read;
1592     }
1593 
1594     if (ProcessIsValid())
1595     {
1596         if (load_addr == LLDB_INVALID_ADDRESS)
1597             load_addr = resolved_addr.GetLoadAddress (this);
1598 
1599         if (load_addr == LLDB_INVALID_ADDRESS)
1600         {
1601             ModuleSP addr_module_sp (resolved_addr.GetModule());
1602             if (addr_module_sp && addr_module_sp->GetFileSpec())
1603                 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded",
1604                                                addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknown>"),
1605                                                resolved_addr.GetFileAddress(),
1606                                                addr_module_sp->GetFileSpec().GetFilename().AsCString("<Unknonw>"));
1607             else
1608                 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress());
1609         }
1610         else
1611         {
1612             bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error);
1613             if (bytes_read != dst_len)
1614             {
1615                 if (error.Success())
1616                 {
1617                     if (bytes_read == 0)
1618                         error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr);
1619                     else
1620                         error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr);
1621                 }
1622             }
1623             if (bytes_read)
1624             {
1625                 if (load_addr_ptr)
1626                     *load_addr_ptr = load_addr;
1627                 return bytes_read;
1628             }
1629             // If the address is not section offset we have an address that
1630             // doesn't resolve to any address in any currently loaded shared
1631             // libraries and we failed to read memory so there isn't anything
1632             // more we can do. If it is section offset, we might be able to
1633             // read cached memory from the object file.
1634             if (!resolved_addr.IsSectionOffset())
1635                 return 0;
1636         }
1637     }
1638 
1639     if (!prefer_file_cache && resolved_addr.IsSectionOffset())
1640     {
1641         // If we didn't already try and read from the object file cache, then
1642         // try it after failing to read from the process.
1643         return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error);
1644     }
1645     return 0;
1646 }
1647 
1648 size_t
1649 Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error)
1650 {
1651     char buf[256];
1652     out_str.clear();
1653     addr_t curr_addr = addr.GetLoadAddress(this);
1654     Address address(addr);
1655     while (1)
1656     {
1657         size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error);
1658         if (length == 0)
1659             break;
1660         out_str.append(buf, length);
1661         // If we got "length - 1" bytes, we didn't get the whole C string, we
1662         // need to read some more characters
1663         if (length == sizeof(buf) - 1)
1664             curr_addr += length;
1665         else
1666             break;
1667         address = Address(curr_addr);
1668     }
1669     return out_str.size();
1670 }
1671 
1672 size_t
1673 Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error)
1674 {
1675     size_t total_cstr_len = 0;
1676     if (dst && dst_max_len)
1677     {
1678         result_error.Clear();
1679         // NULL out everything just to be safe
1680         memset (dst, 0, dst_max_len);
1681         Error error;
1682         addr_t curr_addr = addr.GetLoadAddress(this);
1683         Address address(addr);
1684 
1685         // We could call m_process_sp->GetMemoryCacheLineSize() but I don't
1686         // think this really needs to be tied to the memory cache subsystem's
1687         // cache line size, so leave this as a fixed constant.
1688         const size_t cache_line_size = 512;
1689 
1690         size_t bytes_left = dst_max_len - 1;
1691         char *curr_dst = dst;
1692 
1693         while (bytes_left > 0)
1694         {
1695             addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size);
1696             addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
1697             size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error);
1698 
1699             if (bytes_read == 0)
1700             {
1701                 result_error = error;
1702                 dst[total_cstr_len] = '\0';
1703                 break;
1704             }
1705             const size_t len = strlen(curr_dst);
1706 
1707             total_cstr_len += len;
1708 
1709             if (len < bytes_to_read)
1710                 break;
1711 
1712             curr_dst += bytes_read;
1713             curr_addr += bytes_read;
1714             bytes_left -= bytes_read;
1715             address = Address(curr_addr);
1716         }
1717     }
1718     else
1719     {
1720         if (dst == nullptr)
1721             result_error.SetErrorString("invalid arguments");
1722         else
1723             result_error.Clear();
1724     }
1725     return total_cstr_len;
1726 }
1727 
1728 size_t
1729 Target::ReadScalarIntegerFromMemory (const Address& addr,
1730                                      bool prefer_file_cache,
1731                                      uint32_t byte_size,
1732                                      bool is_signed,
1733                                      Scalar &scalar,
1734                                      Error &error)
1735 {
1736     uint64_t uval;
1737 
1738     if (byte_size <= sizeof(uval))
1739     {
1740         size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error);
1741         if (bytes_read == byte_size)
1742         {
1743             DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize());
1744             lldb::offset_t offset = 0;
1745             if (byte_size <= 4)
1746                 scalar = data.GetMaxU32 (&offset, byte_size);
1747             else
1748                 scalar = data.GetMaxU64 (&offset, byte_size);
1749 
1750             if (is_signed)
1751                 scalar.SignExtend(byte_size * 8);
1752             return bytes_read;
1753         }
1754     }
1755     else
1756     {
1757         error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size);
1758     }
1759     return 0;
1760 }
1761 
1762 uint64_t
1763 Target::ReadUnsignedIntegerFromMemory (const Address& addr,
1764                                        bool prefer_file_cache,
1765                                        size_t integer_byte_size,
1766                                        uint64_t fail_value,
1767                                        Error &error)
1768 {
1769     Scalar scalar;
1770     if (ReadScalarIntegerFromMemory (addr,
1771                                      prefer_file_cache,
1772                                      integer_byte_size,
1773                                      false,
1774                                      scalar,
1775                                      error))
1776         return scalar.ULongLong(fail_value);
1777     return fail_value;
1778 }
1779 
1780 bool
1781 Target::ReadPointerFromMemory (const Address& addr,
1782                                bool prefer_file_cache,
1783                                Error &error,
1784                                Address &pointer_addr)
1785 {
1786     Scalar scalar;
1787     if (ReadScalarIntegerFromMemory (addr,
1788                                      prefer_file_cache,
1789                                      m_arch.GetAddressByteSize(),
1790                                      false,
1791                                      scalar,
1792                                      error))
1793     {
1794         addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS);
1795         if (pointer_vm_addr != LLDB_INVALID_ADDRESS)
1796         {
1797             SectionLoadList &section_load_list = GetSectionLoadList();
1798             if (section_load_list.IsEmpty())
1799             {
1800                 // No sections are loaded, so we must assume we are not running
1801                 // yet and anything we are given is a file address.
1802                 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr);
1803             }
1804             else
1805             {
1806                 // We have at least one section loaded. This can be because
1807                 // we have manually loaded some sections with "target modules load ..."
1808                 // or because we have have a live process that has sections loaded
1809                 // through the dynamic loader
1810                 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr);
1811             }
1812             // We weren't able to resolve the pointer value, so just return
1813             // an address with no section
1814             if (!pointer_addr.IsValid())
1815                 pointer_addr.SetOffset (pointer_vm_addr);
1816             return true;
1817 
1818         }
1819     }
1820     return false;
1821 }
1822 
1823 ModuleSP
1824 Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr)
1825 {
1826     ModuleSP module_sp;
1827 
1828     Error error;
1829 
1830     // First see if we already have this module in our module list.  If we do, then we're done, we don't need
1831     // to consult the shared modules list.  But only do this if we are passed a UUID.
1832 
1833     if (module_spec.GetUUID().IsValid())
1834         module_sp = m_images.FindFirstModule(module_spec);
1835 
1836     if (!module_sp)
1837     {
1838         ModuleSP old_module_sp; // This will get filled in if we have a new version of the library
1839         bool did_create_module = false;
1840 
1841         // If there are image search path entries, try to use them first to acquire a suitable image.
1842         if (m_image_search_paths.GetSize())
1843         {
1844             ModuleSpec transformed_spec (module_spec);
1845             if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory()))
1846             {
1847                 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename();
1848                 error = ModuleList::GetSharedModule (transformed_spec,
1849                                                      module_sp,
1850                                                      &GetExecutableSearchPaths(),
1851                                                      &old_module_sp,
1852                                                      &did_create_module);
1853             }
1854         }
1855 
1856         if (!module_sp)
1857         {
1858             // If we have a UUID, we can check our global shared module list in case
1859             // we already have it. If we don't have a valid UUID, then we can't since
1860             // the path in "module_spec" will be a platform path, and we will need to
1861             // let the platform find that file. For example, we could be asking for
1862             // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick
1863             // the local copy of "/usr/lib/dyld" since our platform could be a remote
1864             // platform that has its own "/usr/lib/dyld" in an SDK or in a local file
1865             // cache.
1866             if (module_spec.GetUUID().IsValid())
1867             {
1868                 // We have a UUID, it is OK to check the global module list...
1869                 error = ModuleList::GetSharedModule (module_spec,
1870                                                      module_sp,
1871                                                      &GetExecutableSearchPaths(),
1872                                                      &old_module_sp,
1873                                                      &did_create_module);
1874             }
1875 
1876             if (!module_sp)
1877             {
1878                 // The platform is responsible for finding and caching an appropriate
1879                 // module in the shared module cache.
1880                 if (m_platform_sp)
1881                 {
1882                     error = m_platform_sp->GetSharedModule (module_spec,
1883                                                             m_process_sp.get(),
1884                                                             module_sp,
1885                                                             &GetExecutableSearchPaths(),
1886                                                             &old_module_sp,
1887                                                             &did_create_module);
1888                 }
1889                 else
1890                 {
1891                     error.SetErrorString("no platform is currently set");
1892                 }
1893             }
1894         }
1895 
1896         // We found a module that wasn't in our target list.  Let's make sure that there wasn't an equivalent
1897         // module in the list already, and if there was, let's remove it.
1898         if (module_sp)
1899         {
1900             ObjectFile *objfile = module_sp->GetObjectFile();
1901             if (objfile)
1902             {
1903                 switch (objfile->GetType())
1904                 {
1905                     case ObjectFile::eTypeCoreFile:      /// A core file that has a checkpoint of a program's execution state
1906                     case ObjectFile::eTypeExecutable:    /// A normal executable
1907                     case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable
1908                     case ObjectFile::eTypeObjectFile:    /// An intermediate object file
1909                     case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution
1910                         break;
1911                     case ObjectFile::eTypeDebugInfo:     /// An object file that contains only debug information
1912                         if (error_ptr)
1913                             error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable");
1914                         return ModuleSP();
1915                     case ObjectFile::eTypeStubLibrary:   /// A library that can be linked against but not used for execution
1916                         if (error_ptr)
1917                             error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable");
1918                         return ModuleSP();
1919                     default:
1920                         if (error_ptr)
1921                             error_ptr->SetErrorString("unsupported file type, please specify an executable");
1922                         return ModuleSP();
1923                 }
1924                 // GetSharedModule is not guaranteed to find the old shared module, for instance
1925                 // in the common case where you pass in the UUID, it is only going to find the one
1926                 // module matching the UUID.  In fact, it has no good way to know what the "old module"
1927                 // relevant to this target is, since there might be many copies of a module with this file spec
1928                 // in various running debug sessions, but only one of them will belong to this target.
1929                 // So let's remove the UUID from the module list, and look in the target's module list.
1930                 // Only do this if there is SOMETHING else in the module spec...
1931                 if (!old_module_sp)
1932                 {
1933                     if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty())
1934                     {
1935                         ModuleSpec module_spec_copy(module_spec.GetFileSpec());
1936                         module_spec_copy.GetUUID().Clear();
1937 
1938                         ModuleList found_modules;
1939                         size_t num_found = m_images.FindModules (module_spec_copy, found_modules);
1940                         if (num_found == 1)
1941                         {
1942                             old_module_sp = found_modules.GetModuleAtIndex(0);
1943                         }
1944                     }
1945                 }
1946 
1947                 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32)
1948                 {
1949                     m_images.ReplaceModule(old_module_sp, module_sp);
1950                     Module *old_module_ptr = old_module_sp.get();
1951                     old_module_sp.reset();
1952                     ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr);
1953                 }
1954                 else
1955                     m_images.Append(module_sp);
1956             }
1957             else
1958                 module_sp.reset();
1959         }
1960     }
1961     if (error_ptr)
1962         *error_ptr = error;
1963     return module_sp;
1964 }
1965 
1966 TargetSP
1967 Target::CalculateTarget ()
1968 {
1969     return shared_from_this();
1970 }
1971 
1972 ProcessSP
1973 Target::CalculateProcess ()
1974 {
1975     return m_process_sp;
1976 }
1977 
1978 ThreadSP
1979 Target::CalculateThread ()
1980 {
1981     return ThreadSP();
1982 }
1983 
1984 StackFrameSP
1985 Target::CalculateStackFrame ()
1986 {
1987     return StackFrameSP();
1988 }
1989 
1990 void
1991 Target::CalculateExecutionContext (ExecutionContext &exe_ctx)
1992 {
1993     exe_ctx.Clear();
1994     exe_ctx.SetTargetPtr(this);
1995 }
1996 
1997 PathMappingList &
1998 Target::GetImageSearchPathList ()
1999 {
2000     return m_image_search_paths;
2001 }
2002 
2003 void
2004 Target::ImageSearchPathsChanged(const PathMappingList &path_list,
2005                                 void *baton)
2006 {
2007     Target *target = (Target *)baton;
2008     ModuleSP exe_module_sp (target->GetExecutableModule());
2009     if (exe_module_sp)
2010         target->SetExecutableModule (exe_module_sp, true);
2011 }
2012 
2013 TypeSystem *
2014 Target::GetScratchTypeSystemForLanguage (Error *error, lldb::LanguageType language, bool create_on_demand)
2015 {
2016     if (!m_valid)
2017         return nullptr;
2018 
2019     if (error)
2020     {
2021         error->Clear();
2022     }
2023 
2024     if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all assembly code
2025         || language == eLanguageTypeUnknown)
2026     {
2027         std::set<lldb::LanguageType> languages_for_types;
2028         std::set<lldb::LanguageType> languages_for_expressions;
2029 
2030         Language::GetLanguagesSupportingTypeSystems(languages_for_types, languages_for_expressions);
2031 
2032         if (languages_for_expressions.count(eLanguageTypeC))
2033         {
2034             language = eLanguageTypeC; // LLDB's default.  Override by setting the target language.
2035         }
2036         else
2037         {
2038             if (languages_for_expressions.empty())
2039             {
2040                 return nullptr;
2041             }
2042             else
2043             {
2044                 language = *languages_for_expressions.begin();
2045             }
2046         }
2047     }
2048 
2049     return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, create_on_demand);
2050 }
2051 
2052 PersistentExpressionState *
2053 Target::GetPersistentExpressionStateForLanguage (lldb::LanguageType language)
2054 {
2055     TypeSystem *type_system = GetScratchTypeSystemForLanguage(nullptr, language, true);
2056 
2057     if (type_system)
2058     {
2059         return type_system->GetPersistentExpressionState();
2060     }
2061     else
2062     {
2063         return nullptr;
2064     }
2065 }
2066 
2067 UserExpression *
2068 Target::GetUserExpressionForLanguage(const char *expr,
2069                                      const char *expr_prefix,
2070                                      lldb::LanguageType language,
2071                                      Expression::ResultType desired_type,
2072                                      const EvaluateExpressionOptions &options,
2073                                      Error &error)
2074 {
2075     Error type_system_error;
2076 
2077     TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
2078     UserExpression *user_expr = nullptr;
2079 
2080     if (!type_system)
2081     {
2082         error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
2083         return nullptr;
2084     }
2085 
2086     user_expr = type_system->GetUserExpression(expr, expr_prefix, language, desired_type, options);
2087     if (!user_expr)
2088         error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2089 
2090     return user_expr;
2091 }
2092 
2093 FunctionCaller *
2094 Target::GetFunctionCallerForLanguage (lldb::LanguageType language,
2095                                       const CompilerType &return_type,
2096                                       const Address& function_address,
2097                                       const ValueList &arg_value_list,
2098                                       const char *name,
2099                                       Error &error)
2100 {
2101     Error type_system_error;
2102     TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
2103     FunctionCaller *persistent_fn = nullptr;
2104 
2105     if (!type_system)
2106     {
2107         error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
2108         return persistent_fn;
2109     }
2110 
2111     persistent_fn = type_system->GetFunctionCaller (return_type, function_address, arg_value_list, name);
2112     if (!persistent_fn)
2113         error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2114 
2115     return persistent_fn;
2116 }
2117 
2118 UtilityFunction *
2119 Target::GetUtilityFunctionForLanguage (const char *text,
2120                                        lldb::LanguageType language,
2121                                        const char *name,
2122                                        Error &error)
2123 {
2124     Error type_system_error;
2125     TypeSystem *type_system = GetScratchTypeSystemForLanguage (&type_system_error, language);
2126     UtilityFunction *utility_fn = nullptr;
2127 
2128     if (!type_system)
2129     {
2130         error.SetErrorStringWithFormat("Could not find type system for language %s: %s", Language::GetNameForLanguageType(language), type_system_error.AsCString());
2131         return utility_fn;
2132     }
2133 
2134     utility_fn = type_system->GetUtilityFunction (text, name);
2135     if (!utility_fn)
2136         error.SetErrorStringWithFormat("Could not create an expression for language %s", Language::GetNameForLanguageType(language));
2137 
2138     return utility_fn;
2139 }
2140 
2141 ClangASTContext *
2142 Target::GetScratchClangASTContext(bool create_on_demand)
2143 {
2144     if (m_valid)
2145     {
2146         if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC, create_on_demand))
2147             return llvm::dyn_cast<ClangASTContext>(type_system);
2148     }
2149     return nullptr;
2150 }
2151 
2152 ClangASTImporterSP
2153 Target::GetClangASTImporter()
2154 {
2155     if (m_valid)
2156     {
2157         if (!m_ast_importer_sp)
2158         {
2159             m_ast_importer_sp.reset(new ClangASTImporter());
2160         }
2161         return m_ast_importer_sp;
2162     }
2163     return ClangASTImporterSP();
2164 }
2165 
2166 void
2167 Target::SettingsInitialize ()
2168 {
2169     Process::SettingsInitialize ();
2170 }
2171 
2172 void
2173 Target::SettingsTerminate ()
2174 {
2175     Process::SettingsTerminate ();
2176 }
2177 
2178 FileSpecList
2179 Target::GetDefaultExecutableSearchPaths ()
2180 {
2181     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2182     if (properties_sp)
2183         return properties_sp->GetExecutableSearchPaths();
2184     return FileSpecList();
2185 }
2186 
2187 FileSpecList
2188 Target::GetDefaultDebugFileSearchPaths ()
2189 {
2190     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2191     if (properties_sp)
2192         return properties_sp->GetDebugFileSearchPaths();
2193     return FileSpecList();
2194 }
2195 
2196 FileSpecList
2197 Target::GetDefaultClangModuleSearchPaths ()
2198 {
2199     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2200     if (properties_sp)
2201         return properties_sp->GetClangModuleSearchPaths();
2202     return FileSpecList();
2203 }
2204 
2205 ArchSpec
2206 Target::GetDefaultArchitecture ()
2207 {
2208     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2209     if (properties_sp)
2210         return properties_sp->GetDefaultArchitecture();
2211     return ArchSpec();
2212 }
2213 
2214 void
2215 Target::SetDefaultArchitecture (const ArchSpec &arch)
2216 {
2217     TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
2218     if (properties_sp)
2219     {
2220         LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to  %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str());
2221         return properties_sp->SetDefaultArchitecture(arch);
2222     }
2223 }
2224 
2225 Target *
2226 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr)
2227 {
2228     // The target can either exist in the "process" of ExecutionContext, or in
2229     // the "target_sp" member of SymbolContext. This accessor helper function
2230     // will get the target from one of these locations.
2231 
2232     Target *target = nullptr;
2233     if (sc_ptr != nullptr)
2234         target = sc_ptr->target_sp.get();
2235     if (target == nullptr && exe_ctx_ptr)
2236         target = exe_ctx_ptr->GetTargetPtr();
2237     return target;
2238 }
2239 
2240 ExpressionResults
2241 Target::EvaluateExpression(const char *expr_cstr,
2242                            ExecutionContextScope *exe_scope,
2243                            lldb::ValueObjectSP &result_valobj_sp,
2244                            const EvaluateExpressionOptions& options,
2245                            std::string *fixed_expression)
2246 {
2247     result_valobj_sp.reset();
2248 
2249     ExpressionResults execution_results = eExpressionSetupError;
2250 
2251     if (expr_cstr == nullptr || expr_cstr[0] == '\0')
2252         return execution_results;
2253 
2254     // We shouldn't run stop hooks in expressions.
2255     // Be sure to reset this if you return anywhere within this function.
2256     bool old_suppress_value = m_suppress_stop_hooks;
2257     m_suppress_stop_hooks = true;
2258 
2259     ExecutionContext exe_ctx;
2260 
2261     if (exe_scope)
2262     {
2263         exe_scope->CalculateExecutionContext(exe_ctx);
2264     }
2265     else if (m_process_sp)
2266     {
2267         m_process_sp->CalculateExecutionContext(exe_ctx);
2268     }
2269     else
2270     {
2271         CalculateExecutionContext(exe_ctx);
2272     }
2273 
2274     // Make sure we aren't just trying to see the value of a persistent
2275     // variable (something like "$0")
2276     lldb::ExpressionVariableSP persistent_var_sp;
2277     // Only check for persistent variables the expression starts with a '$'
2278     if (expr_cstr[0] == '$')
2279         persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC)->GetPersistentExpressionState()->GetVariable (expr_cstr);
2280 
2281     if (persistent_var_sp)
2282     {
2283         result_valobj_sp = persistent_var_sp->GetValueObject ();
2284         execution_results = eExpressionCompleted;
2285     }
2286     else
2287     {
2288         const char *prefix = GetExpressionPrefixContentsAsCString();
2289         Error error;
2290         execution_results = UserExpression::Evaluate (exe_ctx,
2291                                                       options,
2292                                                       expr_cstr,
2293                                                       prefix,
2294                                                       result_valobj_sp,
2295                                                       error,
2296                                                       0, // Line Number
2297                                                       fixed_expression);
2298     }
2299 
2300     m_suppress_stop_hooks = old_suppress_value;
2301 
2302     return execution_results;
2303 }
2304 
2305 lldb::ExpressionVariableSP
2306 Target::GetPersistentVariable(const ConstString &name)
2307 {
2308     lldb::ExpressionVariableSP variable_sp;
2309     m_scratch_type_system_map.ForEach([this, name, &variable_sp](TypeSystem *type_system) -> bool
2310     {
2311         if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
2312         {
2313             variable_sp = persistent_state->GetVariable(name);
2314 
2315             if (variable_sp)
2316                 return false;   // Stop iterating the ForEach
2317         }
2318         return true;    // Keep iterating the ForEach
2319     });
2320     return variable_sp;
2321 }
2322 
2323 lldb::addr_t
2324 Target::GetPersistentSymbol(const ConstString &name)
2325 {
2326     lldb::addr_t address = LLDB_INVALID_ADDRESS;
2327 
2328     m_scratch_type_system_map.ForEach([this, name, &address](TypeSystem *type_system) -> bool
2329     {
2330         if (PersistentExpressionState *persistent_state = type_system->GetPersistentExpressionState())
2331         {
2332             address = persistent_state->LookupSymbol(name);
2333             if (address != LLDB_INVALID_ADDRESS)
2334                 return false;   // Stop iterating the ForEach
2335         }
2336         return true;    // Keep iterating the ForEach
2337     });
2338     return address;
2339 }
2340 
2341 lldb::addr_t
2342 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2343 {
2344     addr_t code_addr = load_addr;
2345     switch (m_arch.GetMachine())
2346     {
2347     case llvm::Triple::mips:
2348     case llvm::Triple::mipsel:
2349     case llvm::Triple::mips64:
2350     case llvm::Triple::mips64el:
2351         switch (addr_class)
2352         {
2353         case eAddressClassData:
2354         case eAddressClassDebug:
2355             return LLDB_INVALID_ADDRESS;
2356 
2357         case eAddressClassUnknown:
2358         case eAddressClassInvalid:
2359         case eAddressClassCode:
2360         case eAddressClassCodeAlternateISA:
2361         case eAddressClassRuntime:
2362             if ((code_addr & 2ull) || (addr_class == eAddressClassCodeAlternateISA))
2363                 code_addr |= 1ull;
2364             break;
2365         }
2366         break;
2367 
2368     case llvm::Triple::arm:
2369     case llvm::Triple::thumb:
2370         switch (addr_class)
2371         {
2372         case eAddressClassData:
2373         case eAddressClassDebug:
2374             return LLDB_INVALID_ADDRESS;
2375 
2376         case eAddressClassUnknown:
2377         case eAddressClassInvalid:
2378         case eAddressClassCode:
2379         case eAddressClassCodeAlternateISA:
2380         case eAddressClassRuntime:
2381             // Check if bit zero it no set?
2382             if ((code_addr & 1ull) == 0)
2383             {
2384                 // Bit zero isn't set, check if the address is a multiple of 2?
2385                 if (code_addr & 2ull)
2386                 {
2387                     // The address is a multiple of 2 so it must be thumb, set bit zero
2388                     code_addr |= 1ull;
2389                 }
2390                 else if (addr_class == eAddressClassCodeAlternateISA)
2391                 {
2392                     // We checked the address and the address claims to be the alternate ISA
2393                     // which means thumb, so set bit zero.
2394                     code_addr |= 1ull;
2395                 }
2396             }
2397             break;
2398         }
2399         break;
2400 
2401     default:
2402         break;
2403     }
2404     return code_addr;
2405 }
2406 
2407 lldb::addr_t
2408 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const
2409 {
2410     addr_t opcode_addr = load_addr;
2411     switch (m_arch.GetMachine())
2412     {
2413     case llvm::Triple::mips:
2414     case llvm::Triple::mipsel:
2415     case llvm::Triple::mips64:
2416     case llvm::Triple::mips64el:
2417     case llvm::Triple::arm:
2418     case llvm::Triple::thumb:
2419         switch (addr_class)
2420         {
2421         case eAddressClassData:
2422         case eAddressClassDebug:
2423             return LLDB_INVALID_ADDRESS;
2424 
2425         case eAddressClassInvalid:
2426         case eAddressClassUnknown:
2427         case eAddressClassCode:
2428         case eAddressClassCodeAlternateISA:
2429         case eAddressClassRuntime:
2430             opcode_addr &= ~(1ull);
2431             break;
2432         }
2433         break;
2434 
2435     default:
2436         break;
2437     }
2438     return opcode_addr;
2439 }
2440 
2441 lldb::addr_t
2442 Target::GetBreakableLoadAddress (lldb::addr_t addr)
2443 {
2444     addr_t breakable_addr = addr;
2445     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
2446 
2447     switch (m_arch.GetMachine())
2448     {
2449     default:
2450         break;
2451     case llvm::Triple::mips:
2452     case llvm::Triple::mipsel:
2453     case llvm::Triple::mips64:
2454     case llvm::Triple::mips64el:
2455     {
2456         addr_t function_start = 0;
2457         addr_t current_offset = 0;
2458         uint32_t loop_count = 0;
2459         Address resolved_addr;
2460         uint32_t arch_flags = m_arch.GetFlags ();
2461         bool IsMips16 = arch_flags & ArchSpec::eMIPSAse_mips16;
2462         bool IsMicromips = arch_flags & ArchSpec::eMIPSAse_micromips;
2463         SectionLoadList &section_load_list = GetSectionLoadList();
2464 
2465         if (section_load_list.IsEmpty())
2466             // No sections are loaded, so we must assume we are not running yet
2467             // and need to operate only on file address.
2468             m_images.ResolveFileAddress (addr, resolved_addr);
2469         else
2470             section_load_list.ResolveLoadAddress(addr, resolved_addr);
2471 
2472         // Get the function boundaries to make sure we don't scan back before the beginning of the current function.
2473         ModuleSP temp_addr_module_sp (resolved_addr.GetModule());
2474         if (temp_addr_module_sp)
2475         {
2476             SymbolContext sc;
2477             uint32_t resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
2478             temp_addr_module_sp->ResolveSymbolContextForAddress(resolved_addr, resolve_scope, sc);
2479             Address sym_addr;
2480             if (sc.function)
2481                 sym_addr = sc.function->GetAddressRange().GetBaseAddress();
2482             else if (sc.symbol)
2483                 sym_addr = sc.symbol->GetAddress();
2484 
2485             function_start = sym_addr.GetLoadAddress(this);
2486             if (function_start == LLDB_INVALID_ADDRESS)
2487                 function_start = sym_addr.GetFileAddress();
2488 
2489             if (function_start)
2490                 current_offset = addr - function_start;
2491         }
2492 
2493         // If breakpoint address is start of function then we dont have to do anything.
2494         if (current_offset == 0)
2495             return breakable_addr;
2496         else
2497             loop_count = current_offset / 2;
2498 
2499         if (loop_count > 3)
2500         {
2501             // Scan previous 6 bytes
2502             if (IsMips16 | IsMicromips)
2503                 loop_count = 3;
2504             // For mips-only, instructions are always 4 bytes, so scan previous 4 bytes only.
2505             else
2506                 loop_count = 2;
2507         }
2508 
2509         // Create Disassembler Instance
2510         lldb::DisassemblerSP disasm_sp(Disassembler::FindPlugin(m_arch, nullptr, nullptr));
2511 
2512         ExecutionContext exe_ctx;
2513         CalculateExecutionContext(exe_ctx);
2514         InstructionList instruction_list;
2515         InstructionSP prev_insn;
2516         bool prefer_file_cache = true; // Read from file
2517         uint32_t inst_to_choose = 0;
2518 
2519         for (uint32_t i = 1; i <= loop_count; i++)
2520         {
2521             // Adjust the address to read from.
2522             resolved_addr.Slide (-2);
2523             AddressRange range(resolved_addr, i*2);
2524             uint32_t insn_size = 0;
2525 
2526             disasm_sp->ParseInstructions(&exe_ctx, range, nullptr, prefer_file_cache);
2527 
2528             uint32_t num_insns = disasm_sp->GetInstructionList().GetSize();
2529             if (num_insns)
2530             {
2531                 prev_insn = disasm_sp->GetInstructionList().GetInstructionAtIndex(0);
2532                 insn_size = prev_insn->GetOpcode().GetByteSize();
2533                 if (i == 1 && insn_size == 2)
2534                 {
2535                     // This looks like a valid 2-byte instruction (but it could be a part of upper 4 byte instruction).
2536                     instruction_list.Append(prev_insn);
2537                     inst_to_choose = 1;
2538                 }
2539                 else if (i == 2)
2540                 {
2541                     // Here we may get one 4-byte instruction or two 2-byte instructions.
2542                     if (num_insns == 2)
2543                     {
2544                         // Looks like there are two 2-byte instructions above our breakpoint target address.
2545                         // Now the upper 2-byte instruction is either a valid 2-byte instruction or could be a part of it's upper 4-byte instruction.
2546                         // In both cases we don't care because in this case lower 2-byte instruction is definitely a valid instruction
2547                         // and whatever i=1 iteration has found out is true.
2548                         inst_to_choose = 1;
2549                         break;
2550                     }
2551                     else if (insn_size == 4)
2552                     {
2553                         // This instruction claims its a valid 4-byte instruction. But it could be a part of it's upper 4-byte instruction.
2554                         // Lets try scanning upper 2 bytes to verify this.
2555                         instruction_list.Append(prev_insn);
2556                         inst_to_choose = 2;
2557                     }
2558                 }
2559                 else if (i == 3)
2560                 {
2561                     if (insn_size == 4)
2562                         // FIXME: We reached here that means instruction at [target - 4] has already claimed to be a 4-byte instruction,
2563                         // and now instruction at [target - 6] is also claiming that it's a 4-byte instruction. This can not be true.
2564                         // In this case we can not decide the valid previous instruction so we let lldb set the breakpoint at the address given by user.
2565                         inst_to_choose = 0;
2566                     else
2567                         // This is straight-forward
2568                         inst_to_choose = 2;
2569                     break;
2570                 }
2571             }
2572             else
2573             {
2574                 // Decode failed, bytes do not form a valid instruction. So whatever previous iteration has found out is true.
2575                 if (i > 1)
2576                 {
2577                     inst_to_choose = i - 1;
2578                     break;
2579                 }
2580             }
2581         }
2582 
2583         // Check if we are able to find any valid instruction.
2584         if (inst_to_choose)
2585         {
2586             if (inst_to_choose > instruction_list.GetSize())
2587                 inst_to_choose--;
2588             prev_insn = instruction_list.GetInstructionAtIndex(inst_to_choose - 1);
2589 
2590             if (prev_insn->HasDelaySlot())
2591             {
2592                 uint32_t shift_size = prev_insn->GetOpcode().GetByteSize();
2593                 // Adjust the breakable address
2594                 breakable_addr = addr - shift_size;
2595                 if (log)
2596                     log->Printf ("Target::%s Breakpoint at 0x%8.8" PRIx64 " is adjusted to 0x%8.8" PRIx64 " due to delay slot\n", __FUNCTION__, addr, breakable_addr);
2597             }
2598         }
2599         break;
2600     }
2601     }
2602     return breakable_addr;
2603 }
2604 
2605 SourceManager &
2606 Target::GetSourceManager ()
2607 {
2608     if (!m_source_manager_ap)
2609         m_source_manager_ap.reset (new SourceManager(shared_from_this()));
2610     return *m_source_manager_ap;
2611 }
2612 
2613 ClangModulesDeclVendor *
2614 Target::GetClangModulesDeclVendor ()
2615 {
2616     static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended we can make it per-target
2617 
2618     {
2619         std::lock_guard<std::mutex> guard(s_clang_modules_decl_vendor_mutex);
2620 
2621         if (!m_clang_modules_decl_vendor_ap)
2622         {
2623             m_clang_modules_decl_vendor_ap.reset(ClangModulesDeclVendor::Create(*this));
2624         }
2625     }
2626 
2627     return m_clang_modules_decl_vendor_ap.get();
2628 }
2629 
2630 Target::StopHookSP
2631 Target::CreateStopHook ()
2632 {
2633     lldb::user_id_t new_uid = ++m_stop_hook_next_id;
2634     Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid));
2635     m_stop_hooks[new_uid] = stop_hook_sp;
2636     return stop_hook_sp;
2637 }
2638 
2639 bool
2640 Target::RemoveStopHookByID (lldb::user_id_t user_id)
2641 {
2642     size_t num_removed = m_stop_hooks.erase(user_id);
2643     return (num_removed != 0);
2644 }
2645 
2646 void
2647 Target::RemoveAllStopHooks ()
2648 {
2649     m_stop_hooks.clear();
2650 }
2651 
2652 Target::StopHookSP
2653 Target::GetStopHookByID (lldb::user_id_t user_id)
2654 {
2655     StopHookSP found_hook;
2656 
2657     StopHookCollection::iterator specified_hook_iter;
2658     specified_hook_iter = m_stop_hooks.find (user_id);
2659     if (specified_hook_iter != m_stop_hooks.end())
2660         found_hook = (*specified_hook_iter).second;
2661     return found_hook;
2662 }
2663 
2664 bool
2665 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state)
2666 {
2667     StopHookCollection::iterator specified_hook_iter;
2668     specified_hook_iter = m_stop_hooks.find (user_id);
2669     if (specified_hook_iter == m_stop_hooks.end())
2670         return false;
2671 
2672     (*specified_hook_iter).second->SetIsActive (active_state);
2673     return true;
2674 }
2675 
2676 void
2677 Target::SetAllStopHooksActiveState (bool active_state)
2678 {
2679     StopHookCollection::iterator pos, end = m_stop_hooks.end();
2680     for (pos = m_stop_hooks.begin(); pos != end; pos++)
2681     {
2682         (*pos).second->SetIsActive (active_state);
2683     }
2684 }
2685 
2686 void
2687 Target::RunStopHooks ()
2688 {
2689     if (m_suppress_stop_hooks)
2690         return;
2691 
2692     if (!m_process_sp)
2693         return;
2694 
2695     // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression
2696     // since in that case we do not want to run the stop-hooks
2697     if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression())
2698         return;
2699 
2700     if (m_stop_hooks.empty())
2701         return;
2702 
2703     StopHookCollection::iterator pos, end = m_stop_hooks.end();
2704 
2705     // If there aren't any active stop hooks, don't bother either:
2706     bool any_active_hooks = false;
2707     for (pos = m_stop_hooks.begin(); pos != end; pos++)
2708     {
2709         if ((*pos).second->IsActive())
2710         {
2711             any_active_hooks = true;
2712             break;
2713         }
2714     }
2715     if (!any_active_hooks)
2716         return;
2717 
2718     CommandReturnObject result;
2719 
2720     std::vector<ExecutionContext> exc_ctx_with_reasons;
2721     std::vector<SymbolContext> sym_ctx_with_reasons;
2722 
2723     ThreadList &cur_threadlist = m_process_sp->GetThreadList();
2724     size_t num_threads = cur_threadlist.GetSize();
2725     for (size_t i = 0; i < num_threads; i++)
2726     {
2727         lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i);
2728         if (cur_thread_sp->ThreadStoppedForAReason())
2729         {
2730             lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0);
2731             exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get()));
2732             sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything));
2733         }
2734     }
2735 
2736     // If no threads stopped for a reason, don't run the stop-hooks.
2737     size_t num_exe_ctx = exc_ctx_with_reasons.size();
2738     if (num_exe_ctx == 0)
2739         return;
2740 
2741     result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream());
2742     result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream());
2743 
2744     bool keep_going = true;
2745     bool hooks_ran = false;
2746     bool print_hook_header = (m_stop_hooks.size() != 1);
2747     bool print_thread_header = (num_exe_ctx != 1);
2748 
2749     for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++)
2750     {
2751         // result.Clear();
2752         StopHookSP cur_hook_sp = (*pos).second;
2753         if (!cur_hook_sp->IsActive())
2754             continue;
2755 
2756         bool any_thread_matched = false;
2757         for (size_t i = 0; keep_going && i < num_exe_ctx; i++)
2758         {
2759             if ((cur_hook_sp->GetSpecifier() == nullptr
2760                   || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i]))
2761                 && (cur_hook_sp->GetThreadSpecifier() == nullptr
2762                     || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef())))
2763             {
2764                 if (!hooks_ran)
2765                 {
2766                     hooks_ran = true;
2767                 }
2768                 if (print_hook_header && !any_thread_matched)
2769                 {
2770                     const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ?
2771                                        cur_hook_sp->GetCommands().GetStringAtIndex(0) :
2772                                        nullptr);
2773                     if (cmd)
2774                         result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd);
2775                     else
2776                         result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID());
2777                     any_thread_matched = true;
2778                 }
2779 
2780                 if (print_thread_header)
2781                     result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID());
2782 
2783                 CommandInterpreterRunOptions options;
2784                 options.SetStopOnContinue (true);
2785                 options.SetStopOnError (true);
2786                 options.SetEchoCommands (false);
2787                 options.SetPrintResults (true);
2788                 options.SetAddToHistory (false);
2789 
2790                 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(),
2791                                                                       &exc_ctx_with_reasons[i],
2792                                                                       options,
2793                                                                       result);
2794 
2795                 // If the command started the target going again, we should bag out of
2796                 // running the stop hooks.
2797                 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) ||
2798                     (result.GetStatus() == eReturnStatusSuccessContinuingResult))
2799                 {
2800                     result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID());
2801                     keep_going = false;
2802                 }
2803             }
2804         }
2805     }
2806 
2807     result.GetImmediateOutputStream()->Flush();
2808     result.GetImmediateErrorStream()->Flush();
2809 }
2810 
2811 const TargetPropertiesSP &
2812 Target::GetGlobalProperties()
2813 {
2814     // NOTE: intentional leak so we don't crash if global destructor chain gets
2815     // called as other threads still use the result of this function
2816     static TargetPropertiesSP *g_settings_sp_ptr = nullptr;
2817     static std::once_flag g_once_flag;
2818     std::call_once(g_once_flag,  []() {
2819         g_settings_sp_ptr = new TargetPropertiesSP(new TargetProperties(nullptr));
2820     });
2821     return *g_settings_sp_ptr;
2822 }
2823 
2824 Error
2825 Target::Install (ProcessLaunchInfo *launch_info)
2826 {
2827     Error error;
2828     PlatformSP platform_sp (GetPlatform());
2829     if (platform_sp)
2830     {
2831         if (platform_sp->IsRemote())
2832         {
2833             if (platform_sp->IsConnected())
2834             {
2835                 // Install all files that have an install path, and always install the
2836                 // main executable when connected to a remote platform
2837                 const ModuleList& modules = GetImages();
2838                 const size_t num_images = modules.GetSize();
2839                 for (size_t idx = 0; idx < num_images; ++idx)
2840                 {
2841                     const bool is_main_executable = idx == 0;
2842                     ModuleSP module_sp(modules.GetModuleAtIndex(idx));
2843                     if (module_sp)
2844                     {
2845                         FileSpec local_file (module_sp->GetFileSpec());
2846                         if (local_file)
2847                         {
2848                             FileSpec remote_file (module_sp->GetRemoteInstallFileSpec());
2849                             if (!remote_file)
2850                             {
2851                                 if (is_main_executable) // TODO: add setting for always installing main executable???
2852                                 {
2853                                     // Always install the main executable
2854                                     remote_file = platform_sp->GetRemoteWorkingDirectory();
2855                                     remote_file.AppendPathComponent(module_sp->GetFileSpec().GetFilename().GetCString());
2856                                 }
2857                             }
2858                             if (remote_file)
2859                             {
2860                                 error = platform_sp->Install(local_file, remote_file);
2861                                 if (error.Success())
2862                                 {
2863                                     module_sp->SetPlatformFileSpec(remote_file);
2864                                     if (is_main_executable)
2865                                     {
2866                                         platform_sp->SetFilePermissions(remote_file, 0700);
2867                                         if (launch_info)
2868                                             launch_info->SetExecutableFile(remote_file, false);
2869                                     }
2870                                 }
2871                                 else
2872                                     break;
2873                             }
2874                         }
2875                     }
2876                 }
2877             }
2878         }
2879     }
2880     return error;
2881 }
2882 
2883 bool
2884 Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id)
2885 {
2886     return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr);
2887 }
2888 
2889 bool
2890 Target::ResolveFileAddress (lldb::addr_t file_addr, Address &resolved_addr)
2891 {
2892     return m_images.ResolveFileAddress(file_addr, resolved_addr);
2893 }
2894 
2895 bool
2896 Target::SetSectionLoadAddress (const SectionSP &section_sp, addr_t new_section_load_addr, bool warn_multiple)
2897 {
2898     const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp);
2899     if (old_section_load_addr != new_section_load_addr)
2900     {
2901         uint32_t stop_id = 0;
2902         ProcessSP process_sp(GetProcessSP());
2903         if (process_sp)
2904             stop_id = process_sp->GetStopID();
2905         else
2906             stop_id = m_section_load_history.GetLastStopID();
2907         if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple))
2908             return true; // Return true if the section load address was changed...
2909     }
2910     return false; // Return false to indicate nothing changed
2911 }
2912 
2913 size_t
2914 Target::UnloadModuleSections (const ModuleList &module_list)
2915 {
2916     size_t section_unload_count = 0;
2917     size_t num_modules = module_list.GetSize();
2918     for (size_t i=0; i<num_modules; ++i)
2919     {
2920         section_unload_count += UnloadModuleSections (module_list.GetModuleAtIndex(i));
2921     }
2922     return section_unload_count;
2923 }
2924 
2925 size_t
2926 Target::UnloadModuleSections (const lldb::ModuleSP &module_sp)
2927 {
2928     uint32_t stop_id = 0;
2929     ProcessSP process_sp(GetProcessSP());
2930     if (process_sp)
2931         stop_id = process_sp->GetStopID();
2932     else
2933         stop_id = m_section_load_history.GetLastStopID();
2934     SectionList *sections = module_sp->GetSectionList();
2935     size_t section_unload_count = 0;
2936     if (sections)
2937     {
2938         const uint32_t num_sections = sections->GetNumSections(0);
2939         for (uint32_t i = 0; i < num_sections; ++i)
2940         {
2941             section_unload_count += m_section_load_history.SetSectionUnloaded(stop_id, sections->GetSectionAtIndex(i));
2942         }
2943     }
2944     return section_unload_count;
2945 }
2946 
2947 bool
2948 Target::SetSectionUnloaded (const lldb::SectionSP &section_sp)
2949 {
2950     uint32_t stop_id = 0;
2951     ProcessSP process_sp(GetProcessSP());
2952     if (process_sp)
2953         stop_id = process_sp->GetStopID();
2954     else
2955         stop_id = m_section_load_history.GetLastStopID();
2956     return m_section_load_history.SetSectionUnloaded (stop_id, section_sp);
2957 }
2958 
2959 bool
2960 Target::SetSectionUnloaded (const lldb::SectionSP &section_sp, addr_t load_addr)
2961 {
2962     uint32_t stop_id = 0;
2963     ProcessSP process_sp(GetProcessSP());
2964     if (process_sp)
2965         stop_id = process_sp->GetStopID();
2966     else
2967         stop_id = m_section_load_history.GetLastStopID();
2968     return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr);
2969 }
2970 
2971 void
2972 Target::ClearAllLoadedSections ()
2973 {
2974     m_section_load_history.Clear();
2975 }
2976 
2977 Error
2978 Target::Launch (ProcessLaunchInfo &launch_info, Stream *stream)
2979 {
2980     Error error;
2981     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET));
2982 
2983     if (log)
2984         log->Printf ("Target::%s() called for %s", __FUNCTION__, launch_info.GetExecutableFile().GetPath().c_str ());
2985 
2986     StateType state = eStateInvalid;
2987 
2988     // Scope to temporarily get the process state in case someone has manually
2989     // remotely connected already to a process and we can skip the platform
2990     // launching.
2991     {
2992         ProcessSP process_sp (GetProcessSP());
2993 
2994         if (process_sp)
2995         {
2996             state = process_sp->GetState();
2997             if (log)
2998                 log->Printf ("Target::%s the process exists, and its current state is %s", __FUNCTION__, StateAsCString (state));
2999         }
3000         else
3001         {
3002             if (log)
3003                 log->Printf ("Target::%s the process instance doesn't currently exist.", __FUNCTION__);
3004         }
3005     }
3006 
3007     launch_info.GetFlags().Set (eLaunchFlagDebug);
3008 
3009     // Get the value of synchronous execution here.  If you wait till after you have started to
3010     // run, then you could have hit a breakpoint, whose command might switch the value, and
3011     // then you'll pick up that incorrect value.
3012     Debugger &debugger = GetDebugger();
3013     const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous ();
3014 
3015     PlatformSP platform_sp (GetPlatform());
3016 
3017     // Finalize the file actions, and if none were given, default to opening
3018     // up a pseudo terminal
3019     const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false;
3020     if (log)
3021         log->Printf ("Target::%s have platform=%s, platform_sp->IsHost()=%s, default_to_use_pty=%s",
3022                      __FUNCTION__,
3023                      platform_sp ? "true" : "false",
3024                      platform_sp ? (platform_sp->IsHost () ? "true" : "false") : "n/a",
3025                      default_to_use_pty ? "true" : "false");
3026 
3027     launch_info.FinalizeFileActions (this, default_to_use_pty);
3028 
3029     if (state == eStateConnected)
3030     {
3031         if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY))
3032         {
3033             error.SetErrorString("can't launch in tty when launching through a remote connection");
3034             return error;
3035         }
3036     }
3037 
3038     if (!launch_info.GetArchitecture().IsValid())
3039         launch_info.GetArchitecture() = GetArchitecture();
3040 
3041     // If we're not already connected to the process, and if we have a platform that can launch a process for debugging, go ahead and do that here.
3042     if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ())
3043     {
3044         if (log)
3045             log->Printf ("Target::%s asking the platform to debug the process", __FUNCTION__);
3046 
3047         // Get a weak pointer to the previous process if we have one
3048         ProcessWP process_wp;
3049         if (m_process_sp)
3050             process_wp = m_process_sp;
3051         m_process_sp = GetPlatform()->DebugProcess (launch_info,
3052                                                     debugger,
3053                                                     this,
3054                                                     error);
3055 
3056         // Cleanup the old process since someone might still have a strong
3057         // reference to this process and we would like to allow it to cleanup
3058         // as much as it can without the object being destroyed. We try to
3059         // lock the shared pointer and if that works, then someone else still
3060         // has a strong reference to the process.
3061 
3062         ProcessSP old_process_sp(process_wp.lock());
3063         if (old_process_sp)
3064             old_process_sp->Finalize();
3065     }
3066     else
3067     {
3068         if (log)
3069             log->Printf ("Target::%s the platform doesn't know how to debug a process, getting a process plugin to do this for us.", __FUNCTION__);
3070 
3071         if (state == eStateConnected)
3072         {
3073             assert(m_process_sp);
3074         }
3075         else
3076         {
3077             // Use a Process plugin to construct the process.
3078             const char *plugin_name = launch_info.GetProcessPluginName();
3079             CreateProcess(launch_info.GetListenerForProcess(debugger), plugin_name, nullptr);
3080         }
3081 
3082         // Since we didn't have a platform launch the process, launch it here.
3083         if (m_process_sp)
3084             error = m_process_sp->Launch (launch_info);
3085     }
3086 
3087     if (!m_process_sp)
3088     {
3089         if (error.Success())
3090             error.SetErrorString("failed to launch or debug process");
3091         return error;
3092     }
3093 
3094     if (error.Success())
3095     {
3096         if (synchronous_execution || !launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
3097         {
3098             ListenerSP hijack_listener_sp (launch_info.GetHijackListener());
3099             if (!hijack_listener_sp)
3100             {
3101                 hijack_listener_sp = Listener::MakeListener("lldb.Target.Launch.hijack");
3102                 launch_info.SetHijackListener(hijack_listener_sp);
3103                 m_process_sp->HijackProcessEvents(hijack_listener_sp);
3104             }
3105 
3106             StateType state = m_process_sp->WaitForProcessToStop(nullptr, nullptr, false, hijack_listener_sp, nullptr);
3107 
3108             if (state == eStateStopped)
3109             {
3110                 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry))
3111                 {
3112                     if (synchronous_execution)
3113                     {
3114                         error = m_process_sp->PrivateResume();
3115                         if (error.Success())
3116                         {
3117                             state = m_process_sp->WaitForProcessToStop(nullptr, nullptr, true, hijack_listener_sp, stream);
3118                             const bool must_be_alive = false; // eStateExited is ok, so this must be false
3119                             if (!StateIsStoppedState(state, must_be_alive))
3120                             {
3121                                 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state));
3122                             }
3123                         }
3124                     }
3125                     else
3126                     {
3127                         m_process_sp->RestoreProcessEvents();
3128                         error = m_process_sp->PrivateResume();
3129                     }
3130                     if (!error.Success())
3131                     {
3132                         Error error2;
3133                         error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString());
3134                         error = error2;
3135                     }
3136                 }
3137             }
3138             else if (state == eStateExited)
3139             {
3140                 bool with_shell = !!launch_info.GetShell();
3141                 const int exit_status = m_process_sp->GetExitStatus();
3142                 const char *exit_desc = m_process_sp->GetExitDescription();
3143 #define LAUNCH_SHELL_MESSAGE "\n'r' and 'run' are aliases that default to launching through a shell.\nTry launching without going through a shell by using 'process launch'."
3144                 if (exit_desc && exit_desc[0])
3145                 {
3146                     if (with_shell)
3147                         error.SetErrorStringWithFormat ("process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, exit_status, exit_desc);
3148                     else
3149                         error.SetErrorStringWithFormat ("process exited with status %i (%s)", exit_status, exit_desc);
3150                 }
3151                 else
3152                 {
3153                     if (with_shell)
3154                         error.SetErrorStringWithFormat ("process exited with status %i" LAUNCH_SHELL_MESSAGE, exit_status);
3155                     else
3156                         error.SetErrorStringWithFormat ("process exited with status %i", exit_status);
3157                 }
3158             }
3159             else
3160             {
3161                 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state));
3162             }
3163         }
3164         m_process_sp->RestoreProcessEvents ();
3165     }
3166     else
3167     {
3168         Error error2;
3169         error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString());
3170         error = error2;
3171     }
3172     return error;
3173 }
3174 
3175 Error
3176 Target::Attach (ProcessAttachInfo &attach_info, Stream *stream)
3177 {
3178     auto state = eStateInvalid;
3179     auto process_sp = GetProcessSP ();
3180     if (process_sp)
3181     {
3182         state = process_sp->GetState ();
3183         if (process_sp->IsAlive () && state != eStateConnected)
3184         {
3185             if (state == eStateAttaching)
3186                 return Error ("process attach is in progress");
3187             return Error ("a process is already being debugged");
3188         }
3189     }
3190 
3191     const ModuleSP old_exec_module_sp = GetExecutableModule ();
3192 
3193     // If no process info was specified, then use the target executable
3194     // name as the process to attach to by default
3195     if (!attach_info.ProcessInfoSpecified ())
3196     {
3197         if (old_exec_module_sp)
3198             attach_info.GetExecutableFile ().GetFilename () = old_exec_module_sp->GetPlatformFileSpec ().GetFilename ();
3199 
3200         if (!attach_info.ProcessInfoSpecified ())
3201         {
3202             return Error ("no process specified, create a target with a file, or specify the --pid or --name");
3203         }
3204     }
3205 
3206     const auto platform_sp = GetDebugger ().GetPlatformList ().GetSelectedPlatform ();
3207     ListenerSP hijack_listener_sp;
3208     const bool async = attach_info.GetAsync();
3209     if (!async)
3210     {
3211         hijack_listener_sp = Listener::MakeListener("lldb.Target.Attach.attach.hijack");
3212         attach_info.SetHijackListener (hijack_listener_sp);
3213     }
3214 
3215     Error error;
3216     if (state != eStateConnected && platform_sp != nullptr && platform_sp->CanDebugProcess ())
3217     {
3218         SetPlatform (platform_sp);
3219         process_sp = platform_sp->Attach (attach_info, GetDebugger (), this, error);
3220     }
3221     else
3222     {
3223         if (state != eStateConnected)
3224         {
3225             const char *plugin_name = attach_info.GetProcessPluginName ();
3226             process_sp = CreateProcess (attach_info.GetListenerForProcess (GetDebugger ()), plugin_name, nullptr);
3227             if (process_sp == nullptr)
3228             {
3229                 error.SetErrorStringWithFormat ("failed to create process using plugin %s", (plugin_name) ? plugin_name : "null");
3230                 return error;
3231             }
3232         }
3233         if (hijack_listener_sp)
3234             process_sp->HijackProcessEvents (hijack_listener_sp);
3235         error = process_sp->Attach (attach_info);
3236     }
3237 
3238     if (error.Success () && process_sp)
3239     {
3240         if (async)
3241         {
3242             process_sp->RestoreProcessEvents ();
3243         }
3244         else
3245         {
3246             state = process_sp->WaitForProcessToStop (nullptr, nullptr, false, attach_info.GetHijackListener(), stream);
3247             process_sp->RestoreProcessEvents ();
3248 
3249             if (state != eStateStopped)
3250             {
3251                 const char *exit_desc = process_sp->GetExitDescription ();
3252                 if (exit_desc)
3253                     error.SetErrorStringWithFormat ("%s", exit_desc);
3254                 else
3255                     error.SetErrorString ("process did not stop (no such process or permission problem?)");
3256                 process_sp->Destroy (false);
3257             }
3258         }
3259     }
3260     return error;
3261 }
3262 
3263 //--------------------------------------------------------------
3264 // Target::StopHook
3265 //--------------------------------------------------------------
3266 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) :
3267         UserID (uid),
3268         m_target_sp (target_sp),
3269         m_commands (),
3270         m_specifier_sp (),
3271         m_thread_spec_ap(),
3272         m_active (true)
3273 {
3274 }
3275 
3276 Target::StopHook::StopHook (const StopHook &rhs) :
3277         UserID (rhs.GetID()),
3278         m_target_sp (rhs.m_target_sp),
3279         m_commands (rhs.m_commands),
3280         m_specifier_sp (rhs.m_specifier_sp),
3281         m_thread_spec_ap (),
3282         m_active (rhs.m_active)
3283 {
3284     if (rhs.m_thread_spec_ap)
3285         m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get()));
3286 }
3287 
3288 Target::StopHook::~StopHook() = default;
3289 
3290 void
3291 Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier)
3292 {
3293     m_specifier_sp.reset(specifier);
3294 }
3295 
3296 void
3297 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier)
3298 {
3299     m_thread_spec_ap.reset (specifier);
3300 }
3301 
3302 void
3303 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const
3304 {
3305     int indent_level = s->GetIndentLevel();
3306 
3307     s->SetIndentLevel(indent_level + 2);
3308 
3309     s->Printf ("Hook: %" PRIu64 "\n", GetID());
3310     if (m_active)
3311         s->Indent ("State: enabled\n");
3312     else
3313         s->Indent ("State: disabled\n");
3314 
3315     if (m_specifier_sp)
3316     {
3317         s->Indent();
3318         s->PutCString ("Specifier:\n");
3319         s->SetIndentLevel (indent_level + 4);
3320         m_specifier_sp->GetDescription (s, level);
3321         s->SetIndentLevel (indent_level + 2);
3322     }
3323 
3324     if (m_thread_spec_ap)
3325     {
3326         StreamString tmp;
3327         s->Indent("Thread:\n");
3328         m_thread_spec_ap->GetDescription (&tmp, level);
3329         s->SetIndentLevel (indent_level + 4);
3330         s->Indent (tmp.GetData());
3331         s->PutCString ("\n");
3332         s->SetIndentLevel (indent_level + 2);
3333     }
3334 
3335     s->Indent ("Commands: \n");
3336     s->SetIndentLevel (indent_level + 4);
3337     uint32_t num_commands = m_commands.GetSize();
3338     for (uint32_t i = 0; i < num_commands; i++)
3339     {
3340         s->Indent(m_commands.GetStringAtIndex(i));
3341         s->PutCString ("\n");
3342     }
3343     s->SetIndentLevel (indent_level);
3344 }
3345 
3346 //--------------------------------------------------------------
3347 // class TargetProperties
3348 //--------------------------------------------------------------
3349 
3350 OptionEnumValueElement
3351 lldb_private::g_dynamic_value_types[] =
3352 {
3353     { eNoDynamicValues,      "no-dynamic-values", "Don't calculate the dynamic type of values"},
3354     { eDynamicCanRunTarget,  "run-target",        "Calculate the dynamic type of values even if you have to run the target."},
3355     { eDynamicDontRunTarget, "no-run-target",     "Calculate the dynamic type of values, but don't run the target."},
3356     { 0, nullptr, nullptr }
3357 };
3358 
3359 static OptionEnumValueElement
3360 g_inline_breakpoint_enums[] =
3361 {
3362     { eInlineBreakpointsNever,   "never",     "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."},
3363     { eInlineBreakpointsHeaders, "headers",   "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."},
3364     { eInlineBreakpointsAlways,  "always",    "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."},
3365     { 0, nullptr, nullptr }
3366 };
3367 
3368 typedef enum x86DisassemblyFlavor
3369 {
3370     eX86DisFlavorDefault,
3371     eX86DisFlavorIntel,
3372     eX86DisFlavorATT
3373 } x86DisassemblyFlavor;
3374 
3375 static OptionEnumValueElement
3376 g_x86_dis_flavor_value_types[] =
3377 {
3378     { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."},
3379     { eX86DisFlavorIntel,   "intel",   "Intel disassembler flavor."},
3380     { eX86DisFlavorATT,     "att",     "AT&T disassembler flavor."},
3381     { 0, nullptr, nullptr }
3382 };
3383 
3384 static OptionEnumValueElement
3385 g_hex_immediate_style_values[] =
3386 {
3387     { Disassembler::eHexStyleC,        "c",      "C-style (0xffff)."},
3388     { Disassembler::eHexStyleAsm,      "asm",    "Asm-style (0ffffh)."},
3389     { 0, nullptr, nullptr }
3390 };
3391 
3392 static OptionEnumValueElement
3393 g_load_script_from_sym_file_values[] =
3394 {
3395     { eLoadScriptFromSymFileTrue,    "true",    "Load debug scripts inside symbol files"},
3396     { eLoadScriptFromSymFileFalse,   "false",   "Do not load debug scripts inside symbol files."},
3397     { eLoadScriptFromSymFileWarn,    "warn",    "Warn about debug scripts inside symbol files but do not load them."},
3398     { 0, nullptr, nullptr }
3399 };
3400 
3401 static OptionEnumValueElement
3402 g_load_current_working_dir_lldbinit_values[] =
3403 {
3404     { eLoadCWDlldbinitTrue,    "true",    "Load .lldbinit files from current directory"},
3405     { eLoadCWDlldbinitFalse,   "false",   "Do not load .lldbinit files from current directory"},
3406     { eLoadCWDlldbinitWarn,    "warn",    "Warn about loading .lldbinit files from current directory"},
3407     { 0, nullptr, nullptr }
3408 };
3409 
3410 static OptionEnumValueElement
3411 g_memory_module_load_level_values[] =
3412 {
3413     { eMemoryModuleLoadLevelMinimal,  "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."},
3414     { eMemoryModuleLoadLevelPartial,  "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."},
3415     { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."},
3416     { 0, nullptr, nullptr }
3417 };
3418 
3419 static PropertyDefinition
3420 g_properties[] =
3421 {
3422     { "default-arch"                       , OptionValue::eTypeArch      , true , 0                         , nullptr, nullptr, "Default architecture to choose, when there's a choice." },
3423     { "move-to-nearest-code"               , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Move breakpoints to nearest code." },
3424     { "language"                           , OptionValue::eTypeLanguage  , false, eLanguageTypeUnknown      , nullptr, nullptr, "The language to use when interpreting expressions entered in commands." },
3425     { "expr-prefix"                        , OptionValue::eTypeFileSpec  , false, 0                         , nullptr, nullptr, "Path to a file containing expressions to be prepended to all expressions." },
3426     { "prefer-dynamic-value"               , OptionValue::eTypeEnum      , false, eDynamicDontRunTarget     , nullptr, g_dynamic_value_types, "Should printed values be shown as their dynamic value." },
3427     { "enable-synthetic-value"             , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Should synthetic values be used by default whenever available." },
3428     { "skip-prologue"                      , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Skip function prologues when setting breakpoints by name." },
3429     { "source-map"                         , OptionValue::eTypePathMap   , false, 0                         , nullptr, nullptr, "Source path remappings are used to track the change of location between a source file when built, and "
3430       "where it exists on the current system.  It consists of an array of duples, the first element of each duple is "
3431       "some part (starting at the root) of the path to the file when it was built, "
3432       "and the second is where the remainder of the original build hierarchy is rooted on the local system.  "
3433       "Each element of the array is checked in order and the first one that results in a match wins." },
3434     { "exec-search-paths"                  , OptionValue::eTypeFileSpecList, false, 0                       , nullptr, nullptr, "Executable search paths to use when locating executable files whose paths don't match the local file system." },
3435     { "debug-file-search-paths"            , OptionValue::eTypeFileSpecList, false, 0                       , nullptr, nullptr, "List of directories to be searched when locating debug symbol files." },
3436     { "clang-module-search-paths"          , OptionValue::eTypeFileSpecList, false, 0                       , nullptr, nullptr, "List of directories to be searched when locating modules for Clang." },
3437     { "auto-import-clang-modules"          , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Automatically load Clang modules referred to by the program." },
3438     { "auto-apply-fixits"                  , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Automatically apply fixit hints to expressions." },
3439     { "notify-about-fixits"                , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Print the fixed expression text." },
3440     { "max-children-count"                 , OptionValue::eTypeSInt64    , false, 256                       , nullptr, nullptr, "Maximum number of children to expand in any level of depth." },
3441     { "max-string-summary-length"          , OptionValue::eTypeSInt64    , false, 1024                      , nullptr, nullptr, "Maximum number of characters to show when using %s in summary strings." },
3442     { "max-memory-read-size"               , OptionValue::eTypeSInt64    , false, 1024                      , nullptr, nullptr, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
3443     { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Consult the platform module avoid list when setting non-module specific breakpoints." },
3444     { "arg0"                               , OptionValue::eTypeString    , false, 0                         , nullptr, nullptr, "The first argument passed to the program in the argument array which can be different from the executable itself." },
3445     { "run-args"                           , OptionValue::eTypeArgs      , false, 0                         , nullptr, nullptr, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." },
3446     { "env-vars"                           , OptionValue::eTypeDictionary, false, OptionValue::eTypeString  , nullptr, nullptr, "A list of all the environment variables to be passed to the executable's environment, and their values." },
3447     { "inherit-env"                        , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Inherit the environment from the process that is running LLDB." },
3448     { "input-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , nullptr, nullptr, "The file/path to be used by the executable program for reading its standard input." },
3449     { "output-path"                        , OptionValue::eTypeFileSpec  , false, 0                         , nullptr, nullptr, "The file/path to be used by the executable program for writing its standard output." },
3450     { "error-path"                         , OptionValue::eTypeFileSpec  , false, 0                         , nullptr, nullptr, "The file/path to be used by the executable program for writing its standard error." },
3451     { "detach-on-error"                    , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "debugserver will detach (rather than killing) a process if it loses connection with lldb." },
3452     { "disable-aslr"                       , OptionValue::eTypeBoolean   , false, true                      , nullptr, nullptr, "Disable Address Space Layout Randomization (ASLR)" },
3453     { "disable-stdio"                      , OptionValue::eTypeBoolean   , false, false                     , nullptr, nullptr, "Disable stdin/stdout for process (e.g. for a GUI application)" },
3454     { "inline-breakpoint-strategy"         , OptionValue::eTypeEnum      , false, eInlineBreakpointsAlways  , nullptr, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. "
3455         "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. "
3456         "Usually this is limited to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. "
3457         "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. "
3458         "Always checking for inlined breakpoint locations can be expensive (memory and time), so if you have a project with many headers "
3459         "and find that setting breakpoints is slow, then you can change this setting to headers. "
3460         "This setting allows you to control exactly which strategy is used when setting "
3461         "file and line breakpoints." },
3462     // FIXME: This is the wrong way to do per-architecture settings, but we don't have a general per architecture settings system in place yet.
3463     { "x86-disassembly-flavor"             , OptionValue::eTypeEnum      , false, eX86DisFlavorDefault,       nullptr, g_x86_dis_flavor_value_types, "The default disassembly flavor to use for x86 or x86-64 targets." },
3464     { "use-hex-immediates"                 , OptionValue::eTypeBoolean   , false, true,                       nullptr, nullptr, "Show immediates in disassembly as hexadecimal." },
3465     { "hex-immediate-style"                , OptionValue::eTypeEnum   ,    false, Disassembler::eHexStyleC,   nullptr, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." },
3466     { "use-fast-stepping"                  , OptionValue::eTypeBoolean   , false, true,                       nullptr, nullptr, "Use a fast stepping algorithm based on running from branch to branch rather than instruction single-stepping." },
3467     { "load-script-from-symbol-file"       , OptionValue::eTypeEnum   ,    false, eLoadScriptFromSymFileWarn, nullptr, g_load_script_from_sym_file_values, "Allow LLDB to load scripting resources embedded in symbol files when available." },
3468     { "load-cwd-lldbinit"                  , OptionValue::eTypeEnum   ,    false, eLoadCWDlldbinitWarn,       nullptr, g_load_current_working_dir_lldbinit_values, "Allow LLDB to .lldbinit files from the current directory automatically." },
3469     { "memory-module-load-level"           , OptionValue::eTypeEnum   ,    false, eMemoryModuleLoadLevelComplete, nullptr, g_memory_module_load_level_values,
3470         "Loading modules from memory can be slow as reading the symbol tables and other data can take a long time depending on your connection to the debug target. "
3471         "This setting helps users control how much information gets loaded when loading modules from memory."
3472         "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). "
3473         "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). "
3474         "'minimal' is the fastest setting and will load section data with no symbols, but should rarely be used as stack frames in these memory regions will be inaccurate and not provide any context (fastest). " },
3475     { "display-expression-in-crashlogs"    , OptionValue::eTypeBoolean   , false, false,                      nullptr, nullptr, "Expressions that crash will show up in crash logs if the host system supports executable specific crash log strings and this setting is set to true." },
3476     { "trap-handler-names"                 , OptionValue::eTypeArray     , true,  OptionValue::eTypeString,   nullptr, nullptr, "A list of trap handler function names, e.g. a common Unix user process one is _sigtramp." },
3477     { "display-runtime-support-values"     , OptionValue::eTypeBoolean   , false, false,                      nullptr, nullptr, "If true, LLDB will show variables that are meant to support the operation of a language's runtime support." },
3478     { "non-stop-mode"                      , OptionValue::eTypeBoolean   , false, 0,                          nullptr, nullptr, "Disable lock-step debugging, instead control threads independently." },
3479     { nullptr                                 , OptionValue::eTypeInvalid   , false, 0                         , nullptr, nullptr, nullptr }
3480 };
3481 
3482 enum
3483 {
3484     ePropertyDefaultArch,
3485     ePropertyMoveToNearestCode,
3486     ePropertyLanguage,
3487     ePropertyExprPrefix,
3488     ePropertyPreferDynamic,
3489     ePropertyEnableSynthetic,
3490     ePropertySkipPrologue,
3491     ePropertySourceMap,
3492     ePropertyExecutableSearchPaths,
3493     ePropertyDebugFileSearchPaths,
3494     ePropertyClangModuleSearchPaths,
3495     ePropertyAutoImportClangModules,
3496     ePropertyAutoApplyFixIts,
3497     ePropertyNotifyAboutFixIts,
3498     ePropertyMaxChildrenCount,
3499     ePropertyMaxSummaryLength,
3500     ePropertyMaxMemReadSize,
3501     ePropertyBreakpointUseAvoidList,
3502     ePropertyArg0,
3503     ePropertyRunArgs,
3504     ePropertyEnvVars,
3505     ePropertyInheritEnv,
3506     ePropertyInputPath,
3507     ePropertyOutputPath,
3508     ePropertyErrorPath,
3509     ePropertyDetachOnError,
3510     ePropertyDisableASLR,
3511     ePropertyDisableSTDIO,
3512     ePropertyInlineStrategy,
3513     ePropertyDisassemblyFlavor,
3514     ePropertyUseHexImmediates,
3515     ePropertyHexImmediateStyle,
3516     ePropertyUseFastStepping,
3517     ePropertyLoadScriptFromSymbolFile,
3518     ePropertyLoadCWDlldbinitFile,
3519     ePropertyMemoryModuleLoadLevel,
3520     ePropertyDisplayExpressionsInCrashlogs,
3521     ePropertyTrapHandlerNames,
3522     ePropertyDisplayRuntimeSupportValues,
3523     ePropertyNonStopModeEnabled
3524 };
3525 
3526 class TargetOptionValueProperties : public OptionValueProperties
3527 {
3528 public:
3529     TargetOptionValueProperties (const ConstString &name) :
3530         OptionValueProperties (name),
3531         m_target(nullptr),
3532         m_got_host_env (false)
3533     {
3534     }
3535 
3536     // This constructor is used when creating TargetOptionValueProperties when it
3537     // is part of a new lldb_private::Target instance. It will copy all current
3538     // global property values as needed
3539     TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) :
3540         OptionValueProperties(*target_properties_sp->GetValueProperties()),
3541         m_target (target),
3542         m_got_host_env (false)
3543     {
3544     }
3545 
3546     const Property *
3547     GetPropertyAtIndex(const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const override
3548     {
3549         // When getting the value for a key from the target options, we will always
3550         // try and grab the setting from the current target if there is one. Else we just
3551         // use the one from this instance.
3552         if (idx == ePropertyEnvVars)
3553             GetHostEnvironmentIfNeeded ();
3554 
3555         if (exe_ctx)
3556         {
3557             Target *target = exe_ctx->GetTargetPtr();
3558             if (target)
3559             {
3560                 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get());
3561                 if (this != target_properties)
3562                     return target_properties->ProtectedGetPropertyAtIndex (idx);
3563             }
3564         }
3565         return ProtectedGetPropertyAtIndex (idx);
3566     }
3567 
3568     lldb::TargetSP
3569     GetTargetSP ()
3570     {
3571         return m_target->shared_from_this();
3572     }
3573 
3574 protected:
3575     void
3576     GetHostEnvironmentIfNeeded () const
3577     {
3578         if (!m_got_host_env)
3579         {
3580             if (m_target)
3581             {
3582                 m_got_host_env = true;
3583                 const uint32_t idx = ePropertyInheritEnv;
3584                 if (GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0))
3585                 {
3586                     PlatformSP platform_sp (m_target->GetPlatform());
3587                     if (platform_sp)
3588                     {
3589                         StringList env;
3590                         if (platform_sp->GetEnvironment(env))
3591                         {
3592                             OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary(nullptr, ePropertyEnvVars);
3593                             if (env_dict)
3594                             {
3595                                 const bool can_replace = false;
3596                                 const size_t envc = env.GetSize();
3597                                 for (size_t idx=0; idx<envc; idx++)
3598                                 {
3599                                     const char *env_entry = env.GetStringAtIndex (idx);
3600                                     if (env_entry)
3601                                     {
3602                                         const char *equal_pos = ::strchr(env_entry, '=');
3603                                         ConstString key;
3604                                         // It is ok to have environment variables with no values
3605                                         const char *value = nullptr;
3606                                         if (equal_pos)
3607                                         {
3608                                             key.SetCStringWithLength(env_entry, equal_pos - env_entry);
3609                                             if (equal_pos[1])
3610                                                 value = equal_pos + 1;
3611                                         }
3612                                         else
3613                                         {
3614                                             key.SetCString(env_entry);
3615                                         }
3616                                         // Don't allow existing keys to be replaced with ones we get from the platform environment
3617                                         env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace);
3618                                     }
3619                                 }
3620                             }
3621                         }
3622                     }
3623                 }
3624             }
3625         }
3626     }
3627     Target *m_target;
3628     mutable bool m_got_host_env;
3629 };
3630 
3631 //----------------------------------------------------------------------
3632 // TargetProperties
3633 //----------------------------------------------------------------------
3634 TargetProperties::TargetProperties (Target *target) :
3635     Properties (),
3636     m_launch_info ()
3637 {
3638     if (target)
3639     {
3640         m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties()));
3641 
3642         // Set callbacks to update launch_info whenever "settins set" updated any of these properties
3643         m_collection_sp->SetValueChangedCallback(ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this);
3644         m_collection_sp->SetValueChangedCallback(ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this);
3645         m_collection_sp->SetValueChangedCallback(ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this);
3646         m_collection_sp->SetValueChangedCallback(ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, this);
3647         m_collection_sp->SetValueChangedCallback(ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, this);
3648         m_collection_sp->SetValueChangedCallback(ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, this);
3649         m_collection_sp->SetValueChangedCallback(ePropertyDetachOnError, TargetProperties::DetachOnErrorValueChangedCallback, this);
3650         m_collection_sp->SetValueChangedCallback(ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, this);
3651         m_collection_sp->SetValueChangedCallback(ePropertyDisableSTDIO, TargetProperties::DisableSTDIOValueChangedCallback, this);
3652 
3653         // Update m_launch_info once it was created
3654         Arg0ValueChangedCallback(this, nullptr);
3655         RunArgsValueChangedCallback(this, nullptr);
3656         //EnvVarsValueChangedCallback(this, nullptr); // FIXME: cause segfault in Target::GetPlatform()
3657         InputPathValueChangedCallback(this, nullptr);
3658         OutputPathValueChangedCallback(this, nullptr);
3659         ErrorPathValueChangedCallback(this, nullptr);
3660         DetachOnErrorValueChangedCallback(this, nullptr);
3661         DisableASLRValueChangedCallback(this, nullptr);
3662         DisableSTDIOValueChangedCallback(this, nullptr);
3663     }
3664     else
3665     {
3666         m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target")));
3667         m_collection_sp->Initialize(g_properties);
3668         m_collection_sp->AppendProperty(ConstString("process"),
3669                                         ConstString("Settings specify to processes."),
3670                                         true,
3671                                         Process::GetGlobalProperties()->GetValueProperties());
3672     }
3673 }
3674 
3675 TargetProperties::~TargetProperties() = default;
3676 
3677 ArchSpec
3678 TargetProperties::GetDefaultArchitecture () const
3679 {
3680     OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(nullptr, ePropertyDefaultArch);
3681     if (value)
3682         return value->GetCurrentValue();
3683     return ArchSpec();
3684 }
3685 
3686 void
3687 TargetProperties::SetDefaultArchitecture (const ArchSpec& arch)
3688 {
3689     OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch(nullptr, ePropertyDefaultArch);
3690     if (value)
3691         return value->SetCurrentValue(arch, true);
3692 }
3693 
3694 bool
3695 TargetProperties::GetMoveToNearestCode() const
3696 {
3697     const uint32_t idx = ePropertyMoveToNearestCode;
3698     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3699 }
3700 
3701 lldb::DynamicValueType
3702 TargetProperties::GetPreferDynamicValue() const
3703 {
3704     const uint32_t idx = ePropertyPreferDynamic;
3705     return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
3706 }
3707 
3708 bool
3709 TargetProperties::SetPreferDynamicValue (lldb::DynamicValueType d)
3710 {
3711     const uint32_t idx = ePropertyPreferDynamic;
3712     return m_collection_sp->SetPropertyAtIndexAsEnumeration(nullptr, idx, d);
3713 }
3714 
3715 bool
3716 TargetProperties::GetDisableASLR () const
3717 {
3718     const uint32_t idx = ePropertyDisableASLR;
3719     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3720 }
3721 
3722 void
3723 TargetProperties::SetDisableASLR (bool b)
3724 {
3725     const uint32_t idx = ePropertyDisableASLR;
3726     m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3727 }
3728 
3729 bool
3730 TargetProperties::GetDetachOnError () const
3731 {
3732     const uint32_t idx = ePropertyDetachOnError;
3733     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3734 }
3735 
3736 void
3737 TargetProperties::SetDetachOnError (bool b)
3738 {
3739     const uint32_t idx = ePropertyDetachOnError;
3740     m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3741 }
3742 
3743 bool
3744 TargetProperties::GetDisableSTDIO () const
3745 {
3746     const uint32_t idx = ePropertyDisableSTDIO;
3747     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3748 }
3749 
3750 void
3751 TargetProperties::SetDisableSTDIO (bool b)
3752 {
3753     const uint32_t idx = ePropertyDisableSTDIO;
3754     m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
3755 }
3756 
3757 const char *
3758 TargetProperties::GetDisassemblyFlavor () const
3759 {
3760     const uint32_t idx = ePropertyDisassemblyFlavor;
3761     const char *return_value;
3762 
3763     x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
3764     return_value = g_x86_dis_flavor_value_types[flavor_value].string_value;
3765     return return_value;
3766 }
3767 
3768 InlineStrategy
3769 TargetProperties::GetInlineStrategy () const
3770 {
3771     const uint32_t idx = ePropertyInlineStrategy;
3772     return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
3773 }
3774 
3775 const char *
3776 TargetProperties::GetArg0 () const
3777 {
3778     const uint32_t idx = ePropertyArg0;
3779     return m_collection_sp->GetPropertyAtIndexAsString(nullptr, idx, nullptr);
3780 }
3781 
3782 void
3783 TargetProperties::SetArg0 (const char *arg)
3784 {
3785     const uint32_t idx = ePropertyArg0;
3786     m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, arg);
3787     m_launch_info.SetArg0(arg);
3788 }
3789 
3790 bool
3791 TargetProperties::GetRunArguments (Args &args) const
3792 {
3793     const uint32_t idx = ePropertyRunArgs;
3794     return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
3795 }
3796 
3797 void
3798 TargetProperties::SetRunArguments (const Args &args)
3799 {
3800     const uint32_t idx = ePropertyRunArgs;
3801     m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
3802     m_launch_info.GetArguments() = args;
3803 }
3804 
3805 size_t
3806 TargetProperties::GetEnvironmentAsArgs (Args &env) const
3807 {
3808     const uint32_t idx = ePropertyEnvVars;
3809     return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, env);
3810 }
3811 
3812 void
3813 TargetProperties::SetEnvironmentFromArgs (const Args &env)
3814 {
3815     const uint32_t idx = ePropertyEnvVars;
3816     m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, env);
3817     m_launch_info.GetEnvironmentEntries() = env;
3818 }
3819 
3820 bool
3821 TargetProperties::GetSkipPrologue() const
3822 {
3823     const uint32_t idx = ePropertySkipPrologue;
3824     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3825 }
3826 
3827 PathMappingList &
3828 TargetProperties::GetSourcePathMap () const
3829 {
3830     const uint32_t idx = ePropertySourceMap;
3831     OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings(nullptr, false, idx);
3832     assert(option_value);
3833     return option_value->GetCurrentValue();
3834 }
3835 
3836 FileSpecList &
3837 TargetProperties::GetExecutableSearchPaths ()
3838 {
3839     const uint32_t idx = ePropertyExecutableSearchPaths;
3840     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, false, idx);
3841     assert(option_value);
3842     return option_value->GetCurrentValue();
3843 }
3844 
3845 FileSpecList &
3846 TargetProperties::GetDebugFileSearchPaths ()
3847 {
3848     const uint32_t idx = ePropertyDebugFileSearchPaths;
3849     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, false, idx);
3850     assert(option_value);
3851     return option_value->GetCurrentValue();
3852 }
3853 
3854 FileSpecList &
3855 TargetProperties::GetClangModuleSearchPaths ()
3856 {
3857     const uint32_t idx = ePropertyClangModuleSearchPaths;
3858     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, false, idx);
3859     assert(option_value);
3860     return option_value->GetCurrentValue();
3861 }
3862 
3863 bool
3864 TargetProperties::GetEnableAutoImportClangModules() const
3865 {
3866     const uint32_t idx = ePropertyAutoImportClangModules;
3867     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3868 }
3869 
3870 bool
3871 TargetProperties::GetEnableAutoApplyFixIts() const
3872 {
3873     const uint32_t idx = ePropertyAutoApplyFixIts;
3874     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3875 }
3876 
3877 bool
3878 TargetProperties::GetEnableNotifyAboutFixIts() const
3879 {
3880     const uint32_t idx = ePropertyNotifyAboutFixIts;
3881     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3882 }
3883 
3884 bool
3885 TargetProperties::GetEnableSyntheticValue () const
3886 {
3887     const uint32_t idx = ePropertyEnableSynthetic;
3888     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3889 }
3890 
3891 uint32_t
3892 TargetProperties::GetMaximumNumberOfChildrenToDisplay() const
3893 {
3894     const uint32_t idx = ePropertyMaxChildrenCount;
3895     return m_collection_sp->GetPropertyAtIndexAsSInt64(nullptr, idx, g_properties[idx].default_uint_value);
3896 }
3897 
3898 uint32_t
3899 TargetProperties::GetMaximumSizeOfStringSummary() const
3900 {
3901     const uint32_t idx = ePropertyMaxSummaryLength;
3902     return m_collection_sp->GetPropertyAtIndexAsSInt64(nullptr, idx, g_properties[idx].default_uint_value);
3903 }
3904 
3905 uint32_t
3906 TargetProperties::GetMaximumMemReadSize () const
3907 {
3908     const uint32_t idx = ePropertyMaxMemReadSize;
3909     return m_collection_sp->GetPropertyAtIndexAsSInt64(nullptr, idx, g_properties[idx].default_uint_value);
3910 }
3911 
3912 FileSpec
3913 TargetProperties::GetStandardInputPath () const
3914 {
3915     const uint32_t idx = ePropertyInputPath;
3916     return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3917 }
3918 
3919 void
3920 TargetProperties::SetStandardInputPath (const char *p)
3921 {
3922     const uint32_t idx = ePropertyInputPath;
3923     m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, p);
3924 }
3925 
3926 FileSpec
3927 TargetProperties::GetStandardOutputPath () const
3928 {
3929     const uint32_t idx = ePropertyOutputPath;
3930     return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3931 }
3932 
3933 void
3934 TargetProperties::SetStandardOutputPath (const char *p)
3935 {
3936     const uint32_t idx = ePropertyOutputPath;
3937     m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, p);
3938 }
3939 
3940 FileSpec
3941 TargetProperties::GetStandardErrorPath () const
3942 {
3943     const uint32_t idx = ePropertyErrorPath;
3944     return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx);
3945 }
3946 
3947 LanguageType
3948 TargetProperties::GetLanguage () const
3949 {
3950     OptionValueLanguage *value = m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage(nullptr, ePropertyLanguage);
3951     if (value)
3952         return value->GetCurrentValue();
3953     return LanguageType();
3954 }
3955 
3956 const char *
3957 TargetProperties::GetExpressionPrefixContentsAsCString ()
3958 {
3959     const uint32_t idx = ePropertyExprPrefix;
3960     OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(nullptr, false, idx);
3961     if (file)
3962     {
3963         const bool null_terminate = true;
3964         DataBufferSP data_sp(file->GetFileContents(null_terminate));
3965         if (data_sp)
3966             return (const char *) data_sp->GetBytes();
3967     }
3968     return nullptr;
3969 }
3970 
3971 void
3972 TargetProperties::SetStandardErrorPath (const char *p)
3973 {
3974     const uint32_t idx = ePropertyErrorPath;
3975     m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, p);
3976 }
3977 
3978 bool
3979 TargetProperties::GetBreakpointsConsultPlatformAvoidList ()
3980 {
3981     const uint32_t idx = ePropertyBreakpointUseAvoidList;
3982     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3983 }
3984 
3985 bool
3986 TargetProperties::GetUseHexImmediates () const
3987 {
3988     const uint32_t idx = ePropertyUseHexImmediates;
3989     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3990 }
3991 
3992 bool
3993 TargetProperties::GetUseFastStepping () const
3994 {
3995     const uint32_t idx = ePropertyUseFastStepping;
3996     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
3997 }
3998 
3999 bool
4000 TargetProperties::GetDisplayExpressionsInCrashlogs () const
4001 {
4002     const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs;
4003     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, g_properties[idx].default_uint_value != 0);
4004 }
4005 
4006 LoadScriptFromSymFile
4007 TargetProperties::GetLoadScriptFromSymbolFile () const
4008 {
4009     const uint32_t idx = ePropertyLoadScriptFromSymbolFile;
4010     return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
4011 }
4012 
4013 LoadCWDlldbinitFile
4014 TargetProperties::GetLoadCWDlldbinitFile () const
4015 {
4016     const uint32_t idx = ePropertyLoadCWDlldbinitFile;
4017     return (LoadCWDlldbinitFile) m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
4018 }
4019 
4020 Disassembler::HexImmediateStyle
4021 TargetProperties::GetHexImmediateStyle () const
4022 {
4023     const uint32_t idx = ePropertyHexImmediateStyle;
4024     return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
4025 }
4026 
4027 MemoryModuleLoadLevel
4028 TargetProperties::GetMemoryModuleLoadLevel() const
4029 {
4030     const uint32_t idx = ePropertyMemoryModuleLoadLevel;
4031     return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(nullptr, idx, g_properties[idx].default_uint_value);
4032 }
4033 
4034 bool
4035 TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const
4036 {
4037     const uint32_t idx = ePropertyTrapHandlerNames;
4038     return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args);
4039 }
4040 
4041 void
4042 TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args)
4043 {
4044     const uint32_t idx = ePropertyTrapHandlerNames;
4045     m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args);
4046 }
4047 
4048 bool
4049 TargetProperties::GetDisplayRuntimeSupportValues () const
4050 {
4051     const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
4052     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
4053 }
4054 
4055 void
4056 TargetProperties::SetDisplayRuntimeSupportValues (bool b)
4057 {
4058     const uint32_t idx = ePropertyDisplayRuntimeSupportValues;
4059     m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4060 }
4061 
4062 bool
4063 TargetProperties::GetNonStopModeEnabled () const
4064 {
4065     const uint32_t idx = ePropertyNonStopModeEnabled;
4066     return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false);
4067 }
4068 
4069 void
4070 TargetProperties::SetNonStopModeEnabled (bool b)
4071 {
4072     const uint32_t idx = ePropertyNonStopModeEnabled;
4073     m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b);
4074 }
4075 
4076 const ProcessLaunchInfo &
4077 TargetProperties::GetProcessLaunchInfo ()
4078 {
4079     m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work
4080     return m_launch_info;
4081 }
4082 
4083 void
4084 TargetProperties::SetProcessLaunchInfo(const ProcessLaunchInfo &launch_info)
4085 {
4086     m_launch_info = launch_info;
4087     SetArg0(launch_info.GetArg0());
4088     SetRunArguments(launch_info.GetArguments());
4089     SetEnvironmentFromArgs(launch_info.GetEnvironmentEntries());
4090     const FileAction *input_file_action = launch_info.GetFileActionForFD(STDIN_FILENO);
4091     if (input_file_action)
4092     {
4093         const char *input_path = input_file_action->GetPath();
4094         if (input_path)
4095             SetStandardInputPath(input_path);
4096     }
4097     const FileAction *output_file_action = launch_info.GetFileActionForFD(STDOUT_FILENO);
4098     if (output_file_action)
4099     {
4100         const char *output_path = output_file_action->GetPath();
4101         if (output_path)
4102             SetStandardOutputPath(output_path);
4103     }
4104     const FileAction *error_file_action = launch_info.GetFileActionForFD(STDERR_FILENO);
4105     if (error_file_action)
4106     {
4107         const char *error_path = error_file_action->GetPath();
4108         if (error_path)
4109             SetStandardErrorPath(error_path);
4110     }
4111     SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError));
4112     SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR));
4113     SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO));
4114 }
4115 
4116 void
4117 TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, OptionValue *)
4118 {
4119     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4120     this_->m_launch_info.SetArg0(this_->GetArg0());
4121 }
4122 
4123 void
4124 TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, OptionValue *)
4125 {
4126     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4127     Args args;
4128     if (this_->GetRunArguments(args))
4129         this_->m_launch_info.GetArguments() = args;
4130 }
4131 
4132 void
4133 TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, OptionValue *)
4134 {
4135     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4136     Args args;
4137     if (this_->GetEnvironmentAsArgs(args))
4138         this_->m_launch_info.GetEnvironmentEntries() = args;
4139 }
4140 
4141 void
4142 TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4143 {
4144     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4145     this_->m_launch_info.AppendOpenFileAction(STDIN_FILENO, this_->GetStandardInputPath(), true, false);
4146 }
4147 
4148 void
4149 TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4150 {
4151     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4152     this_->m_launch_info.AppendOpenFileAction(STDOUT_FILENO, this_->GetStandardOutputPath(), false, true);
4153 }
4154 
4155 void
4156 TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, OptionValue *)
4157 {
4158     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4159     this_->m_launch_info.AppendOpenFileAction(STDERR_FILENO, this_->GetStandardErrorPath(), false, true);
4160 }
4161 
4162 void
4163 TargetProperties::DetachOnErrorValueChangedCallback(void *target_property_ptr, OptionValue *)
4164 {
4165     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4166     if (this_->GetDetachOnError())
4167         this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError);
4168     else
4169         this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError);
4170 }
4171 
4172 void
4173 TargetProperties::DisableASLRValueChangedCallback(void *target_property_ptr, OptionValue *)
4174 {
4175     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4176     if (this_->GetDisableASLR())
4177         this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR);
4178     else
4179         this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR);
4180 }
4181 
4182 void
4183 TargetProperties::DisableSTDIOValueChangedCallback(void *target_property_ptr, OptionValue *)
4184 {
4185     TargetProperties *this_ = reinterpret_cast<TargetProperties *>(target_property_ptr);
4186     if (this_->GetDisableSTDIO())
4187         this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO);
4188     else
4189         this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO);
4190 }
4191 
4192 //----------------------------------------------------------------------
4193 // Target::TargetEventData
4194 //----------------------------------------------------------------------
4195 
4196 Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp) :
4197     EventData (),
4198     m_target_sp (target_sp),
4199     m_module_list ()
4200 {
4201 }
4202 
4203 Target::TargetEventData::TargetEventData (const lldb::TargetSP &target_sp, const ModuleList &module_list) :
4204     EventData (),
4205     m_target_sp (target_sp),
4206     m_module_list (module_list)
4207 {
4208 }
4209 
4210 Target::TargetEventData::~TargetEventData() = default;
4211 
4212 const ConstString &
4213 Target::TargetEventData::GetFlavorString ()
4214 {
4215     static ConstString g_flavor ("Target::TargetEventData");
4216     return g_flavor;
4217 }
4218 
4219 void
4220 Target::TargetEventData::Dump (Stream *s) const
4221 {
4222     for (size_t i = 0; i < m_module_list.GetSize(); ++i)
4223     {
4224         if (i != 0)
4225              *s << ", ";
4226         m_module_list.GetModuleAtIndex(i)->GetDescription(s, lldb::eDescriptionLevelBrief);
4227     }
4228 }
4229 
4230 const Target::TargetEventData *
4231 Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr)
4232 {
4233     if (event_ptr)
4234     {
4235         const EventData *event_data = event_ptr->GetData();
4236         if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString())
4237             return static_cast <const TargetEventData *> (event_ptr->GetData());
4238     }
4239     return nullptr;
4240 }
4241 
4242 TargetSP
4243 Target::TargetEventData::GetTargetFromEvent (const Event *event_ptr)
4244 {
4245     TargetSP target_sp;
4246     const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
4247     if (event_data)
4248         target_sp = event_data->m_target_sp;
4249     return target_sp;
4250 }
4251 
4252 ModuleList
4253 Target::TargetEventData::GetModuleListFromEvent (const Event *event_ptr)
4254 {
4255     ModuleList module_list;
4256     const TargetEventData *event_data = GetEventDataFromEvent (event_ptr);
4257     if (event_data)
4258         module_list = event_data->m_module_list;
4259     return module_list;
4260 }
4261