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