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